大家都知道,TPageControl在设计时可手动添加每一页,我现在要求在每一页中再增加一个关闭按钮,主要是用来关闭PAGE[ITEMINDEX],并且是做成控件,其实也看了下源码,感觉晕晕的,要加的那段居然是私有的,可能是自己太弱了,还请各位给予指点,不胜感激,多谢了,其实也没太大作用,就是客户有这要求,没办法,双击关闭不是挺好的嘛,还要加个按钮,我看ULTRAEDIT也没这样做啊!多谢各位了!
解决方案 »
- 能否使DBNumberEditEh1.Value的值进行计算
- 0分帖赚分~~~
- delphi中如何编程调用sqlserver管理器的备份恢复功能的界面来实现备份恢复功能
- 求<串口通信编程>电子书
- 求教:c语言的结构类型改成delphi记录类型
- 关于StringGrid的控制
- 为什么我的程序在运行过程中会突然找不到打印机?(QuickReport),在线等待!!!急急
- 打印图像,为什么会有时空白?--- 你还可以输入80个字符
- 如何判断点击菜单项的是左键还是右键?
- 怎样做到每隔10秒打开一个指定的文件?
- how can I use the date which in one table to change other tables
- 复杂SQL问题,求救!!!
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的位置对不准,呵呵,没有细研究,将就着用吧。
unit Unit1;interfaceuses
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.
另外:linzhengqun(风。我回来了) :我试了一下,再做删除每页的时候,把最后一页删除完后那个PAGECONTROL上还有个按钮,但是TABSHEET已经删除完了,不过运行的时候看不到,我想可能是这个原因吧,在CREATE的时候,就创建了,然后每加一个TABSHEET会加一个,就是说有TABSHEET+1个,是不?不知道我说的对不对?我想修改不知道怎么改?谢谢了,再帮我看一下,回头就结贴,另再给你50分,肯定不会失言的,因为毕竟以后还要相互学习呢,是吧,多谢了
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:=....关闭