初始化和终结的顺序是如何确定的?
How is the order of initialization and finalization determined?
我一直认为表单生命周期的正确顺序是 initialization -> Create -> OnCreate -> OnDestroy -> Destroy -> finalization
,这适用于以下代码。
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TUMain, UMain);
Application.Run;
然而当我稍作改变时...
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TUMain, UMain);
if 1 = 2 then
Application.Run;
然后 TUMain
顺序更改为 initialization -> Create -> OnCreate -> finalization -> OnDestroy -> Destroy
所以我想知道,确切的顺序是如何控制的,或者至少是什么导致了这种情况的变化?
如果您从不调用 Application.Run
,那么自动创建的表单(或使用 Application.CreateForm
创建的任何表单)将在 FinalizeUnits
中释放,而不是在主表单关闭时释放.
通常 Application.Run
分配调用 DoneApplication
的 ExitProc
- 这会枚举应用程序拥有的 windows 并在调用 FinalizeUnits
之前释放它们。如果未调用 Application.Run
,则不会分配 ExitProc
,并且在调用 FinalizeUnits
之前不会释放表单。
我一直认为表单生命周期的正确顺序是 initialization -> Create -> OnCreate -> OnDestroy -> Destroy -> finalization
,这适用于以下代码。
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TUMain, UMain);
Application.Run;
然而当我稍作改变时...
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TUMain, UMain);
if 1 = 2 then
Application.Run;
然后 TUMain
顺序更改为 initialization -> Create -> OnCreate -> finalization -> OnDestroy -> Destroy
所以我想知道,确切的顺序是如何控制的,或者至少是什么导致了这种情况的变化?
如果您从不调用 Application.Run
,那么自动创建的表单(或使用 Application.CreateForm
创建的任何表单)将在 FinalizeUnits
中释放,而不是在主表单关闭时释放.
通常 Application.Run
分配调用 DoneApplication
的 ExitProc
- 这会枚举应用程序拥有的 windows 并在调用 FinalizeUnits
之前释放它们。如果未调用 Application.Run
,则不会分配 ExitProc
,并且在调用 FinalizeUnits
之前不会释放表单。