为 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 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.
我已经注册为组件 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 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.