![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Что может менять DateSeparator во время исполнения?
Дмитрий Белькевич © (2010-08-05 13:15:00)Меняю в конструкторе главной формы DateSeparator:
DateSeparator := '-';
На одной из юзерских машин DateSeparator меняется обратно на дефолтный (на точку). На моём буке работает нормально.
sniknik (2010-08-06 11:28:00) [1]> О других возможностях и спрашивал.
ну там вроде было, что при создании окна... точно не помню. т.е. это не только когда ты create форме делаешь, но и меняешь параметры которые приводят к его пересозданию.
> Как минимум непрофессионално.
ну, в хелпе обычно пишут предупреждения типа
> The first form of FloatToStr is not thread-safe
что сразу должно отсечь попытки использования функции, неважно из-за глобальных меняющихся переменных это или чего-то другого.
т.е. есть разница использовать функцию, или считать переменную из потока напрямую без использования синхронизации, т.к. никто больше ее не меняет.
Anatoly Podgoretsky (2010-08-06 11:00:00) [2]> Дмитрий Белькевич (06.08.2010 10:39:19) [19]
Не надо это делать. Как минимум непрофессионално.
Anatoly Podgoretsky (2010-08-06 10:59:00) [3]> sniknik (06.08.2010 10:08:17) [17]
Так на это и есть жалоба, что устанавливать бессмысленно, поскольку какая то
сука меняет обратно. Потокобезопасной оно не станет, да апликейшн не будет
пытаться обновить их/перезаписывать из системы, но это не относится к другим
модулям и потокам. В любой момент кто угодно может это изменить, это
глобальная переменная.
Дмитрий Белькевич (2010-08-06 10:39:00) [4]
> не только, это обсуждали как то, нашли пару других мест.
Уточняю: мною изменяется только один раз. О других возможностях и спрашивал.
Игорь Шевченко (2010-08-06 10:12:00) [5]
> и не парится "хитрыми" методами/дополнительными присвоениями.
> и оно сразу станет потокобезопасной т.к. апликейшн не будет
> пытаться обновить их/перезаписывать из системы.
наивный
sniknik (2010-08-06 10:08:00) [6]ну так decimalseparator в дельфи это просто глобальная переменная, не метод присвоение к которому могло бы "сбить" настройки в винде... область действия только сама программа.
т.е. вполне допустимо написать в начале программы
DecimalSeparator:= '.';
UpdateFormatSettings:= false;
и не парится "хитрыми" методами/дополнительными присвоениями. и оно сразу станет потокобезопасной т.к. апликейшн не будет пытаться обновить их/перезаписывать из системы.
> Вообще - сам процесс изменения выполняется только один раз (во время создания главной формы).
не только, это обсуждали как то, нашли пару других мест.
Дмитрий Белькевич (2010-08-06 09:50:00) [7]Всё понятно, всем спасибо, буду разбираться.
Anatoly Podgoretsky (2010-08-06 09:06:00) [8]> trsas (06.08.2010 03:41:13) [13]
Кроме decimalseparator некоторые также меняют правила округления, форматы
дат.
Format Setting и должен использоваться только в режиме рид-онли.
Правильно искользовать как Игорь Шевченко © (05.08.10 15:00) [5]
Anatoly Podgoretsky (2010-08-06 09:01:00) [9]> trsas (06.08.2010 03:41:13) [13]
Если какая то программа меняет decimalseparator, так что это влияет на
других, по сути является трояном, по определению. Почему некоторые за троян
признают только те программы, которые передают логины и пароли на сторону.
trsas (2010-08-06 03:41:00) [10]
> Anatoly Podgoretsky © (05.08.10 19:44) [12]
>
> > Дмитрий Белькевич (05.08.2010 16:45:09) [9]
>
> А то, что decimalseparator может быть изменен в любой момент,
> кем угодно и
> такие трояны имеют место быть.
>
Не надо ссылаться на троянов.
Достаточно сказать, что любая программа созданная "недокодером" (с) Плохиш может поменять эти настройки.
А значит значения сепараторов надо использовать только в режиме рид-онли.
Anatoly Podgoretsky (2010-08-05 19:44:00) [11]> Дмитрий Белькевич (05.08.2010 16:45:09) [9]
А то, что decimalseparator может быть изменен в любой момент, кем угодно и
такие трояны имеют место быть.
Плохиш (2010-08-05 19:44:00) [12]
> Дмитрий Белькевич (05.08.10 16:45) [9]
> Не думаю, что юзеры постоянно в винде меняют настройки.
Сам ты недокодер, юзеры здесь не при чём.
Медвежонок Пятачок (2010-08-05 17:56:00) [13]UpdateFormatSettings, скорее всего не при чём
фикли ты тогда здесь делаешь?
Дмитрий Белькевич (2010-08-05 16:45:00) [14]
> Я же писал, что это потоконебезопасно.
А что именно потоконебезопасно? Сам процесс изменения, то, что локальные настройки отличаются от глобальных или еще что-то? Вообще - сам процесс изменения выполняется только один раз (во время создания главной формы).
UpdateFormatSettings, скорее всего не при чём - проблема возникает стабильно и почти сразу после запуска программы. Не думаю, что юзеры постоянно в винде меняют настройки.
Anatoly Podgoretsky (2010-08-05 15:11:00) [15]> Игорь Шевченко (05.08.2010 15:00:05) [5]
Можно проще
var
FS: TFormatSettings;
begin
// GetLocaleFormatSettings(GetThreadLocale, FS);
FS.DecimalSeparator := '.';
Foo := StrToFloat(S, FS);
end;
Anatoly Podgoretsky (2010-08-05 15:09:00) [16]> Дмитрий Белькевич (05.08.2010 14:51:04) [4]
Я же писал, что это потоконебезопасно.
Плохиш (2010-08-05 15:03:00) [17]
> Дмитрий Белькевич (05.08.10 13:15)
UpdateFormatSettings := false:
Игорь Шевченко (2010-08-05 15:00:00) [18]
> Мне в пределах программы нужно поменять.
вместо
OldSep := DecimalSeparator;
DecimalSeparator := '.';
try
Foo := StrToFloat(S);
finally
DecimalSeparator := OldSep;
end;
следует писать:
var
FS: TFormatSettings;
begin
GetLocaleFormatSettings(GetThreadLocale, FS);
FS.DecimalSeparator := '.';
Foo := StrToFloat(S, FS);
end;
Дмитрий Белькевич (2010-08-05 14:51:00) [19]Ну я глобальные настройки-то не трогаю. Мне в пределах программы нужно поменять.
Anatoly Podgoretsky (2010-08-05 14:24:00) [20]> Дмитрий Белькевич (05.08.2010 14:12:02) [2]
А зачем тебе тогда его менять. Нормальный путь - через региональные
настройки и только с согласия пользователя. Если при этом что то будет
менять DateSeparator, то ищи трояна.