我有一个项目,其中多个单位有初始化部分.我想控制执行此块的顺序.
根据以下问题,这是基于单位编制的顺序,因此最终订单应基于源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,但我无法在一个新项目上重新产生这个问题.
我尝试重建项目但没有成功.
我错过了什么?
即使编译器确定初始化有一种严格的方法,但是当有许多具有许多依赖性的单元时,人类很难准确地找出并控制它们.
例如,您的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,并且会因许多需要初始化的单元而变得混乱.但是,还可以应用其他技术来保持可管理性.
| 归档时间: |
|
| 查看次数: |
618 次 |
| 最近记录: |