delphi - 单元初始化顺序与源代码中所示不符

标签 delphi delphi-xe4

我有一个项目,其中多个单元都有初始化部分。我想控制这些 block 的执行顺序。

根据以下question ,这基于单元的编译顺序,因此最终顺序应基于源 DPR 的 use 子句中单元的排列。

以下是我的项目的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.

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

How it should be |  How it actually is
                 | 
  1. uMain       |     1.uFooA
  2. uFooA       |     2.uFooB  
  3. uFooB       |     3.uMain

我很乐意提供 SSCCE,但我根本无法在新项目上重现此问题。

我尝试重新构建该项目,但没有成功。

我错过了什么?

最佳答案

尽管编译器有一种严格的方式来确定初始化,但当存在许多具有许多依赖性的单元时,人类很难准确地弄清楚和控制。

例如您的 DPR 可以使用 UnitA、UnitB、UnitC;,但如果 UnitA 依赖于 UnitB,则必须首先初始化 UnitB。

诚然,具有初始化最终化部分的单元功能可以使添加功能像“添加单元”一样简单。尽管这看起来很棒,但实际上,在大型项目中它往往会造成阻碍。我个人认为这个“功能”非常糟糕。

控制单元初始化顺序的最佳且最可靠的方法是明确地执行此操作。例如

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.

显然上面的代码缺乏适当的 try..finallys 并且会因为许多需要初始化的单元而变得困惑。但是,还可以应用其他技术来使事情变得易于管理。

关于delphi - 单元初始化顺序与源代码中所示不符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21184905/

相关文章:

delphi - 这是Delphi 2009中的错误吗?

visual-studio - 如果不在管理员模式下运行,则无法从注册表中读取 - HKEY_CLASSES_ROOT

c# - .net 类型在类型库中被 IUnknown 替换

delphi - 检测字符串是否包含 float ?

delphi - 如何更新 Delphi Datasnap 服务器?

delphi - 破坏形状关闭上的形状

delphi - 在类声明中使用自己的类作为类型参数约束

delphi - 根据其内容对 cxdbgrid 字段进行着色

delphi - 如何更改ListView OnDrag图像?

delphi - 如何使用 IHTTPNegotiate 添加额外的 http header ?