加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 免费使用MainForm作为所有者的表单是一个错误吗?

发布时间:2020-12-15 09:48:07 所属栏目:大数据 来源:网络整理
导读:在我们现有的代码中,我们有一堆这样的表单,其中使用MainForm作为所有者(而不是nil)创建表单,但我们明确地释放它. function SomeFunc(): Boolean;var form: TMyForm; // subclasses TFormbegin with TMyForm.Create(Application.MainForm) do try ShowModal;
在我们现有的代码中,我们有一堆这样的表单,其中使用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

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

>如果FOwner<> nil然后FOwner.RemoveComponent(Self);

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

所以在你的情况下,Application.MainForm将拥有你的TMyForm实例,但是在销毁时它将从主表单组件列表中消失.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读