gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 13:14:12 25 4
gpt4 key购买 nike

我已将 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 组件的表单。

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.

关于delphi - 加载过程为 TFrame 的后代执行两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44515417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com