![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перевести SYSTEMTIME в строку [D7, WinXP]
Dmitry_177 © (2007-04-13 10:59:00)Перевожу 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 в конце лишний символ оказывается, а если печатать эту дату на принтере то после даты квадратик почему-то рисуется.. Может надо как-то еще переводить?
Плохиш (2007-06-12 11:20:00) [1]В описании функции пишут, что возвращается количество записанных байт/символов, я так понимаю, что заключительный #0 тоже входит в записанные символы ;-)
Кстати, почему бы не использовать GetDateFormat W?
(2007-06-12 10:35:00) [2]Удалено модератором
(2007-06-12 10:35:00) [3]Удалено модератором
(2007-06-12 10:34:00) [4]Удалено модератором
Anatoly Podgoretsky (2007-05-24 23:04:00) [5]> Dmitry_177 (24.05.2007 21:47:16) [16]
Для этого надо знать, что ожидает функция длину для текста в символах или тоже самое + ограничитель. Тут нет единства в АПИ, встречаются оба варианта. Данная функция это никак не документирует, по описанию вроде первое, но возможно второе. То есть максимальная длина текста в буфере или размер буфера.
DVM (2007-05-24 22:02:00) [6]
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;
Dmitry_177 (2007-05-24 21:47:00) [7]тогда не знаю...
а как всеже юбудет правильно? везде по 16 поставить или в SetLength 16, а в GetDateFormat 17?
Anatoly Podgoretsky (2007-05-24 20:44:00) [8]> Dmitry_177 (24.05.2007 19:40:14) [14]
Стандартный для PChar строк
Dmitry_177 (2007-05-24 19:40:00) [9]какой терминатор?
Anatoly Podgoretsky (2007-05-24 16:50:00) [10]Может они терминатор за символ считают
Dmitry_177 (2007-05-24 15:52:00) [11]перевел "ау" и тишина...:(
Dmitry_177 (2007-05-23 19:50:00) [12]Почему в SetLength длинна строки задается 16, а в GetDateFormat передается длина 17? Из за этой непонятки я задал вопрос: http://delphimaster.ru/cgi-bin/forum.pl?id=1179609104&n=0 где мне говорят что и там и там надо передавать одинаковую длину:
> Пусть, к примеру, MAX_PATH = 3.
>
> Пусть ты вызвал SetLength(s, MAX_PATH), тогда содержимое
> байт в буфере строки стало
>
> XX XX XX 00
>
> где XX - неопределенное значение
>
> Пусть теперь ты вызвал некую API-функцию, возвращающую MAX_PATH
> символов в указанный строковый буфер переменной s
>
> Тогда после возврата из ф-ции новое содержимое буфера строки
> будет выглядеть так:
>
> AA BB CC 00
Вот я и не пойму почему в SetLength длинна строки задается 16, а в GetDateFormat передается длина как 17
Anatoly Podgoretsky (2007-05-23 19:34:00) [13]> Dmitry_177 (23.05.2007 02:58:09) [9]
Что ау - переводи.
Dmitry_177 (2007-05-23 02:58:00) [14]Удалено модератором
Примечание: Создание пустых сообщений
Dmitry_177 (2007-05-21 20:11:00) [15]
> 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.ru/cgi-bin/forum.pl?id=1179609104&n=0
Anatoly Podgoretsky (2007-04-14 17:55:00) [16]> 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-04-13 18:56:00) [17]Понятно.. надо было мне просто так сделать:
SetLength(strDate, 17);
iDate := GetDateFormat(0, 0, @Date, 'dd.MM.yyyy', PChar(strDate), 17);
SetLength(strDate, iDate - 1);
17-й байт для нуля(конца строки)
А вот вызывать одну и туже функцию два раза мне не очень нравится..
Интересно а какой из этих способов быстрее?
clickmaker (2007-04-13 11:57:00) [18]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 11:36:00) [19]блин, перепутал.. вот так: dd MMMM yyyy
clickmaker (2007-04-13 11:30:00) [20]
> [2] Dmitry_177 (13.04.07 11:08)
MM тебе не даст "сентябрь", это будет 09