为TFrame的后代执行两次加载过程

时间:2017-06-13 07:53:01

标签: delphi components tframe

我已将TFrame的后代类注册为组件,我注意到Loaded过程执行了两次:

运行:

  TMyFrame = class(TFrame)
  private
  protected
    procedure Loaded(); override;
  public
    constructor Create(AOwner : TComponent); override;
  end;

constructor TMyFrame.Create(AOwner : TComponent);
begin
  ShowMessage('Before TMyFrame.Create');
  inherited Create(AOwner);
  ShowMessage('After TMyFrame.Create');
end;

procedure TMyFrame.Loaded();
begin
  ShowMessage('Before TMyFrame.Loaded');
  inherited;
  ShowMessage('After TMyFrame.Loaded');
end;

设计时:

procedure Register;
begin
  RegisterComponents('Test', [TMyFrame]);
end;

输出:

在运行时,创建一个有TMyFrame组件的表单。

  

在TMyFrame.Create之前

     

在TMyFrame.Loaded之前

     

TMyFrame.Loaded

之后      

TMyFrame.Create

之后      

在TMyFrame.Loaded之前

     

TMyFrame.Loaded

之后

在设计时,将TMyFrame添加到表单:

  

在TMyFrame.Create之前

     

在TMyFrame.Loaded之前

     

TMyFrame.Loaded

之后      

TMyFrame.Create

之后

在设计时,打开一个有TMyFrame组件的表单:

  

在TMyFrame.Create之前

     

在TMyFrame.Loaded之前

     

TMyFrame.Loaded

之后      

TMyFrame.Create

之后      

在TMyFrame.Loaded之前

     

TMyFrame.Loaded

之后

为什么Loaded过程执行两次?怎么避免这个?

1 个答案:

答案 0 :(得分:7)

此行为符合设计。

Loaded

  

在继承的表单上可以多次调用Loaded。它被称为   每次传入一个继承级别时。不要分配   重写的Loaded方法中的内存,而不首先检查   在之前的通话中尚未分配内存。