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); 再往下,才是重写的内容

继承后重写的方法,没inherited完全重写,有inherited则inherited就是调用父类方法

 

posted @ 2022-07-12 17:18  一曲轻扬  阅读(1299)  评论(0)    收藏  举报