为什么在拥有者自己形成之后,自有形式被摧毁?

时间:2014-12-09 14:25:08

标签: forms delphi

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

通常情况下,我会建议所有者销毁所有拥有的表格,之后会自行销毁。

为什么表单破坏顺序是这样的?

1 个答案:

答案 0 :(得分:9)

  • 表单的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
....

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