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