主页
Top.Mail.Ru Yandeks.Metrika
论坛:“主要”;
当前存档:2009.01.04;
下载:[xml.tar.bz2];

向下

打印月份 找到类似的分支


Бэтман   (2008-03-10 23:07) [0]

Нужно вывести месяц в строковой форме
例如
Февраля
十二月
Есть ли какая то функция для этого ?



DVM ©   (2008-03-10 23:15) [1]


> Есть ли какая то функция для этого ?

В делфи нет. Точнее есть, но она именно так тебе не выведет.



Бэтман   (2008-03-10 23:18) [2]

То есть через case только ?



DVM ©   (2008-03-10 23:20) [3]

так попробуй (строку формата настрой сам как хочешь)

function GetDate: string;
VAR
 st: TSystemTime;
 Date, FormatString: PChar;
 DateSize, FormatStringSize: integer;
开始
结果:=“”;
 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);
结束;



Игорь Шевченко ©   (2008-03-11 00:38) [4]

FormatDateTime не помогает ?



KilkennyCat ©   (2008-03-11 00:55) [5]

> [2] Бэтман   (10.03.08 23:18)
> То есть через case только ?


А про перечисляемые типы читали? Они обычно описываются на первой полусотни страниц книжки про Делфи.



Amoeba ©   (2008-03-11 12:19) [6]

Библиотека QStrings. Раздел Функции для работы с датами.
http://www.torry.net/vcl/vcltools/text/adqstrings.zip



DVM ©   (2008-03-11 12:22) [7]


> Igor Shevchenko©(11.03.08 00:38)[4]
> FormatDateTime не помогает ?

Там с падежами проблема. Февраля - там не получить.



KSergey ©   (2008-03-11 13:04) [8]

Если нужно всегда точно по-русски, то массив с вбитыми именами месяцев в нужном падеже. Да и все.



Amoeba ©   (2008-03-11 13:18) [9]


> KSergey©(11.03.08 13:04)[8]
>
> Если нужно всегда точно по-русски, то массив с вбитыми именами
> месяцев в нужном падеже. Да и все.

В QStrings так и сделано.



Семеныч   (2008-03-11 18:51) [10]

Навожу мышь "туда, где часики" (точнее, на сами часики). Вижу хинт: 11 марта 先生2008

Теперь три вопроса с ответами:
1. Кто сформировал строку с правильным падежом? Windows.
2. Есть ли соответствующая обертка в VCL? Наверняка да.
3. Сложно ли ее найти? Наверняка нет.



{RASkov} ©   (2008-03-11 18:54) [11]

> [10] Semenych(11.03.08 18:51)

Ну так вот в [3] - это как раз и решено вроде бы...)



Семеныч   (2008-03-11 18:57) [12]

> {RASkov}©(11.03.08 18:54)[11]

Да, но частично. Только п. 1.



clickmaker ©   (2008-03-11 18:59) [13]

чтение MSDN по GetDateFormat поможет



begin...end ©   (2008-03-11 19:46) [14]

> Semenych(11.03.08 18:51)[10]

> 2. Есть ли соответствующая обертка в VCL? Наверняка да.

А можно пояснить, какая именно VCL-обёртка решает задачу автора?



Leonid Troyanovsky ©   (2008-03-11 22:18) [15]


>开始...结束©(11.03.08 19:46)[14]

> А можно пояснить, какая именно VCL-обёртка решает задачу
> автора?

IMHO, и не д.б. таковой, бо дельфийский метод локализации
не лежит в русле MS.

--
此致,LVT。



Германн ©   (2008-03-12 01:08) [16]


>开始...结束©(11.03.08 19:46)[14]


> Leonid Troyanovsky©(11.03.08 22:18)[15]

Уверен что Семеныч просто неправильно сформулировал тезис. Не
> VCL-обёртка
, а "перевод на паскаль неких сущностей из WinAPI" .



Семеныч   (2008-03-12 02:08) [17]

>开始...结束©(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

{$R *.dfm}

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.



Германн ©   (2008-03-12 02:25) [18]


> Semenych(12.03.08 02:08)[17]


> "родные" для VCL

Опять ты "нарываешься". Ну когда модуль SysUtils входил в VCL-Source?



Семеныч   (2008-03-12 08:13) [19]

> Hermann©(12.03.08 02:25)[18]

Не понял. А куда же он входит?



Семеныч   (2008-03-12 08:33) [20]

> Hermann©(12.03.08 02:25)[18]

А, понял. Ну да, неточно сказал. Да и хрен бы с ним. Кто хотел понять - тот понял, кто хотел не понять - да и пусть себе. Мир не рухнет.



DVM ©   (2008-03-12 14:33) [21]


> Semenych(12.03.08 02:08)[17]


> Как и ожидалось, код в [3] оказался избыточным, потому что
> строку FormatString определять не нужно, ее можно взять
> уже готовую, из той самой обертки.

Где ты взял "из обертки" FormatString ?
В своем коде ты жестко задал  Format = "ddMMMM", я же ее получил в соответствии с настройками текущего пользователя. У пользователя не обязательно должно быть "ddMMMM"



DVM ©   (2008-03-12 14:36) [22]

А понял, ты говорил про переменную LongDateFormat из SysUtils.



DVM ©   (2008-03-12 14:38) [23]

я тот код из [3] писал из расчета не использовать SysUtils.



Страницы: 1 整个分支

论坛:“主要”;
当前存档:2009.01.04;
下载:[xml.tar.bz2];

楼上









内存:0.64 MB
时间:0.033 c
2-1227161746
b @ v
2008-11-20 09:15
2009.01.04
Dbgrid和滚动


15-1225721457
Xenus
2008-11-03 17:10
2009.01.04
Форум работает с перебоями


2-1227161056
Valerik
2008-11-20 09:04
2009.01.04
组合框


15-1226179709
瓦西的尸体
2008-11-09 00:28
2009.01.04
Займите WMR


2-1227600006
的BIOS
2008-11-25 11:00
2009.01.04
大师,请告诉我





南非荷兰语 阿尔巴尼亚人 阿拉伯语 亚美尼亚 阿塞拜疆 巴斯克 白俄罗斯 保加利亚语 加泰罗尼亚 简体中文 中国(繁体) 克罗地亚 捷克 丹麦语 荷兰人 英语 爱沙尼亚语 菲律宾人 芬兰 法文
加利亚西语 格鲁吉亚语 德语 希腊语 海地克里奥尔语 希伯来语 印地语 匈牙利 北日耳曼语 印度尼西亚人 爱尔兰语 意大利语 日本性玩偶 韩语 拉脱维亚 立陶宛 马其顿 马来语 马耳他语 挪威语
波斯语 波兰语 葡萄牙语 罗马尼亚 俄语 塞尔维亚 斯洛伐克 斯洛文尼亚 西班牙语 斯瓦希里 瑞典语 泰国人 土耳其 乌克兰 乌尔都语 越南人 威尔士语 意第绪语 孟加拉 波斯尼亚
宿务 世界语 古吉拉特语 豪萨语 苗族 伊博 爪哇 卡纳达语 高棉 老挝 拉丁语 毛利 马拉 蒙古人 尼泊尔 旁遮普 索马里 泰米尔人 泰卢固语 约鲁巴语
祖鲁
英文 Французский Немецкий Итальянский Португальский 俄文 Испанский