Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.5 MB
Время: 0.047 c
2-1196243768
tytus
2007-11-28 12:56
2007.12.23
Как переделать запрос, чтобы вывелось то чего нету?


2-1195710167
Costy
2007-11-22 08:42
2007.12.23
Ускорения tClientSocket (tserverSocket)


15-1195493587
lobach
2007-11-19 20:33
2007.12.23
Пароль на папку


3-1187693683
barakuda
2007-08-21 14:54
2007.12.23
update table


15-1195736070
Кот
2007-11-22 15:54
2007.12.23
css меню





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский