-
Нужно вывести месяц в строковой форме например Февраля Декабря Есть ли какая то функция для этого ?
-
> Есть ли какая то функция для этого ?
В делфи нет. Точнее есть, но она именно так тебе не выведет.
-
То есть через case только ?
-
так попробуй (строку формата настрой сам как хочешь)
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;
-
FormatDateTime не помогает ?
-
> [2] Бэтман (10.03.08 23:18) > То есть через case только ?
А про перечисляемые типы читали? Они обычно описываются на первой полусотни страниц книжки про Делфи.
-
-
> Игорь Шевченко © (11.03.08 00:38) [4] > FormatDateTime не помогает ?
Там с падежами проблема. Февраля - там не получить.
-
Если нужно всегда точно по-русски, то массив с вбитыми именами месяцев в нужном падеже. Да и все.
-
> KSergey © (11.03.08 13:04) [8] > > Если нужно всегда точно по-русски, то массив с вбитыми именами > месяцев в нужном падеже. Да и все.
В QStrings так и сделано.
-
Навожу мышь "туда, где часики" (точнее, на сами часики). Вижу хинт: 11 марта 2008 г.
Теперь три вопроса с ответами: 1. Кто сформировал строку с правильным падежом? Windows. 2. Есть ли соответствующая обертка в VCL? Наверняка да. 3. Сложно ли ее найти? Наверняка нет.
-
> [10] Семеныч (11.03.08 18:51)
Ну так вот в [3] - это как раз и решено вроде бы...)
-
> {RASkov} © (11.03.08 18:54) [11]
Да, но частично. Только п. 1.
-
чтение MSDN по GetDateFormat поможет
-
> Семеныч (11.03.08 18:51) [10]
> 2. Есть ли соответствующая обертка в VCL? Наверняка да.
А можно пояснить, какая именно VCL-обёртка решает задачу автора?
-
> begin...end © (11.03.08 19:46) [14]
> А можно пояснить, какая именно VCL-обёртка решает задачу > автора?
IMHO, и не д.б. таковой, бо дельфийский метод локализации не лежит в русле MS.
-- Regards, LVT.
-
> begin...end © (11.03.08 19:46) [14]
> Leonid Troyanovsky © (11.03.08 22:18) [15]
Уверен что Семеныч просто неправильно сформулировал тезис. Не > VCL-обёртка , а "перевод на паскаль неких сущностей из WinAPI" .
-
> begin...end © (11.03.08 19:46) [14]> Leonid Troyanovsky © (11.03.08 22:18) [15] Обертка есть и найти ее несложно. Ею является модуль SysUtils (конкретно - его переменные и функции для работы с локалью). После просмотра кода стало ясно, что обертка хотя и есть, но с точки зрения сабжа имеет недостаток. Однако, заключается этот недостаток всего лишь в том, что для инициализации массива LongMonthNames используется (по понятным причинам) GetLocaleInfo, а не GetDateFormat (причем GetDateFormat можно подсмотреть в том же модуле - процедура DateTimeToString). Как и ожидалось, код в [3] оказался избыточным, потому что строку FormatString определять не нужно, ее можно взять уже готовую, из той самой обертки. Вся исходная информация для написания следующего кода взята из модуля SysUtils (за исключением параметров GetDateFormat, которые взяты из дельфишной же справки по WinAPI). После однократного исполнения процедуры SetGenitiveMonthNames все "родные" для VCL преобразования даты в строку по длинному формату (FormatDateTime и пр.) начинают выдавать названия месяцев в правильном падеже.
implementation
procedure SetGenitiveMonthNames;
const
Format = 'ddMMMM';
MaxLen = 11;
var
Locale: LCID;
ST: TSystemTime;
Buff: packed array[1..MaxLen] of char;
I, Len: Word;
begin
Locale := GetThreadLocale;
GetSystemTime(ST);
ST.wDay := 1;
for I := 1 to 12 do
begin
ST.wMonth := I;
Len := GetDateFormat(Locale, 0, @ST, Format, @Buff[1], MaxLen);
SetString(LongMonthNames[I], PChar(@Buff[3]), Len - 3);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Caption := FormatDateTime(LongDateFormat, Date);
end;
initialization
SetGenitiveMonthNames;
end.
-
> Семеныч (12.03.08 02:08) [17]
> "родные" для VCL
Опять ты "нарываешься". Ну когда модуль SysUtils входил в VCL-Source?
-
> Германн © (12.03.08 02:25) [18]
Не понял. А куда же он входит?
|