Форум: "WinAPI";
Текущий архив: 2007.12.23;
Скачать: [xml.tar.bz2];
ВнизПеревести SYSTEMTIME в строку Найти похожие ветки
← →
Dmitry_177 (2007-04-13 10:59) [0]Перевожу SYSTEMTIME в строку так:
var
Date: SYSTEMTIME;
iDate: Integer;
strDate: string;
...
SetLength(strDate, MAX_PATH);
iDate := GetDateFormat(0, 0, @Date, "dd.MM.yyyy", PChar(strDate), MAX_PATH);
SetLength(strDate, iDate);
И почему-то в строке strDate в конце лишний символ оказывается, а если печатать эту дату на принтере то после даты квадратик почему-то рисуется.. Может надо как-то еще переводить?
← →
clickmaker © (2007-04-13 11:01) [1]
> MAX_PATH
зачем так много?
в строке "dd.MM.yyyy" сколько байт?
← →
Dmitry_177 (2007-04-13 11:08) [2]согласен, с MAX_PATH я переборщил.. если взять месяц в котором максимум букв то это "сентябрь", и получается что для даты понадобится максимум 16 байт (2 + 1 + 8 + 1 + 4) вместе с точками..
← →
clickmaker © (2007-04-13 11:30) [3]
> [2] Dmitry_177 (13.04.07 11:08)
MM тебе не даст "сентябрь", это будет 09
← →
Dmitry_177 (2007-04-13 11:36) [4]блин, перепутал.. вот так: dd MMMM yyyy
← →
clickmaker © (2007-04-13 11:57) [5]Return Values
If the function succeeds, the return value is the number of TCHARs written to the lpDateStr buffer, or if the cchDate parameter is zero, the number of TCHARs required to hold the formatted date string. The count includes the terminating null.
(c) MSDN
Т.е. можно так
iDate := GetDateFormat(0, 0, @Date, "dd.MMMM.yyyy", PChar(strDate), 0);
SetLength(strDate, iDate - 1);
GetDateFormat(0, 0, @Date, "dd.MMMM.yyyy", PChar(strDate), iDate);
← →
Dmitry_177 (2007-04-13 18:56) [6]Понятно.. надо было мне просто так сделать:
SetLength(strDate, 17);
iDate := GetDateFormat(0, 0, @Date, "dd.MM.yyyy", PChar(strDate), 17);
SetLength(strDate, iDate - 1);
17-й байт для нуля(конца строки)
А вот вызывать одну и туже функцию два раза мне не очень нравится..
Интересно а какой из этих способов быстрее?
← →
Anatoly Podgoretsky © (2007-04-14 17:55) [7]> Dmitry_177 (13.04.2007 18:56:06) [6]
SetLength(strDate, 16);
iDate := GetDateFormat(0, 0, @Date, "dd.MM.yyyy", PChar(strDate), 17);
// SetLength(strDate, iDate - 1);
strDate := PChar(strDate);
← →
Dmitry_177 (2007-05-21 20:11) [8]
> SetLength(strDate, 16);
> iDate := GetDateFormat(0, 0, @Date, "dd.MM.yyyy", PChar(strDate),
> 17);
> // SetLength(strDate, iDate - 1);
> strDate := PChar(strDate);
а почему в SetLength 16 а в GetDateFormat 17??? Ведь я именно из за этого задал вопрос: http://delphimaster.net/view/1-1179609104/
← →
Dmitry_177 (2007-05-23 02:58) [9]Удалено модератором
Примечание: Создание пустых сообщений
← →
Anatoly Podgoretsky © (2007-05-23 19:34) [10]> Dmitry_177 (23.05.2007 02:58:09) [9]
Что ау - переводи.
← →
Dmitry_177 (2007-05-23 19:50) [11]Почему в SetLength длинна строки задается 16, а в GetDateFormat передается длина 17? Из за этой непонятки я задал вопрос: http://delphimaster.net/view/1-1179609104/ где мне говорят что и там и там надо передавать одинаковую длину:
> Пусть, к примеру, MAX_PATH = 3.
>
> Пусть ты вызвал SetLength(s, MAX_PATH), тогда содержимое
> байт в буфере строки стало
>
> XX XX XX 00
>
> где XX - неопределенное значение
>
> Пусть теперь ты вызвал некую API-функцию, возвращающую MAX_PATH
> символов в указанный строковый буфер переменной s
>
> Тогда после возврата из ф-ции новое содержимое буфера строки
> будет выглядеть так:
>
> AA BB CC 00
Вот я и не пойму почему в SetLength длинна строки задается 16, а в GetDateFormat передается длина как 17
← →
Dmitry_177 (2007-05-24 15:52) [12]перевел "ау" и тишина...:(
← →
Anatoly Podgoretsky © (2007-05-24 16:50) [13]Может они терминатор за символ считают
← →
Dmitry_177 (2007-05-24 19:40) [14]какой терминатор?
← →
Anatoly Podgoretsky © (2007-05-24 20:44) [15]> Dmitry_177 (24.05.2007 19:40:14) [14]
Стандартный для PChar строк
← →
Dmitry_177 (2007-05-24 21:47) [16]тогда не знаю...
а как всеже юбудет правильно? везде по 16 поставить или в SetLength 16, а в GetDateFormat 17?
← →
DVM © (2007-05-24 22:02) [17]
function GetShortDate: string; // 01.01.2003
var
st: TSystemTime;
Date, FormatString: PChar;
DateSize, FormatStringSize: integer;
begin
Result := "";
FormatStringSize := GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SSHORTDATE, nil, 0);
GetMem(FormatString, FormatStringSize * SizeOf(Char));
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SSHORTDATE, 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;
← →
Anatoly Podgoretsky © (2007-05-24 23:04) [18]> Dmitry_177 (24.05.2007 21:47:16) [16]
Для этого надо знать, что ожидает функция длину для текста в символах или тоже самое + ограничитель. Тут нет единства в АПИ, встречаются оба варианта. Данная функция это никак не документирует, по описанию вроде первое, но возможно второе. То есть максимальная длина текста в буфере или размер буфера.
← →
имя (2007-06-12 10:34) [19]Удалено модератором
← →
имя (2007-06-12 10:35) [20]Удалено модератором
← →
имя (2007-06-12 10:35) [21]Удалено модератором
← →
Плохиш © (2007-06-12 11:20) [22]В описании функции пишут, что возвращается количество записанных байт/символов, я так понимаю, что заключительный #0 тоже входит в записанные символы ;-)
Кстати, почему бы не использовать GetDateFormatW?
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2007.12.23;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.045 c