2

我已经注册为组件 aTFrame的后代类,我注意到该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 之后

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

在 TMyFrame.Create 之前

在 TMyFrame.Loaded 之前

在 TMyFrame.Loaded 之后

在 TMyFrame.Create 之后

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

在 TMyFrame.Create 之前

在 TMyFrame.Loaded 之前

在 TMyFrame.Loaded 之后

在 TMyFrame.Create 之后

在 TMyFrame.Loaded 之前

在 TMyFrame.Loaded 之后

为什么Loaded程序会执行两次?如何避免这种情况?

4

1 回答 1

7

此行为是按设计的。

已加载

可以在继承的表单上多次调用 Loaded。每次传入一个级别的继承时都会调用它。不要在重写的 Loaded 方法中分配内存,而不先检查内存是否在先前的调用中没有分配。

于 2017-06-13T09:37:32.820 回答