Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Инициализация переменных "окружения" Delphi  [new]
HOME_X
Member

Откуда:
Сообщений: 2639
Доброго дня господа !

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

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

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

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

Заранее благодарен !
27 июн 19, 12:06    [21916071]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация переменных "окружения" Delphi  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 6255
HOME_X,

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

Лучше исправить ошибки в программе, тем более обычно достаточно добавить нужный вам TFormatSettings к функциям преобразования
27 июн 19, 12:16    [21916086]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация переменных "окружения" Delphi  [new]
HOME_X
Member

Откуда:
Сообщений: 2639
kealon(Ruslan),

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

А TFormatSettings - полагаете не подвержена такому воздействию ?
27 июн 19, 12:33    [21916099]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация переменных "окружения" Delphi  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 6255
HOME_X,

создайте просто свою локальную переменную этого типа и инициализируйте её как надо - её точно никто не тронет, большинство функций форматирования и деформатирования имеют вариант с использованием этой переменной в качестве параметра
27 июн 19, 12:41    [21916113]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация переменных "окружения" Delphi  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 14198
HOME_X
Почему так...
Видимо винда при пересоздании десктопа отсылает некое сообщение, которое воспринимается как необходимость переопределить переменные локали.

[quote HOME_X] Просто использовать два набора настроек - системный для экрана, и стандартный для файлов.
27 июн 19, 12:45    [21916116]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация переменных "окружения" Delphi  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6697
я преодолел проблему с неправильным форматом даты таким образом:

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));
27 июн 19, 13:51    [21916198]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация переменных "окружения" Delphi  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
Правильный метод:
- получить свою копию TFormatSettings
- настроить поля как нужно
- использовать ее для всех функций форматирования, где требуется фиксированный формат (обмен данными, вывод в файлы)
- оставить функции отображения зависящими от системных настроек

Иначе замучаетесь городить многоэтажные костыли.
27 июн 19, 14:58    [21916279]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация переменных "окружения" Delphi  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
P.S. Мнение не только моё, но подкреплено лично встреченными многочисленными примерами косяков при несоблюдении этих рекомендаций.
27 июн 19, 15:05    [21916288]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация переменных "окружения" Delphi  [new]
rgreat
Member

Откуда:
Сообщений: 6573
Василий 2
Правильный метод:
- получить свою копию TFormatSettings
- настроить поля как нужно
- использовать ее для всех функций форматирования, где требуется фиксированный формат (обмен данными, вывод в файлы)
- оставить функции отображения зависящими от системных настроек

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

Проще так:

  Application.UpdateFormatSettings:=False;

И все.
27 июн 19, 16:09    [21916377]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация переменных "окружения" Delphi  [new]
HOME_X
Member

Откуда:
Сообщений: 2639
rgreat
Проще так:

  Application.UpdateFormatSettings:=False;

И все.



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

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


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

Спасибо !
27 июн 19, 19:48    [21916594]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация переменных "окружения" Delphi  [new]
rgreat
Member

Откуда:
Сообщений: 6573
Application.UpdateFormatSettings:=False; первым поставь.

Мало ли у тебя на CreateForm какие действия происходят.
27 июн 19, 20:12    [21916605]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация переменных "окружения" Delphi  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
Метод из серии заклеивания дыры в борту самолета жвачкой, имхо.
27 июн 19, 21:42    [21916646]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация переменных "окружения" Delphi  [new]
V.Borzov
Member

Откуда: Саратов
Сообщений: 362
Что-то мне этот Application.FormatSettings не помогает, куда его не воткни...

Переопределяются выставленные мной в FormatSettings.CurrencyString и другие (DateSeparator,DecimalSeparator и др) значениями, установленнами виндой у этого юзера, причем глюк всплывает далеко не сразу, надо несколько часов подождать, подержать приложение открытым, и можно даже вообще ничего не делать, просто свернуто приложение. Отображение денежных полей да полей типа дата-время в гридах имею ввиду (TDBGRID и Delphi XE). Причем, если после того, как заметишь глюк этот, заново задать то же самое значение этой переменной, то проблема не устраняется, но поможет, если установить другое значение. Ну, или перезагрузить приложение, тоже помогает...

Причем, кажется, лет 20 уже назад это было все написано вот так, и работало корректно в приложениях это, причем даже не через FormatSettings.CurrencyString, а через deprecated-переменную CurrencyString. И вот сейчас на одной-единственной машине под Windows Server 2012, в терминалках, выявилось недели две назад, и больше нигде. На других машинах под управлением и 2012 и более ранних версий - ничего подобного. На десктопных машинах под WinXE-Win10 тоже ничего подобного. Начал копать, обнаружил, что и Application.FormatSettings у меня давным-давно в False выставлен. Тоже, значит, не помогает.
14 фев 20, 16:46    [22080192]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация переменных "окружения" Delphi  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 31980

раз появилось недавно, значит M$ выпустила новый апдейт...

Posted via ActualForum NNTP Server 1.5

14 фев 20, 16:48    [22080194]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация переменных "окружения" Delphi  [new]
V.Borzov
Member

Откуда: Саратов
Сообщений: 362
А, нашел: TJvAppEvents имеет свойство UpdateFromatSettings, которое переопределяет Application.UpdateFormatSettings постоянно, в true выставляет (а оно по дефолту так true и стоит). То есть, кладем на форму TjvAppEvents, открываем форму, и всё, Application.UpdateFormatSettings слетает в true. Если выставить в дизайне этой компоненте UpdateFormatSettings, то эффект уходит. JVCL 3.50, Delphi XE
20 фев 20, 00:03    [22083414]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация переменных "окружения" Delphi  [new]
defecator
Member

Откуда:
Сообщений: 39694
V.Borzov
А, нашел: TJvAppEvents имеет свойство UpdateFromatSettings, которое переопределяет Application.UpdateFormatSettings постоянно, в true выставляет (а оно по дефолту так true и стоит). То есть, кладем на форму TjvAppEvents, открываем форму, и всё, Application.UpdateFormatSettings слетает в true. Если выставить в дизайне этой компоненте UpdateFormatSettings, то эффект уходит. JVCL 3.50, Delphi XE


Наверное, очень суровое приложение, если оно использует Jedi
20 фев 20, 08:45    [22083489]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация переменных "окружения" Delphi  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3791
V.Borzov,

зарепорть сюда:
https://issuetracker.delphi-jedi.org/my_view_page.php
есть шанс что поправят
20 фев 20, 15:41    [22083922]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить