初始化和终结的顺序是如何确定的?

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 分配调用 DoneApplicationExitProc - 这会枚举应用程序拥有的 windows 并在调用 FinalizeUnits 之前释放它们。如果未调用 Application.Run,则不会分配 ExitProc,并且在调用 FinalizeUnits 之前不会释放表单。