我有一个主窗体,在运行时动态创建第二个窗体.调用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
....
Run Code Online (Sandbox Code Playgroud)
当主窗体DestroyComponents
从其内部调用时TComponent.Destroy
,所有拥有的组件都已被销毁.然后主窗体完成它的销毁过程,然后它也被破坏了.