gpt4 book ai didi

delphi - 我可以保证在表单销毁后执行自定义完成代码吗?

转载 作者:行者123 更新时间:2023-12-03 15:19:59 25 4
gpt4 key购买 nike

我有一个包含许多表单的多线程应用程序,但我必须在创建表单之前实例化一些类并调用一些初始化内容。当然我必须执行相应的终结代码。

以下是 .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;

这里的问题是 finally block 内的代码在我的表单的 OnDestroy/析构函数之前执行。查看 Form 单元的 finalization 部分,这一点变得清晰起来:

finalization
if Application <> nil then DoneApplication;

并且 DoneApplication 调用 Application.DestroyComponents ,它有效地释放所有 Application 拥有的表单。

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

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

请注意:

  • 我不想使用 finalization block (在 .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。由于这显然是一个可执行文件,因此系统无论如何都会卸载它们。为什么需要这样做?

关于delphi - 我可以保证在表单销毁后执行自定义完成代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18722209/

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