![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Формат даты [D7, XP]
aglar © (2008-12-04 14:46:00)procedure TForm1.Timer1Timer(Sender: TObject);
var
formatsettings: tFormatSettings;
begin
GetLocaleFormatSettings(1049, formatsettings);
statusbar1.Panels[1].Text:=DateTimetoStr(Now, formatsettings);
end;
Как вывести в статусбаре дату в полном формате?
clickmaker (2008-12-10 11:09:00) [1]> как получить от винды декабря, а не Декабрь
To get the genitive form of the month name, call GetDateFormat with a date picture of ddMMMM and remove the two digits from the beginning of the returned string.
(c) MSDN
{RASkov} (2008-12-10 10:42:00) [2]
function GetDate: string;
var
st: TSystemTime;
Date, FormatString: PChar;
DateSize, FormatStringSize: integer;
begin
Result := '';
FormatStringSize := GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SLONGDATE, nil, 0);
GetMem(FormatString, FormatStringSize * SizeOf(Char));
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SLONGDATE, FormatString, FormatStringSize);
GetLocalTime(st);
DateSize := GetDateFormat(LOCALE_USER_DEFAULT, 0, nil, FormatString, nil, 0);
GetMem(Date, DateSize * SizeOf(Char));
GetDateFormat(LOCALE_USER_DEFAULT, 0, @st, FormatString, Date, DateSize * SizeOf(Char));
Result := Date;
FreeMem(Date);
FreeMem(FormatString);
end;
Помоему этот код приводил DVM
ЮЮ (2008-12-10 08:01:00) [3]Кстати, тут как-то кто-приводил код как получить от винды декабр я, а не Декабр ь, а я своевременно не воспользовался :(
Может напомнит?
Anatoly Podgoretsky (2008-12-05 17:03:00) [4]> aglar (05.12.2008 16:47:25) [25]
Об этом уже была речь, но ты не хочешь смотреть с точки зрения пользователя, нахрена ему january 1, 2008?
Посмотри на иконку календаря и попробуй поменять локализацию.
aglar (2008-12-05 16:47:00) [5]
> Это еще не все, запустит программу на машине с другой локализацией
> и получит "1 januabris 2008"
Разве то, что мы устанавливаем LCID в 1049 (GetLocaleFormatSettings(1049, formatsettings))не значит, что будут полученны именно "русские" настройки?
Anatoly Podgoretsky (2008-12-05 16:19:00) [6]
> Это у тебя. Я, например, знаю, что моя не будет запущена.
Может, но только один раз.
Ega23 (2008-12-05 16:13:00) [7]
> Какое обобщение, если я заранее точно не знаю, где будет
> запущена программа с гарантией, что кто то не изменит локализацию.
Это у тебя. Я, например, знаю, что моя не будет запущена.
Anatoly Podgoretsky (2008-12-05 15:47:00) [8]> Ega23 (05.12.2008 15:28:21) [21]
Какое обобщение, если я заранее точно не знаю, где будет запущена программа с гарантией, что кто то не изменит локализацию. А у меня только в конторе используется минимум три локализации, разве могу я зависеть от природы? А пользователи, нафиг пользователю полная дата на английском или русском, если у него арабская локаль?
Ega23 (2008-12-05 15:28:00) [9]
> Это еще не все, запустит программу на машине с другой локализацией
> и получит "1 januabris 2008"
Ну, полное обобщение делать - это тоже своего рода паранойя.
Anatoly Podgoretsky (2008-12-05 15:11:00) [10]> Ega23 (05.12.2008 14:12:19) [19]
Это еще не все, запустит программу на машине с другой локализацией и получит "1 januabris 2008"
Ega23 (2008-12-05 14:12:00) [11]
> Вероятнее будет "1 январь 2008"
Тем более. Нафиг оно такое нужно...
Anatoly Podgoretsky (2008-12-05 14:02:00) [12]> clickmaker (05.12.2008 13:57:17) [17]
Может и проблема появится в другом месте.
clickmaker (2008-12-05 13:57:00) [13]> Вероятнее будет "1 январь 2008"
если озабоченный программист не сменит окончания в LongMonthNames )
Anatoly Podgoretsky (2008-12-05 13:55:00) [14]> Ega23 (05.12.2008 13:47:15) [15]
Вероятнее будет "1 январь 2008"
Ega23 (2008-12-05 13:47:00) [15]
> Anatoly Podgoretsky © (05.12.08 12:26) [13]
Интересно. Не знал. Буду иметь ввиду, спасибо.
Но всё равно (ИМХО), в статус-баре видеть строку "1 января 2008" - лично меня как-то коробит от этого.
Anatoly Podgoretsky (2008-12-05 13:21:00) [16]> clickmaker (05.12.2008 12:00:10) [10]
Это только часть формата, определяющий порядок и количество букв, правильно делать по инструкции Борланда, а именно вызывать GetLocaleSettings
Anatoly Podgoretsky (2008-12-05 12:26:00) [17]Все просто - в программе написано изменение локальных настроек.
Часто по причине, что не смогли сделать это нормально и полезли в региональные настройки. Вспомните некоторые вопросы на данном форуме.
А в наше время еще и потоки вносят свою лепту. В переменные то считываются один раз при старте, а на последующие изменения не обращают внимания, при том не важно где сделаны эти изменения.
В справке есть указание по поводу FormatSettings
> TFormatSettings data structure must be initialized by a
> call to GetLocaleFormatSettingsbefore it can be used with
> any string formatting routines.
Про ошибки Борланда конечно ничего, но в группах Борланда есть информация, может есть и в справке, но тогда хорошо спрятано.
Кроме того замечание касалось [6]
Ему не нужен формат dd.mm.yyyy - это не длинный формат даты, а короткий. А длинный формат от многого зависит, например
GetLocaleFormatSettings(1049, formatsettings);
первый параметр, кроме ранее сказаного выбирает какую локаль использовать.
По этому в большинстве случаев лучше пользоваться этим с локальной переменной, а не с глобальными системными переменными, которые в любой момент безконтрольно меняются. Чаще это конечно касается цифр, поскольку вместо локальной работы, программист не задумываясь меняет DecimalSeparator и может получиться, что ряд чисел в отчете с запятой, а часть с точкой, это если не повезет.
clickmaker (2008-12-05 12:25:00) [18]ну разве что TimeSeparator ':' или если мы обобщенный формат зададим, типа 'c'
Ega23 (2008-12-05 12:04:00) [19]
> как на эту строку могут повлиять "озабоченые программисты,
> которые меняют LocaleFormatSettings"?
Мне вот тоже это как-то непонятно...
clickmaker (2008-12-05 12:00:00) [20]> [9] Anatoly Podgoretsky © (05.12.08 11:48)
так у нас же там явно формат задан.
'dd.mm.yyyy hh:nn:ss'
как на эту строку могут повлиять "озабоченые программисты, которые меняют LocaleFormatSettings"?