Delphi 动态创建TpageControl标签 基于Frame
form1:

frame3:

效果图:可以基于frame3创建多个相同的tab,且包含所有frame3设定的业务逻辑

代码也很简单:
uses
Unit3;
procedure TForm2.Button2Click(Sender: TObject); var NewTab: TTabSheet ; frame: TFrame3; begin NewTab := TTabSheet.Create(PageControl1); NewTab.PageControl := PageControl1; NewTab.Caption := '流浪狗'; frame := TFrame3.Create(NewTab); frame.Parent := NewTab; frame.Align := alClient; end;
感谢大佬的指点,学到了个了不起的技能!
更新于2022-7-20:
frame是没有onCreate事件的。然后我们观察到 :
TFrame2 = class(TFrame) //没有create方法
private
{ Private declarations }
public
{ Public declarations }
end;
TFrame = class(TCustomFrame) //TFrame的父级TCustomFrame也没有create方法
//在TCustomFrame的父级TScrollingWinControl下找到了create方法
TCustomFrame = class(TScrollingWinControl)
protected
procedure CreateParams(var Params: TCreateParams); override;
procedure PaintWindow(DC: HDC); override;
procedure SetParent(AParent: TWinControl); override;
procedure ChangeScale(M, D: Integer; isDpiChange: Boolean); override;
public
constructor Create(AOwner: TComponent); override;
procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
end;
即原型链:
TFrame -> TCustomFrame -> TScrollingWinControl
而 TScrollingWinControl下是有 构造函数的:
constructor Create(AOwner:TComponent);override;
所以我们直接把这句话,抄到我们定义的frame里面,拿来用即可即可。
type TFrame2 = class(TFrame) private { Private declarations } public constructor Create(AOwner: TComponent); override; end;
override : 表示使用原型链上的方法,但是我要重写里面的内容。打个比方,爷爷的斧子,原规定是只能砍树,现在孙子把斧子接了过来,然后重新定义,这斧子现在可以拿来砍树,锤石头和砍骨头了。
按ctrl+shift+c生成框架代码:
constructor TFrame2.Create(AOwner: TComponent); begin // inherited; 原文是这一句,这里我们需要改成下面这句 inherited Create(AOwner); //执行原型链上的方法 //做你想做的事 end;
这里要注意:
一。TFrame基类和TFrame的所有子类,在声明时,都要引用 constructor Create(AOwner: TComponent); override; 这句话
二。TFrame基类和TFrame的所有子类,在写构造方法constructor xxx.Create(AOwner: TComponent) 时,begin下第一句必须是 inherited Create(AOwner); 再往下,才是重写的内容

浙公网安备 33010602011771号