Инициализация переменных "окружения" Delphi

HOME_X
Дата: 27.06.2019 12:06:36
Доброго дня господа !

Пробую обрисовать проблему
Windows - разделитель даты = . (точка)

Приложение созданное Delphi 7
В момент создания основного окна OnCreate инициализирую переменные "окружения" Delphi
разделитель даты = / (наклонная)
С этим значением переменной все прекрасно отрабатывает - проблем нет ......

Суть вопроса
Не закрывая приложение - выхожу из сеанса Windows (замечу это тонкий клиент сервера Win 12)
Через пару секунд вхожу в тот же сеанс - вижу свое незакрытое приложение - но !!!!
разделитель даты сказочным образом на системный . (точка) - ну соответственно полезли ошибки.

Почему так и какое событие использовать для устранения (OnShow ?)

Заранее благодарен !
kealon(Ruslan)
Дата: 27.06.2019 12:16:12
HOME_X,

наверное потому что он имплементирует системный разделитель, а вы ему периодически мешаете, но не всегда успеваете

Лучше исправить ошибки в программе, тем более обычно достаточно добавить нужный вам TFormatSettings к функциям преобразования
HOME_X
Дата: 27.06.2019 12:33:30
kealon(Ruslan),

Вы хотите сказать, что переменные "окружения" Delphi находятся в постоянном обновлении
и при активации сеанса закономерно изменяются, но приложение УЖЕ запущено....

А TFormatSettings - полагаете не подвержена такому воздействию ?
kealon(Ruslan)
Дата: 27.06.2019 12:41:11
HOME_X,

создайте просто свою локальную переменную этого типа и инициализируйте её как надо - её точно никто не тронет, большинство функций форматирования и деформатирования имеют вариант с использованием этой переменной в качестве параметра
Соколинский Борис
Дата: 27.06.2019 12:45:45
HOME_X
Почему так...
Видимо винда при пересоздании десктопа отсылает некое сообщение, которое воспринимается как необходимость переопределить переменные локали.

[quote HOME_X] Просто использовать два набора настроек - системный для экрана, и стандартный для файлов.
Кроик Семён
Дата: 27.06.2019 13:51:16
я преодолел проблему с неправильным форматом даты таким образом:

UNIT ...
   Uses Windows

IMPLEMENTATION
   //copied from JclWin32.pas
   function MAKELCID(LangId, SortId: WORD): DWORD;
   begin
      Result := (DWORD(SortId) shl 16) or DWORD(LangId);
   end;

INITIALIZATION
   SetThreadLocale(MAKELCID(LANG_GERMAN, SORT_DEFAULT));
   //SetThreadLocale(MAKELCID(LANG_RUSSIAN, SORT_DEFAULT));
Василий 2
Дата: 27.06.2019 14:58:19
Правильный метод:
- получить свою копию TFormatSettings
- настроить поля как нужно
- использовать ее для всех функций форматирования, где требуется фиксированный формат (обмен данными, вывод в файлы)
- оставить функции отображения зависящими от системных настроек

Иначе замучаетесь городить многоэтажные костыли.
Василий 2
Дата: 27.06.2019 15:05:59
P.S. Мнение не только моё, но подкреплено лично встреченными многочисленными примерами косяков при несоблюдении этих рекомендаций.
rgreat
Дата: 27.06.2019 16:09:43
Василий 2
Правильный метод:
- получить свою копию TFormatSettings
- настроить поля как нужно
- использовать ее для всех функций форматирования, где требуется фиксированный формат (обмен данными, вывод в файлы)
- оставить функции отображения зависящими от системных настроек

Иначе замучаетесь городить многоэтажные костыли.

Проще так:

  Application.UpdateFormatSettings:=False;

И все.
HOME_X
Дата: 27.06.2019 19:48:51
rgreat
Проще так:

  Application.UpdateFormatSettings:=False;

И все.



Именно ! Спасибо !

begin
  Application.Initialize;
  Application.CreateForm(TfrMain, frMain);
  Application.UpdateFormatSettings:=False;
  if(frMain.bRun)then Application.Run;
end.


P.S. Я начал события "городить", которые исправили бы ситуацию

Спасибо !