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

delphi – 我可以保证在表单销毁后执行自定义终结代码吗?

发布时间:2020-12-15 09:38:50 所属栏目:大数据 来源:网络整理
导读:我有一个多线程的应用程序有很多表单,但我必须实例化一些类,并在创建表单之前调用一些初始化的东西. 当然,我必须执行相应的终结代码. 这是.dpr文件的简化示例: begin // .dpr project file LoadDlls; try Config := TConfig.Create; try Application.Initia
我有一个多线程的应用程序有很多表单,但我必须实例化一些类,并在创建表单之前调用一些初始化的东西.
当然,我必须执行相应的终结代码.

这是.dpr文件的简化示例:

begin  // .dpr project file
  LoadDlls;
  try
    Config := TConfig.Create;
    try
      Application.Initialize;
      Application.Title := 'Foo';
      Application.CreateForm(TMainForm,MainForm);
      Application.CreateForm(TOtherForm,OtherForm);
      //...other forms...
      Application.Run;
    finally
      Config.Free;
    end;
  finally
    UnloadDlls;
  end;
end;

这里的问题是,在我的表单的OnDestroy /析构函数之前,finally块中的代码被执行.
这清楚地看着Form单元的最终部分:

finalization
  if Application <> nil then DoneApplication;

DoneApplication调用Application.DestroyComponents,它可以有效地释放所有应用程序拥有的表单.

因此,使用Application.CreateForm创建的表单将在主begin..end块中的任何代码之后被销毁.

我想要的是,在Application.Run之后,所有表单都被销毁,因此他们的OnDestroy事件处理程序可以看到我的dll中定义的Config对象和外部函数.同上,如果引发异常.
但是,如果Config.Free或UnlodDlls引发(应用程序必须仍然存在),我还希望有标准的Application异常处理.

注意:

>我不想使用终结块(可能在.dpr中吗?)来保持代码更清晰和可调试;
>目前,我不想更改太多代码(例如动态创建表单)

我认为最简单的解决方案是在Application.Run之后显式调用Application.DestroyComponents.你觉得有什么缺点吗?
有更优雅的解决方案吗?

谢谢

解决方法

实现目标的最简洁方法是控制表单的破坏.

Application需要拥有的唯一表单是您的主要表单.这需要是这样的,因为通过调用Application.CreateForm创建的第一个表单被指定为主表单.所以,我的建议是你应该进行一次调用,并且只调用一次Application.CreateForm来创建主窗体.对于所有其他表单,通过调用其构造函数来创建它们.让其他表格归主表格所有.当关闭时,销毁主表单,并让它采用所有拥有的表单.

您可以像这样编写.dpr代码:

begin 
  LoadDlls;
  try
    Config := TConfig.Create;
    try
      Application.Initialize;
      Application.Title := 'Foo';
      Application.CreateForm(TMainForm,MainForm);
      try
        OtherForm := TOtherForm.Create(MainForm);
        YetAnotherForm := TYetAnotherForm.Create(MainForm);
        Application.Run;
      finally
        FreeAndNil(MainForm); 
        // will destroy the other forms since they are owned by the main form
      end;
    finally
      Config.Free;
    end;
  finally
    UnloadDlls;
  end;
end;

另一个要点是,您可能不需要卸载DLL.由于这显然是可执行文件,因此无论如何系统都会卸载它们.你为什么需要这样做?

(编辑:李大同)

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

    推荐文章
      热点阅读