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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Проще так:

  Application.UpdateFormatSettings:=False;

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

Откуда:
Сообщений: 2455
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

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

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

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

Откуда: Саратов
Сообщений: 312
Что-то мне этот 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

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

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

Posted via ActualForum NNTP Server 1.5

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

Откуда: Саратов
Сообщений: 312
А, нашел: 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

Откуда:
Сообщений: 39459
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
Сообщений: 3523
V.Borzov,

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