Форум: "Основная";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];
ВнизПроизвольное изменение региональных настроек Найти похожие ветки
← →
dmitry501 © (2005-06-15 11:07) [0]Приветствую всех.
Вылез сегодня такой глюк.
На машине стоит Win2K RUS. Региональные настройки все русские- т.е. разделитель дроби - "," и пр.
В программе в FormCreate написаноDecimalSeparator:=".";
для обеспечения независимости работы программы от региональных установок windows.
Так вот, если в процессе работы программы в USB вставить какое-либо устройство, то windows радостно напишет, что нашла новое устройство и установит его.
Вот только после этого в программе меняются региональные установки на дефолтные, которые установлены в windiws :(
Глюки вылезли наInputbox(Cash
StringReplace(Cash,",",".",[rfReplaceAll]);
StrToFloat(Cash
пришлось срочкуDecimalSeparator:=".";
прописывать везде, где была возможность возникновения подобной ошибки.
Кто знает, это чей это косяк, и можно ли его побороть более цивилизованно?
← →
TUser © (2005-06-15 11:16) [1]Если дело касается только DecimalSeparator - то можно написать свою StrToFloat примерно такого содержания
result:=StrToFloat(StringReplace(...))
Аналогично - переделать под себя все остальные регионо-зависимые функции, вынести все это в отдельный модуль и назвать его самым низким уровнем в архитектуре приложения.
← →
dmitry501 © (2005-06-15 11:19) [2]TUser © (15.06.05 11:16) [1]
Это в принципе уже Борландом сделано.
есть перегруженные функции типаStrToFloat(const S: string; const FormatSettings: TFormatSettings): Extended; overload;
но мне в принципе интересно, в чем проблема...
← →
Reindeer Moss Eater © (2005-06-15 13:45) [3]Application.UpdateFormatSettings:=False;
← →
evvcom © (2005-06-15 14:20) [4]
> пришлось срочку
> DecimalSeparator:=".";
> прописывать везде, где была возможность возникновения подобной
> ошибки.
Прикинь, а параллельно твоей программе работает еще одна, которая постоянно борется с твоей и заменяет точку на запятую. Мое имхо: не надо писать такие уродские программы!
← →
dmitry501 © (2005-06-16 05:27) [5]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 не меняется! Запустил еще пяток копий первой, во второй ничего не меняется. Так что мое ИМХО - про уродские программы не нужно писать, если не знаешь.
← →
dmitry501 © (2005-06-16 05:34) [6]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.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.044 c