我有一个包含许多表单的多线程应用程序,但我必须在创建表单之前实例化一些类并调用一些初始化的东西。当然我必须执行相应的终结代码。
这是 .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;
这里的问题是块内的代码在我的表单的/ sfinally之前执行。看看单元的部分就很清楚了:OnDestroydestructorfinalizationForm
finalization
if Application <> nil then DoneApplication;
并DoneApplication调用Application.DestroyComponents有效地释放了所有Application拥有的表单。
因此,使用创建的表单Application.CreateForm将在主begin..end块内的任何代码之后被销毁。
我想要的是在Application.Run所有表单都被销毁之后,以便它们的OnDestroy事件处理程序可以看到Config我的 dll 中定义的对象和外部函数。如果引发异常,则同上。但我也希望有标准应用程序的异常处理 ifConfig.Free或UnlodDllsraise (应用程序必须仍然存在)。
注意:
- 我不想使用
finalization块(在 .dpr 中是否可能?)以保持代码更清晰和可调试; - 目前,我不希望更改太多代码(例如动态创建表单)
我认为最简单的解决方案是显式调用Application.DestroyComponentsafter Application.Run。你觉得有什么缺点吗?有没有更优雅的解决方案?
谢谢