PageControl抬头加关闭按钮

dd_zhouqian 2006-07-17 08:06:36
大家都知道,TPageControl在设计时可手动添加每一页,我现在要求在每一页中再增加一个关闭按钮,主要是用来关闭PAGE[ITEMINDEX],并且是做成控件,其实也看了下源码,感觉晕晕的,要加的那段居然是私有的,可能是自己太弱了,还请各位给予指点,不胜感激,多谢了,其实也没太大作用,就是客户有这要求,没办法,双击关闭不是挺好的嘛,还要加个按钮,我看ULTRAEDIT也没这样做啊!多谢各位了!
...全文
1588 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
天涯倦客 2006-07-22
  • 打赏
  • 举报
回复
var
Tabarr:array of TTabSheet;
btnarr:array of TButton;

----new
SetLength(Tabarr, Length(Tabarr)+1);
Tabarr[Length(Tabarr)-1]:=TTabSheet.Create(Self);
Tabarr[Length(Tabarr)-1].Name:='TabArr'+inttostr(Length(Tabarr));
Tabarr[Length(Tabarr)-1].PageControl:=PageControl1;

SetLength(btnarr, Length(btnarr)+1);
btnarr[Length(btnarr)-1]:=TButton.Create(Self);
btnarr[Length(btnarr)-1].Name:='btnarr'+inttostr(Length(btnarr));
btnarr[Length(btnarr)-1].Parent:=Tabarr[Length(Tabarr)-1];
btnarr[Length(btnarr)-1].OnClick:=....关闭
dd_zhouqian 2006-07-22
  • 打赏
  • 举报
回复
结贴,多谢了
dd_zhouqian 2006-07-22
  • 打赏
  • 举报
回复
结贴啊
linzhengqun 2006-07-20
  • 打赏
  • 举报
回复
我没有装成控件去调试,所以不能考虑到很周到,
实际上按钮只有一个,就在活动的页面上,其他的都是画出来的。
你再看看人代码,然后改一下吧。
dd_zhouqian 2006-07-20
  • 打赏
  • 举报
回复
真的是非常感谢大家,特别是linzhengqun(风。我回来了) :你的代码我已经测试了,不过不是很懂,只能是自己看了,我刚学写控件,其实也没办法,刚换的工作,需要做这个,我以前没做过,希望以后还请各位多多支持.
另外:linzhengqun(风。我回来了) :我试了一下,再做删除每页的时候,把最后一页删除完后那个PAGECONTROL上还有个按钮,但是TABSHEET已经删除完了,不过运行的时候看不到,我想可能是这个原因吧,在CREATE的时候,就创建了,然后每加一个TABSHEET会加一个,就是说有TABSHEET+1个,是不?不知道我说的对不对?我想修改不知道怎么改?谢谢了,再帮我看一下,回头就结贴,另再给你50分,肯定不会失言的,因为毕竟以后还要相互学习呢,是吧,多谢了
linzhengqun 2006-07-20
  • 打赏
  • 举报
回复
请参考如下代码,并稍作修改
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, CommCtrl, Buttons, StdCtrls;

type
TPageControlEx = class(TPageControl)
private
FCloseBtn: TSpeedButton;
protected
procedure CloseBtnClick(Sender: TObject);
procedure DrawTab(TabIndex: Integer; const Rect: TRect;
Active: Boolean); override;
property OwnerDraw;
property OnDrawTab;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
end;

TForm1 = class(TForm)
btnAddBtn: TButton;
procedure btnAddBtnClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
PC: TPageControlEx;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TPageControlEx }

procedure TPageControlEx.CloseBtnClick(Sender: TObject);
begin
if Self.ActivePage <> nil then
Self.ActivePage.Free;
if Self.ActivePage = nil then
FCloseBtn.Hide;
end;

constructor TPageControlEx.Create(AOwner: TComponent);
begin
inherited;
FCloseBtn := TSpeedButton.Create(Self);
FCloseBtn.Flat := True;
FCloseBtn.Width := 16;
FCloseBtn.Height := 16;
FCloseBtn.Caption := 'X';
FCloseBtn.OnClick := CloseBtnClick;
OwnerDraw := True;
end;

destructor TPageControlEx.Destroy;
begin
FCloseBtn.Free;
inherited;
end;

procedure TPageControlEx.DrawTab(TabIndex: Integer; const Rect: TRect;
Active: Boolean);
var
NewTabWidth: Integer;
R: TRect;
begin
inherited;
NewTabWidth := Canvas.TextWidth(Tabs[TabIndex]) + 24;
if (Rect.Right - Rect.Left) < NewTabWidth then
TabWidth := NewTabWidth;
TabCtrl_GetItemRect(Handle, TabIndex, R);
if Active then
begin
FCloseBtn.Parent := Self;
FCloseBtn.Left := Rect.Left + 2;
FCloseBtn.Top := Rect.Top + 2;
FCloseBtn.Show;
Canvas.TextOut(R.Left + 20, R.Top + 2, Tabs[TabIndex]);
end
else begin
Canvas.TextOut(R.Left + 2, R.Top + 2, 'X');
Canvas.TextOut(R.Left + 16, R.Top + 2, Tabs[TabIndex]);
end;
end;

procedure TForm1.btnAddBtnClick(Sender: TObject);
begin
with TTabSheet.Create(PC) do
begin
PageControl := PC;
Caption := 'hello world';
end;
with TTabSheet.Create(PC) do
begin
PageControl := PC;
Caption := '你好,世界';
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
PC := TPageControlEx.Create(Self);
PC.Parent := Self;
end;

end.
erhan 2006-07-19
  • 打赏
  • 举报
回复
我那个不行吗?而且那个带叉叉的按钮还可以跟着选中的tab来回走哈啊。
dd_zhouqian 2006-07-19
  • 打赏
  • 举报
回复
我试过raize,还是不行啊,那个不能分TAB控制啊,我要每个TAB上都有个按纽,行不?能实现吗?
dd_zhouqian 2006-07-19
  • 打赏
  • 举报
回复
是啊,我也想啊,关键客户是这个要求啊,可否给个思路啊?我只要思路,详细一点的
踢踏 2006-07-19
  • 打赏
  • 举报
回复
直接用双击来关闭吧,就不用做这么多事情了。
ron_xin 2006-07-19
  • 打赏
  • 举报
回复
Marks
dd_zhouqian 2006-07-19
  • 打赏
  • 举报
回复
求解决思路啊,各位可否给与提示啊?总觉得说了那么多,看了那么多,没到关键点上!郁闷啊
erhan 2006-07-18
  • 打赏
  • 举报
回复
抢分但不接分不蹭分,哈哈
erhan 2006-07-18
  • 打赏
  • 举报
回复
忙里偷闲,助人为乐。
分分不是太在意的哈,只是想能多帮助几个人而已。:P
andyzhou1101 2006-07-18
  • 打赏
  • 举报
回复
不会吧,有个可行的思路,剩下自己去实现吧,呵呵,偶也很忙的哈。


--------------------------------------------------
你也忙的啊???
总是见到你抢分..
:)
erhan 2006-07-18
  • 打赏
  • 举报
回复
不会吧,有个可行的思路,剩下自己去实现吧,呵呵,偶也很忙的哈。
dd_zhouqian 2006-07-18
  • 打赏
  • 举报
回复
TO erhan() :我要写成控件啊!写在哪啊?TPAGECONTROL是继承TCustomTabControl
erhan 2006-07-18
  • 打赏
  • 举报
回复
作个button9,它的caption写成一个x,把它的大小尽量调整到最小
procedure TForm1.PageControl1Change(Sender: TObject);
begin
Button9.Top := PageControl1.Top + PageControl1.TabRect(PageControl1.ActivePageIndex).Top;
Button9.Left := PageControl1.Left + PageControl1.TabRect(PageControl1.ActivePageIndex).Left;
end;

如果觉得button在点击后变得不太好看,可以换成别的点击前后没有外观变化的组件就可以了。
注意:
1.PageControl1需要把全部的TabSheet的caption都前导几个空格,这样关闭按钮不会挡住caption;
2.PageControl1的所有的TabSheet都能显示全,否则button的位置对不准,呵呵,没有细研究,将就着用吧。
CACACACACA 2006-07-17
  • 打赏
  • 举报
回复
没太明白按钮加在哪,是页头上还是页面上.ULTRAEDIT只是在ToolBar多加了一个按钮.好像是多页头似的.

5,390

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧