在Delphi中更改单元的初始化顺序

tes*_*345 6 delphi delphi-xe7

我正在使用Delphi XE7开发Windows 32位应用程序.

我的应用程序包含许多单元,它有一个初始化部分.我需要首先初始化一个特定的初始化部分.

是否可以设置优先级?我曾尝试在dpr文件中编写初始化部分,但编译器拒绝了这一点.

请帮我初步执行特定的初始化部分.提前致谢.

Del*_*ics 13

简单来说,初始化部分按照任何子uses句中引入单元的顺序执行.但它稍微复杂一点,因为单元的初始化在该单元自身引用的任何单元的初始化之后执行(它们尚未初始化).

即给定:

program Foo;

  uses
    Unit1,
    Unit2,
    Unit3;
Run Code Online (Sandbox Code Playgroud)
unit Unit1;

interface

  uses
    Unit3;
Run Code Online (Sandbox Code Playgroud)

然后单位初始化顺序为:

Unit3
Unit1
Unit2
Run Code Online (Sandbox Code Playgroud)

这是因为Unit1引入Unit3,所以即使Unit1dpr使用中首先列出Unit3,实际上是先初始化,然后是初始化Unit1.

如果您记得该initialization部分出现uses单元中的任何子句之后,那么它确实有意义.

因此,绝对确定任何一个单元在任何其他单元之前被初始化的唯一方法是首先在DPR uses子句中列出它,并且该单元不依赖于任何其他单元(除非那些单元不依赖于,否则干扰,执行初始化).

当然,它不一定是严格的第一.例如,如果您使用的是替换内存管理器(例如FastMM),那么这绝对需要成为dpr uses子句中列出的第一个单元.您只需要确保在任何其他(您的单位)之前需要初始化的单位然后列在可能带您的其他单位的任何其他单位之前:

program  Foo;

uses
  FastMM,            // MUST be first but won't bring any of 'my' units in, so this is OK

  SysUtils,          // These too are fine coming next because again they don't
  Forms,             // reference 'my' units

  MyInitUnit,        // <- This is where it is important to list 'my' guaranteed first/earliest
                     //     initialisated unit of all 'my' units

  MyFirstAppUnit,    // And now the rest ...
  etc;
Run Code Online (Sandbox Code Playgroud)

当然,如果你想首先初始化单元确实需要之前被初始化任何其他包括RTL单元(以同样的方式,FastMM等需要来定),那么你将需要反映在DPR uses通过声明列表中单位早些时候.


PA.*_*PA. 0

初始化部分按照单元在uses子句中出现的顺序执行。

因此,您可以通过在列表中向上移动您的设备来强制其首先初始化uses