Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Разделитель дробной и целой части


Автор: Step 22.6.2004, 12:51
в ос виндоус есть настройка разделителя дробной и целой части,

как его узнать программным путем,


желательно без обращения к реестру, или предусматреть что реестр различных версий винды имеет различные ключи...

Автор: Maverick 22.6.2004, 13:19
Сорри, что не совсем в сабж, но если надо внутри проги свой разделитель, то использовать можно DecimalSeparator := ' {то, что нужно}'...

Автор: dm9 22.6.2004, 13:21
ИМХО, DecimalSeparator как раз и установлен изначально как в настройках Windows.
Но если надо поменять, то DecimalSeparator меняет только внутри приложения.

Автор: stab 22.6.2004, 14:37
Цитата
ИМХО, DecimalSeparator как раз и установлен изначально как в настройках Windows.


угу, так и есть, а узнать без использования DecimalSeparator можно так:

Код

procedure TForm1.Button1Click(Sender: TObject);
var
 buf: array[0..1] of Char;
begin
 GetLocaleInfo(GetThreadLocale, LOCALE_SDECIMAL, buf, 2);
 ShowMessage(buf);
end;

Автор: Step 22.6.2004, 14:47
Спасибо

Автор: Петрович 22.6.2004, 15:07
И ещё, учтите, если не предпринять специальных действий, то значение DecimalSeparator может измениться уже во время работы приложения, если пользователь сменит настройку Windows!

Автор: Medved 23.6.2004, 14:13
2Петрович а что ты понимаешь под словосочетанием "если не предпринять специальных действий"?
Можно поподробнее?

Заранее благодарен!

Автор: Петрович 23.6.2004, 23:00
Цитата
Можно поподробнее?

Легко.
Дело в том, что при изменении интернациональных настроек, к которым относится формат даты, времени, чисел с плавающей точкой, и пр., Windows посылает всем приложениям специальное сообщение (имя не помню). По идее, грамотно написанные приложения должны как минимум перерисоваться с учетом этих настроек. Borland, как всегда, о нас позаботился и в этом случае. А именно, это сообщение ловит объект Application, и в соответствии с ним, повторно читает из Windows интернациональные настройки, переустанавливая соответствующие переменные модуля System (DateSeparator, ShortDateFormat, DecimalSeparator, и т.п.). Вообщем-то это наверное правильно. Однако, в некоторых случаях это может навредить (мне лично почти всегда smile.gif). Вот поэтому, у объекта Application есть свойство UpdateFormatSettings установленное по умолчанию в True. Если-же присвоить ему False, то Application будет игнорировать соответствующее сообщение от Windows, и не будет "на лету" менять переменные связанные с форматом.
Лично у меня, очень часто программы живут не сами по себе, а общаются с программыми на других компах, используют экспорт/импорт данных в вполне определенных текстовых форматах. А поскольку во многих случаях происходит неявное (неконтролируемое мною) преобразование число<>строка, дата<>строка (например tDateTimeField.AsString или StringVar := VariantVar), то я вынужден сам устанавливать нужные мне форматы. Ну и что-бы шаловливый пользователь не нарушил работу моей программы, я перед установкой собственных настроек делаю Application.UpdateFormatSettings := False;.
Естественно, для консольных приложений это не актуально - там нет Application, следовательно некому и "следить" за изменениями.

Хотелось коротенько, а получилось как всегда smile.gif

Автор: Medved 24.6.2004, 05:38
Спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)