Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Дата


Страницы:   1 2

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)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо