【问题标题】:changing the initialization order of the unit in Delphi在 Delphi 中更改单元的初始化顺序
【发布时间】:2018-08-30 18:36:57
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您无法控制initialization 部分的优先级。您唯一能做的就是重新排列uses 子句中的单位。确保“一个特定初始化部分”的单元在uses 列表中比其他单元更早,或者是dpr 文件中的第一个单元。
  • 您是否尝试过将设备放在 .Dpr 文件中的首位?而且,雷米说的。
  • 这通常很难控制,您可以考虑不依赖初始化顺序的解决方案。
  • 我最终添加了一个单元 IntializeFILF,它有两个方法 AssureFI 和 AddtoLF。 AssureFI 初始化诸如日志文件和跟踪单元之类的东西。所有其他初始化代码首先调用它并可选地将其终结添加到 AssureLF,此后没有进一步的问题..

标签: delphi delphi-xe7


【解决方案1】:

简单来说,初始化部分按照在任何uses 子句中引入单元的顺序执行。但它比这更复杂一点,因为一个单元的初始化仅在在该单元本身引用的任何单元初始化之后执行(它们尚未被初始化)。

即给定:

program Foo;

  uses
    Unit1,
    Unit2,
    Unit3;

unit Unit1;

interface

  uses
    Unit3;

那么单元初始化顺序将是:

Unit3
Unit1
Unit2

这是因为Unit1引入了Unit3,所以虽然Unit1dpr使用中列在最前面,但Unit3实际上是先初始化的,然后是@的初始化987654329@.

如果您记得initialization 部分出现在 单元中的任何uses 子句之后,那确实是有道理的。

因此,唯一确定任何一个单元在 any 其他单元之前被初始化的唯一方法是在 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;

当然,如果您希望首先初始化的单元确实需要在任何其他单元之前初始化,包括 RTL 单元(与 FastMM 等需要的方式相同)是)那么您需要在 dpr uses 列表中通过更早地声明您的单位来反映这一点。

【讨论】:

  • 但是如果我先添加该单元,那么该特定单元的使用也将首先启动,然后仅用于特定单元的初始化方法。
  • 答案正是如此。
【解决方案2】:

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

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

【讨论】:

  • 不一定按这个顺序。请参阅 Deltics 的回答。
  • 接口uses列表中的单元怎么样?实现一中的单元?
  • 我认为它的工作原理是这样的:所有单位都按“出现顺序”列出,并删除了重复项。然后,其他人所依赖的每个单元都列在第一个依赖它的单元之前。对所有单位进行检查。结果列表是初始化的顺序。
猜你喜欢
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多