изменение порядка инициализации модуля в Delphi - PullRequest
0 голосов
/ 30 августа 2018

Я использую Delphi XE7 для разработки 32-битных приложений для Windows.

Мое приложение содержит много модулей, в которых есть раздел инициализации. Сначала мне нужно инициализировать один конкретный раздел инициализации.

Можно ли установить приоритет? Я попытался написать раздел инициализации в файле dpr, но компилятор отклонил это.

Пожалуйста, помогите мне сначала выполнить определенный раздел инициализации. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Проще говоря, разделы инициализации выполняются в том порядке, в котором эти единицы введены в любых пунктах uses. Но это немного сложнее, чем из-за того, что инициализация модуля выполняется только после инициализации любых модулей, на которые этот модуль ссылается (где они еще не были инициализированы).

т.е. Дано:

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, объявив свой юнит еще раньше.

0 голосов
/ 30 августа 2018

Разделы инициализации выполняются в том порядке, в котором единицы отображаются в предложении uses.

Таким образом, вы можете сначала принудительно инициализировать свое подразделение, переместив его вверх в списке uses.

...