Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.11;
Скачать: CL | DM;

Вниз

Произвольное изменение региональных настроек   Найти похожие ветки 

 
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.
UpdateFormatSettings is checked when the application receives a WM_WININICHANGE message.
Т.е. windows посылает сообщение о том, что пользователь сменил системные настройки при установки нового устройства, и автоматом обновляется decimalseparator? Еще раз, спасибо.



Страницы: 1 вся ветка

Текущий архив: 2005.07.11;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.03 c
1-1119427254
mariya_mezenceva
2005-06-22 12:00
2005.07.11
ошибка при работе с excel из потока


9-1112183293
qwe
2005-03-30 15:48
2005.07.11
GlScene - меню


6-1112793722
Alexander Panov
2005-04-06 17:22
2005.07.11
Получение кода ошибки в Indy.


14-1118657144
emfw
2005-06-13 14:05
2005.07.11
Процент


3-1117176187
MakNik
2005-05-27 10:43
2005.07.11
Пересечение промежутков дат