Конференция "Основная" » Вывести месяц [D7, WinXP]
 
  • Бэтман (10.03.08 23:07) [0]
    Нужно вывести месяц в строковой форме
    например
    Февраля
    Декабря
    Есть ли какая то функция для этого ?
  • DVM © (10.03.08 23:15) [1]

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

    В делфи нет. Точнее есть, но она именно так тебе не выведет.
  • Бэтман (10.03.08 23:18) [2]
    То есть через case только ?
  • DVM © (10.03.08 23:20) [3]
    так попробуй (строку формата настрой сам как хочешь)

    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;
  • Игорь Шевченко © (11.03.08 00:38) [4]
    FormatDateTime не помогает ?
  • KilkennyCat © (11.03.08 00:55) [5]
    > [2] Бэтман   (10.03.08 23:18)
    > То есть через case только ?


    А про перечисляемые типы читали? Они обычно описываются на первой полусотни страниц книжки про Делфи.
  • Amoeba © (11.03.08 12:19) [6]
    Библиотека QStrings. Раздел Функции для работы с датами.
    http://www.torry.net/vcl/vcltools/text/adqstrings.zip
  • DVM © (11.03.08 12:22) [7]

    > Игорь Шевченко ©   (11.03.08 00:38) [4]
    > FormatDateTime не помогает ?

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

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

    В QStrings так и сделано.
  • Семеныч (11.03.08 18:51) [10]
    Навожу мышь "туда, где часики" (точнее, на сами часики). Вижу хинт: 11 марта 2008 г.

    Теперь три вопроса с ответами:
    1. Кто сформировал строку с правильным падежом? Windows.
    2. Есть ли соответствующая обертка в VCL? Наверняка да.
    3. Сложно ли ее найти? Наверняка нет.
  • {RASkov} © (11.03.08 18:54) [11]
    > [10] Семеныч   (11.03.08 18:51)

    Ну так вот в [3] - это как раз и решено вроде бы...)
  • Семеныч (11.03.08 18:57) [12]
    > {RASkov} ©   (11.03.08 18:54) [11]

    Да, но частично. Только п. 1.
  • clickmaker © (11.03.08 18:59) [13]
    чтение MSDN по GetDateFormat поможет
  • begin...end © (11.03.08 19:46) [14]
    > Семеныч   (11.03.08 18:51) [10]

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

    А можно пояснить, какая именно VCL-обёртка решает задачу автора?
  • Leonid Troyanovsky © (11.03.08 22:18) [15]

    > begin...end ©   (11.03.08 19:46) [14]

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

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

    --
    Regards, LVT.
  • Германн © (12.03.08 01:08) [16]

    > begin...end ©   (11.03.08 19:46) [14]


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

    Уверен что Семеныч просто неправильно сформулировал тезис. Не
    > VCL-обёртка
    , а "перевод на паскаль неких сущностей из WinAPI" .
  • Семеныч (12.03.08 02:08) [17]
    > 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

    {$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.

  • Германн © (12.03.08 02:25) [18]

    > Семеныч   (12.03.08 02:08) [17]


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

    Опять ты "нарываешься". Ну когда модуль SysUtils входил в VCL-Source?
  • Семеныч (12.03.08 08:13) [19]
    > Германн ©   (12.03.08 02:25) [18]

    Не понял. А куда же он входит?
  • Семеныч (12.03.08 08:33) [20]
    > Германн ©   (12.03.08 02:25) [18]

    А, понял. Ну да, неточно сказал. Да и хрен бы с ним. Кто хотел понять - тот понял, кто хотел не понять - да и пусть себе. Мир не рухнет.
  • DVM © (12.03.08 14:33) [21]

    > Семеныч   (12.03.08 02:08) [17]


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

    Где ты взял "из обертки" FormatString ?
    В своем коде ты жестко задал  Format = 'ddMMMM', я же ее получил в соответствии с настройками текущего пользователя. У пользователя не обязательно должно быть 'ddMMMM'
  • DVM © (12.03.08 14:36) [22]
    А понял, ты говорил про переменную LongDateFormat из SysUtils.
  • DVM © (12.03.08 14:38) [23]
    я тот код из [3] писал из расчета не использовать SysUtils.
 
Конференция "Основная" » Вывести месяц [D7, WinXP]
Есть новые Нет новых   [134483   +44][b:0.001][p:0.001]