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

Loaded procedure executed twice for TFrame's descendant

我已经注册为组件 a TFrame 的后代 class 并且我注意到 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 组件的表单时。

Before TMyFrame.Create

Before TMyFrame.Loaded

After TMyFrame.Loaded

After TMyFrame.Create

Before TMyFrame.Loaded

After TMyFrame.Loaded

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

Before TMyFrame.Create

Before TMyFrame.Loaded

After TMyFrame.Loaded

After TMyFrame.Create

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

Before TMyFrame.Create

Before TMyFrame.Loaded

After TMyFrame.Loaded

After TMyFrame.Create

Before TMyFrame.Loaded

After TMyFrame.Loaded

为什么Loaded过程被执行了两次?如何避免这种情况?

此行为是设计好的。

Loaded

Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call.