Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


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


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(...))
Аналогично - переделать под себя все остальные регионо-зависимые функции, вынести все это в отдельный модуль и назвать его самым низким уровнем в архитектуре приложения.


Наверх

Титульная страница Поиск, карта сайта Написать письмо