forms - 为什么拥有的表单在所有者表单本身之后被销毁?

标签 forms delphi

我有一个主窗体,它在运行时动态创建第二个窗体。当调用 create 方法时,第二个窗体的所有者被设置为主窗体。当我关闭应用程序时,主窗体的 FormDestroy 会在第二个窗体的 FormDestroy 之前调用。

通常我会建议所有者销毁所有拥有的表单,然后销毁自己。

为什么表单销毁顺序是这样的?

最佳答案

  • 表单的 OnDestroy 事件由其 BeforeDestruction 方法触发。
  • 组件通过其析构函数销毁其拥有的组件。

BeforeDestruction 方法在析构函数之前执行,因此会在您观察到的行为之前执行。

在这种情况下,拥有的组件会先于其所有者被销毁。想象一下,情况正好相反。如果所有者首先被销毁,则拥有的组件列表将被销毁,并且无法销毁拥有的组件。

让您感到困惑的是,当所有者开始销毁过程时,在它到达销毁任何拥有的组件之前会发生许多事情。其中之一就是触发自己的 OnDestroy 事件。

主窗体销毁的调用树看起来有点像这样:

TMainForm.BeforeDestruction
  TCustomForm.BeforeDestruction
    TCustomForm.DoDestroy
      TMainForm.FormDestroy  --> this is your main form's OnDestroy event handler
TMainForm.Destroy
TForm.Destroy
....
TComponent.Destroy
  DestroyComponents;         --> owned components are destroyed here
....

当主窗体从其 TComponent.Destroy 内部调用 DestroyComponents 时,所有拥有的组件都已被销毁。然后主窗体完成了它的销毁过程,然后它也被销毁了。

关于forms - 为什么拥有的表单在所有者表单本身之后被销毁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27381236/

相关文章:

javascript - 如何禁用默认浏览器自动完成功能?

multithreading - 在线程中使用这段代码有什么问题吗? (德尔福)

delphi - 未找到 rtl90.bpl,如何将其包含在我的 Delphi 2005 win 32 位应用程序中?

delphi - 如何在 Delphi 2010 中使用 IFont 和 IStrings?

html - 将文本输入框对齐到 div 的右侧

javascript - 打开电子邮件客户端并使用 PHP/JavaScript 提交表单

javascript - 清理变量并将 php 代码与表单的 Jquery 验证集成

css - WordPress 搜索输入字段样式不正确

android - 录制到 wav 文件

delphi - TForm 上的 RTTI GetFields 和 GetAttributes