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

时间:2018-08-30 18:36:57

标签: delphi delphi-xe7

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

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

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

请首先帮助我执行特定的初始化部分。预先感谢。

2 个答案:

答案 0 :(得分:9)

简单来说,初始化部分按照在任何uses子句中引入单元的顺序执行。但是,由于仅在对该单元本身引用的任何单元进行初始化之后(尚未初始化)才执行该单元的初始化,因此它要复杂得多。< / p>

即鉴于:

program Foo;

  uses
    Unit1,
    Unit2,
    Unit3;

unit Unit1;

interface

  uses
    Unit3;

然后单元初始化顺序为:

Unit3
Unit1
Unit2

这是因为Unit1引入了Unit3,因此即使Unit1 dpr 用法中排在首位,实际上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列表中反映出来。

答案 1 :(得分:0)

初始化部分按照单元在def remove_bad_chars(string, chars): for char in chars: string = string.replace(char, '') return string 子句中出现的顺序执行。

因此,您可以通过在if 'feedbackreport' in remove_bad_chars(name, '.,?!\'-/:;()"\\~ ').lower() # included a white space in the string of bad characters 列表中向上移动单元来强制其首先进行初始化。