单位初始化顺序不在源中指示

Pet*_*ter 2 delphi delphi-xe4

我有一个项目,其中多个单位有初始化部分.我想控制执行此块的顺序.

根据以下问题,这是基于单位编制的顺序,因此最终订单应基于源DPR的使用条款中的单位安排.

以下是我项目的DPR来源:

program X;

uses
  Vcl.Forms,
  uMain in 'uMain.pas' {MainForm},
  uFooA in 'uFooA.pas',
  uFooB in 'uFooB.pas';

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TMainForm, MainForm);
  Application.Run;

end.
Run Code Online (Sandbox Code Playgroud)

我的问题是,这根本不是初始化块的执行顺序.

How it should be |  How it actually is
                 | 
  1. uMain       |     1.uFooA
  2. uFooA       |     2.uFooB  
  3. uFooB       |     3.uMain
Run Code Online (Sandbox Code Playgroud)

我很想提供一个SSCCE,但我无法在一个新项目上重新产生这个问题.

我尝试重建项目但没有成功.

我错过了什么?

Dis*_*ned 5

即使编译器确定初始化有一种严格的方法,但是当有许多具有许多依赖性的单元时,人类很难准确地找出并控制它们.

例如,您的DPR可能会使用,UnitA, UnitB, UnitC;但如果UnitA有依赖关系,UnitB则必须首先初始化UnitB.

不可否认,具有初始化完成部分的单元的特征可以使添加功能像"添加单元"一样简单.虽然这看起来很棒,但实际上,在很大的项目中它往往会妨碍它.我个人认为这个"特征"非常可怕.

控制单元的inialisation序列的最佳和最可靠的方法是明确地这样做.例如

program X;

uses
  Vcl.Forms,
  uMain in 'uMain.pas' {MainForm},
  uFooA in 'uFooA.pas',
  uFooB in 'uFooB.pas';

{$R *.res}

begin
  Init_uMain;
  Init_uFooA;
  Init_uFooB;

  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TMainForm, MainForm);
  Application.Run;

  Finalise_uFooB;
  Finalise_uFooA;
  Finalise_uMain;
end.
Run Code Online (Sandbox Code Playgroud)

显然,上面的代码缺乏适当的try..finallys,并且会因许多需要初始化的单元而变得混乱.但是,还可以应用其他技术来保持可管理性.