Проще говоря, разделы инициализации выполняются в том порядке, в котором эти единицы введены в любых пунктах 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
, объявив свой юнит еще раньше.