![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Произвольное изменение региональных настроек
dmitry501 © (2005-06-15 11:07:00)Приветствую всех.
Вылез сегодня такой глюк.
На машине стоит Win2K RUS. Региональные настройки все русские- т.е. разделитель дроби - "," и пр.
В программе в FormCreate написано
DecimalSeparator:='.';
для обеспечения независимости работы программы от региональных установок windows.
Так вот, если в процессе работы программы в USB вставить какое-либо устройство, то windows радостно напишет, что нашла новое устройство и установит его.
Вот только после этого в программе меняются региональные установки на дефолтные, которые установлены в windiws :(
Глюки вылезли на
Inputbox(Cash
StringReplace(Cash,',','.',[rfReplaceAll]);
StrToFloat(Cash
пришлось срочку
DecimalSeparator:='.';
прописывать везде, где была возможность возникновения подобной ошибки.
Кто знает, это чей это косяк, и можно ли его побороть более цивилизованно?
dmitry501 (2005-06-16 05:34:00) [1]Reindeer Moss Eater © (15.06.05 13:45) [3]
Спасибо, сделал так, пока все нормально. В справке написано,
Specifies whether format settings are updated automatically when the user alters the system configuration.Т.е. windows посылает сообщение о том, что пользователь сменил системные настройки при установки нового устройства, и автоматом обновляется decimalseparator? Еще раз, спасибо.
UpdateFormatSettings is checked when the application receives a WM_WININICHANGE message.
dmitry501 (2005-06-16 05:27:00) [2]evvcom © (15.06.05 14:20) [4]
Они не должны влиять друг на друга. В каждом процессе свои установки. Специально проверил- создал две програмки с таймером.
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label1.Caption := DecimalSeparator;
If DecimalSeparator = '.' then
DecimalSeparator := ','
else
DecimalSeparator := '.';
end;
Эта меняет по таймеру раз в сек.
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label1.Caption := DecimalSeparator;
end;
Эта вторая программа по таймеру просто показывает текущий разделитель. Таймер срабатывает чаще в 10 раз, чтобы не было корреляции. Так вот, во второй программе decimalseparator не меняется! Запустил еще пяток копий первой, во второй ничего не меняется. Так что мое ИМХО - про уродские программы не нужно писать, если не знаешь.
evvcom (2005-06-15 14:20:00) [3]
> пришлось срочку
> DecimalSeparator:='.';
> прописывать везде, где была возможность возникновения подобной
> ошибки.
Прикинь, а параллельно твоей программе работает еще одна, которая постоянно борется с твоей и заменяет точку на запятую. Мое имхо: не надо писать такие уродские программы!
Reindeer Moss Eater (2005-06-15 13:45:00) [4]Application.UpdateFormatSettings:=False;
dmitry501 (2005-06-15 11:19:00) [5]TUser © (15.06.05 11:16) [1]
Это в принципе уже Борландом сделано.
есть перегруженные функции типа
StrToFloat(const S: string; const FormatSettings: TFormatSettings): Extended; overload;
но мне в принципе интересно, в чем проблема...
TUser (2005-06-15 11:16:00) [6]Если дело касается только DecimalSeparator - то можно написать свою StrToFloat примерно такого содержания
result:=StrToFloat(StringReplace(...))
Аналогично - переделать под себя все остальные регионо-зависимые функции, вынести все это в отдельный модуль и назвать его самым низким уровнем в архитектуре приложения.