gpt4 book ai didi

delphi - 释放以 MainForm 作为所有者的表单是否是一个错误?

转载 作者:行者123 更新时间:2023-12-03 15:06:05 26 4
gpt4 key购买 nike

在我们现有的代码中,我们有很多这样的代码,其中以 MainForm 作为所有者(例如,而不是 nil)创建表单,但我们显式地释放它。

function SomeFunc(): Boolean;
var
form: TMyForm; // subclasses TForm
begin
with TMyForm.Create(Application.MainForm) do
try
ShowModal;
Exit(True);
finally
Free;
end
end;

这会导致任何形式的错误或崩溃吗,或者安全吗?

我似乎无法通过阅读文档来解决这个问题:

http://docwiki.embarcadero.com/Libraries/Berlin/en/System.Classes.TComponent.Owner

http://docwiki.embarcadero.com/Libraries/Berlin/en/System.Classes.TComponent.Create

最佳答案

看看源码你就可以自己回答这个问题了!

TForm 继承自 TComponent,如果我们查看 TComponent 的析构函数,我们会看到这一点(至少在 DelphiXE7 中):

destructor TComponent.Destroy;
begin
Destroying;
RemoveFreeNotifications;
DestroyComponents;
if FOwner <> nil then FOwner.RemoveComponent(Self);
FObservers.Free;
inherited Destroy;
end;

这里有两行重要的内容:

  • DestroyComponents

这将在所有者本身被销毁之前销毁所有拥有的组件。

  • if FOwner <> nil then FOwner.RemoveComponent(Self);

这会通知所有者他所拥有的对象不再存在,并且必须将其从所有者组件列表中删除。

因此,在您的情况下,Application.MainForm 将拥有您的 TMyForm 实例,但在销毁时,它将从主表单组件列表中消失。

长话短说,您的代码非常好,不会崩溃。但为了清楚地表明正在控制组件的生命周期,您应该在构造函数中传递nil作为Owner。正如 Sertac Akyuz 在评论中已经提到的,您将避免调用 FOwner.RemoveComponent(Self);这将节省一些 CPU 周期...

关于delphi - 释放以 MainForm 作为所有者的表单是否是一个错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41000672/

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