Есть ли место, где я могу добавить код, который будет выполняться перед инициализацией модуля?

Причина, по которой я хочу это сделать, заключается в том, что мне нужно изменить DecimalSeparator, это нужно сделать до инициализации некоторых модулей. Я поместил его в исходный код проекта до Application.Initialize, но к тому времени уже слишком поздно.

Насколько я понимаю, единственный выбор, который у меня есть, - это вставить его в инициализацию модуля, которому нужно изменить DecimalSeparator, так ли это?

Заранее благодарю за любой совет.

4
Alan Clark 28 Май 2010 в 02:28
1
Начиная с Delphi2006, все процедуры форматирования принимают необязательный параметр FormatSettings, где можно определить DecimalSeparator. Это сделает код детерминированным и поточно-ориентированным. См. Можно ли использовать DecimalSeparator, чтобы заставить функции Floattostr / Strtofloat использовать десятичную точку для получения дополнительной информации.
 – 
LU RD
22 Мар 2012 в 03:58

3 ответа

Лучший ответ

Порядок инициализации в Delphi детерминирован: модули инициализируются в том же порядке, в котором их скомпилировал компилятор, и завершаются в обратном порядке. Компилятор запускается с начала предложения DPR uses и работает вниз, и для каждой найденной единицы он делает то же самое рекурсивно: запускается с начала uses попробуйте скомпилировать каждый используемый модуль, который еще не скомпилирован, затем скомпилируйте текущий модуль. Поэтому, если вы можете вставить свой модуль до того, как любой другой будет скомпилирован, он будет инициализирован первым.

Если вы хотите убедиться, что он запускается первым, создайте новый модуль, внесите изменения в блок инициализации этого модуля, а затем убедитесь, что он попадает в DPR перед любым из модулей, которые будут зависеть от об изменениях. Возможно, вы даже захотите сделать его первым модулем, если у вас уже нет других модулей, которые «должны быть первыми», например, сменных менеджеров памяти.

15
Mason Wheeler 28 Май 2010 в 02:34
Так же, как и с FastMM, который всегда должен быть первым :)
 – 
Server Overflow
5 Июн 2020 в 14:56

Поместите его в раздел инициализации первого модуля в списке вашего проекта uses, таким образом он будет выполняться раньше любого другого кода initialization.

3
mghie 28 Май 2010 в 02:35

Слово предупреждения здесь.

У меня есть приложение, работающее на рабочем столе вошедшего в систему пользователя, и ПОСРЕДНИК тестирования приложения DecimalSeparator изменил для меня, без перезапуска приложения.

Раньше я устанавливал

DecimalSeparator := '.'; 

Один раз в коде FormCreate (), но этого, похоже, недостаточно. Итак, теперь я устанавливаю его каждый раз перед тем, как использовать функцию FormatFloat () (которая используется только в одном месте в моем приложении).

Я не знаю, ПОЧЕМУ это происходит, но, вероятно, происходят некоторые изменения общесистемных параметров, которые сбрасывают символ в ',' в моей системе.

Лучший способ избежать этого - это, вероятно, установить десятичный разделитель в конфигурации Windows на '.' чтобы избежать странных проблем ...

1
K.Sandell 28 Май 2010 в 14:35
5
Привет, K, на самом деле я думаю, что Application.UpdateFormatSettings предназначен для этой цели, чтобы он игнорировал глобальные изменения формата Windows.
 – 
Alan Clark
28 Май 2010 в 23:49
Хорошая точка зрения. Я не помнил этого. Установка его в FALSE должна предотвратить изменение любого приложения FormatSettings, когда в системе транслируется сообщение WM_WININICHANGE. Спасибо за подсказку!
 – 
K.Sandell
29 Май 2010 в 12:51