gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:57:01 27 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

即鉴于:

program Foo;

uses
Unit1,
Unit2,
Unit3;
<小时/>
unit Unit1;

interface

uses
Unit3;

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

Unit3
Unit1
Unit2

这是因为 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;

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

关于delphi - 更改Delphi中单元的初始化顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52103407/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com