delphi – 我可以保证在表单销毁后执行自定义终结代码吗?
我有一个多线程的应用程序有很多表单,但我必须实例化一些类,并在创建表单之前调用一些初始化的东西.
当然,我必须执行相应的终结代码. 这是.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块中的代码被执行. finalization if Application <> nil then DoneApplication; DoneApplication调用Application.DestroyComponents,它可以有效地释放所有应用程序拥有的表单. 因此,使用Application.CreateForm创建的表单将在主begin..end块中的任何代码之后被销毁. 我想要的是,在Application.Run之后,所有表单都被销毁,因此他们的OnDestroy事件处理程序可以看到我的dll中定义的Config对象和外部函数.同上,如果引发异常. 注意: >我不想使用终结块(可能在.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.由于这显然是可执行文件,因此无论如何系统都会卸载它们.你为什么需要这样做? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |