![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Дата
Igor23 © (2008-03-16 14:08:00)Как получить текущую дату из XP? Требуется именно строка '16 марта'
MegaPiha (2008-03-18 19:00:00) [1]
> Семеныч (17.03.08 22:17) [21]
>
> > MegaPiha © (17.03.08 21:35) [19]
>
> > Я был неправ.
>
> Я тоже излишне погорячился, извини.
>
> > я не совсем согласен, что без знания указателей в Delphi
> делать нечего.
> > Без них в принципе можно обойтись.
>
> Любая переменная любого объектного типа - это указатель.
> String - по умолчанию тоже указатель. Динамический массив
> - тоже указатель. Любой параметр процедуры или функции с
> описателем var - тоже указатель. VMT и RTTI - там указатели
> сплошь и рядом (и даже указатели на указатели). Вызовы функций
> API - там тоже очень часто используются указатели. Чуть
> ли не все классы - контейнеры (TList со всеми своими потомками,
> TStrings со всеми своими потомками, TCollection со всеми
> своими потомками, TListView, TTreeView, TDataSet со всеми
> своими потомками - и т.д., таких классов очень много) -
> это и вовсе, можно сказать, аж целые списки указателей.
> Некоторые часто используемые структуры данных (например,
> все виды связанных списков - стеки, очереди ..) - тоже
> указатели.
>
> Вот и попробуй обойтись без понимания указателей. Вряд ли
> что-то сложнее "Hello, world!" написать получится.
>
> > как правильно сделать то что просит автор ветки.
>
> См. ссылку в [1], а там ответ [3]. Правда, код можно упростить:
>
>
> function GetDate: string;
> var
> ST: TSystemTime;
> Date: PChar;
> DateSize: integer;
> begin
> GetLocalTime(ST);
> DateSize := GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE,
> nil, nil, nil, 0);
> GetMem(Date, DateSize);
> try
> SetString(Result, Date, GetDateFormat(LOCALE_USER_DEFAULT,
> DATE_LONGDATE, @ST, nil, Date, DateSize) - 1);
> finally
> FreeMem(Date);
> end;
> end;
Спасибо за полезный урок.
Плохиш (2008-03-18 11:40:00) [2]
> Игорь Шевченко © (18.03.08 11:31) [29]
Ну, дык :-))
Игорь Шевченко (2008-03-18 11:31:00) [3]Плохиш © (18.03.08 11:28) [28]
> CSIDL_RECENT = $0011;
А это ты для массы ? :)
Плохиш (2008-03-18 11:28:00) [4]
const
CSIDL_RECENT = $0011;
SUBLANG_RUSSIAN = $01;
LANG_SYSTEM_RUSSIAN = (SUBLANG_RUSSIAN shl 10) or LANG_RUSSIAN;
LOCALE_RUSSIAN = (SORT_DEFAULT shl 16) or LANG_SYSTEM_RUSSIAN;
...
var
wsDate: WideString;
idx: Integer;
...
idx := GetDateFormatW(LOCALE_RUSSIAN, DATE_LONGDATE, nil, 'dd MMMM', @wsDate[1], 0);
SetLength(wsDate, idx);
idx := GetDateFormatW(LOCALE_RUSSIAN, DATE_LONGDATE, nil, 'dd MMMM', @wsDate[1], idx);
MessageBoxW(0, @wsDate[1], 'Date', MB_OK);
...
Семеныч (2008-03-18 00:55:00) [5]Про формат - снимается...
Да и хватит уже, пошутили. Спать пора.
Всем спокойной ночи.
Семеныч (2008-03-18 00:51:00) [6]Формат несистемный... гы... и... эт-та... а вот вызову я ее рекурсивно раз эдак тыщу - и накрылся стек медным тазом... а хип - он большой...
:о)
sniknik (2008-03-18 00:18:00) [7]блин, конечно же не то.
окончательный вариант "упрощения" ->
function GetDate: string;
var
st: TSystemTime;
s: array[1..50] of char;
begin
GetLocalTime(st);
GetDateFormat(LOCALE_USER_DEFAULT, 0, @st, 'd MMMM', @s, 50);
result:= PChar(@s);
end;
sniknik (2008-03-18 00:16:00) [8]нолик не лишний нолик запасной... ;) (делать функцией надо без копи...)
кусочек стека, так он же вернется, и это все одно "легче" чем выделение даже меньшего количества памяти из кучи.
формат, именно тот, что просил автор ветки и котрый ранее привели.
а с константой согласен, лучше использовать ее, хотя она конечно же завтра не поменяется.
function GetDate: string;
var
st: TSystemTime;
s: array[1..50] of char;
n: integer;
begin
GetLocalTime(st);
n:= GetDateFormat(LOCALE_USER_DEFAULT, 0, @st, 'd MMMM', @s, 50);
result:= PChar(@s);
end;
так лучше? или еще что не то?
Семеныч (2008-03-17 23:15:00) [9]> sniknik © (17.03.08 22:59) [22]
А у вас, маэстро, в строке нолик лишний... хе-хе... и кусочек стека зазря откушать изволили... и формат несистемный какой-то, право... и константу MS завтра поменять может... они такие...
:о)
sniknik (2008-03-17 22:59:00) [10]>> Без них в принципе можно обойтись.
> Боюсь, что нельзя...
в принципе нельзя, в частном случае можно.
> Правда, код можно упростить:
ага
procedure TForm1.Button1Click(Sender: TObject);
var
st: TSystemTime;
s: array[1..50] of char;
n: integer;
begin
GetLocalTime(st);
n:= GetDateFormat($419, 0, @st, 'd MMMM', @s, 50);
ShowMessage(Copy(s, 1, n));
end;
Семеныч (2008-03-17 22:17:00) [11]> MegaPiha © (17.03.08 21:35) [19]
> Я был неправ.
Я тоже излишне погорячился, извини.
> я не совсем согласен, что без знания указателей в Delphi делать нечего.
> Без них в принципе можно обойтись.
Любая переменная любого объектного типа - это указатель. String - по умолчанию тоже указатель. Динамический массив - тоже указатель. Любой параметр процедуры или функции с описателем var - тоже указатель. VMT и RTTI - там указатели сплошь и рядом (и даже указатели на указатели). Вызовы функций API - там тоже очень часто используются указатели. Чуть ли не все классы - контейнеры (TList со всеми своими потомками, TStrings со всеми своими потомками, TCollection со всеми своими потомками, TListView, TTreeView, TDataSet со всеми своими потомками - и т.д., таких классов очень много) - это и вовсе, можно сказать, аж целые списки указателей. Некоторые часто используемые структуры данных (например, все виды связанных списков - стеки, очереди ..) - тоже указатели.
Вот и попробуй обойтись без понимания указателей. Вряд ли что-то сложнее "Hello, world!" написать получится.
> как правильно сделать то что просит автор ветки.
См. ссылку в [1], а там ответ [3]. Правда, код можно упростить:
function GetDate: string;
var
ST: TSystemTime;
Date: PChar;
DateSize: integer;
begin
GetLocalTime(ST);
DateSize := GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, nil, nil, nil, 0);
GetMem(Date, DateSize);
try
SetString(Result, Date, GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, @ST, nil, Date, DateSize) - 1);
finally
FreeMem(Date);
end;
end;
Ega23 (2008-03-17 21:51:00) [12]
> Без них в принципе можно обойтись.
>
Боюсь, что нельзя...
MegaPiha (2008-03-17 21:35:00) [13]
> Семеныч (17.03.08 21:21) [18]
Я был неправ.
> Так что - вперед, за книжки. Изучай тему "Указатели и динамическая
> память" (кстати, без понимания этого в Delphi вообще делать
> нечего). Будут вопросы - спрашивай здесь.
Тут у меня действительно пробел. Постараюсь исправиться. Но только я не совсем согласен, что без знания указателей в Delphi делать нечего. Без них в принципе можно обойтись.
Напиши пожалуйста как правильно сделать то что просит автор ветки.
Семеныч (2008-03-17 21:21:00) [14]> MegaPiha © (17.03.08 19:50) [11]
> Не кажется. У меня работает - никаких проблем еще не возникало.
Блин. И что с того? Ты думаешь, что если ошибка еще не проявилась, так ее и совсем нет? А то, что тебе тут профессионалы хором говорят - это пофиг? Ребята просто пофлудить решили?
Смотри. Ты выделяешь буфер размером 1 байт, но при вызове GetDateFormat сообщаешь, что выделил 255 байт. GetDateFormat не знает, что ты врешь, она думает, что длины буфера хватает и спокойно пишет в него строку длиной намного больше одного байта. Допустим, что она пишет туда N байт (кстати, GetDateFormat возвращает длину реально записанных в буфер данных, так что N можно узнать).
Что при этом происходит? А то, что N-1 байт памяти, которые идут сразу после твоего буфера затираются - то есть, информация в них портится. Если эта "испорченная" область памяти программой реально не используется, то ничего не будет, но если используется - то получишь большой привет. А используется она, или нет - этим заведуешь не ты, а менеджер памяти. И рано или поздно он эту область заюзает, не сомневайся - вот тогда и схлопочешь тот самый большой привет. И будешь долго ломать голову, почему это в совершенно другом месте программы вдруг вылезает ошибка, которой раньше не было - притом вылезает еще и не всегда. И тебе просто повезло, что ты пока еще на эти грабли не нарвался (а может, уже и нарывался, но не понял истинную причину).
А уж то, что после New ты не вызываешь Dispose - это вообще ни в какие ворота не лезет, за такие штуки даже на первом курсе двойки ставят, без разговоров. И справка тебе тоже не указ, да? Она для ламеров, реальные пацаны справку не юзают - так, что ли?
Так что - вперед, за книжки. Изучай тему "Указатели и динамическая память" (кстати, без понимания этого в Delphi вообще делать нечего). Будут вопросы - спрашивай здесь.
Потом можно будет и об Архангельском поговорить. А пока что - извини, но говорить нет смысла. На разных языках разговор получается.
MegaPiha (2008-03-17 21:06:00) [15]
> Johnmen © (17.03.08 20:30) [14]
>
> Ты думаешь охота что-то объяснять, если ты вштыки принимаешь
> объяснения? "Работает и ничего не хочу понимать"
> А ты выкинь New(pp) и посмотри, как работает. Подумай.
> Потом м.б. перейдем к [11].
Простите люди добрые, виноват. Больше никаких штыков. А зачем выкидывать New(pp)? Допустим не работает. Что это меняет. Может объяснишь?
Ega23 (2008-03-17 20:54:00) [16]
> Есть еще один вариант из Delphi 2006 Архангельского.
Зря ты его к ночи помянул...
Leonid Troyanovsky (2008-03-17 20:48:00) [17]
> MegaPiha © (17.03.08 19:50) [11]
> Правда у меня не заработало. Может умные люди поправят?
Возможно, возможно.
Один дурак может озадачить и всех мудрецов мира.
--
Regards, LVT.
Johnmen (2008-03-17 20:30:00) [18]Ты думаешь охота что-то объяснять, если ты вштыки принимаешь объяснения? "Работает и ничего не хочу понимать"
А ты выкинь New(pp) и посмотри, как работает. Подумай.
Потом м.б. перейдем к [11].
MegaPiha (2008-03-17 20:21:00) [19]
> Johnmen © (17.03.08 20:07) [12]
>
>
> > Может умные люди поправят?
>
> А смысл? (c)
Почему не заработало?
Johnmen (2008-03-17 20:07:00) [20]
> Может умные люди поправят?
А смысл? (c)