Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.04.13;
Скачать: CL | DM;

Вниз

Дата   Найти похожие ветки 

 
Igor23   (2008-03-16 14:08) [0]

Как получить текущую дату из XP? Требуется именно строка "16 марта"


 
{RASkov} ©   (2008-03-16 14:11) [1]

http://delphimaster.net/view/1-1205179677/


 
Igor23   (2008-03-16 14:15) [2]

отбой но все равно сенкс


 
MegaPiha ©   (2008-03-16 19:43) [3]

Вот так! :)

procedure TForm1.Button2Click(Sender: TObject);
var
 ST: psystemtime;
 pp: pchar;
begin
 New(pp);
 New(St);
 GetLocalTime(ST^);
 GetDateFormat($419, 0, ST, "d MMMM",pp,255);
 Showmessage(pp);
end;


 
Leonid Troyanovsky ©   (2008-03-16 20:07) [4]


> MegaPiha ©   (16.03.08 19:43) [3]

> Вот так! :)

>  pp: pchar;
> begin
>  New(pp);

Вот такое  хреновое у нас лето.

--
Regards, LVT.


 
Семеныч   (2008-03-16 20:52) [5]

> MegaPiha ©   (16.03.08 19:43) [3]

1. New(pp) выделяет буфер размером 1 байт. Каким образом в него может поместиться строка явно большей длины?

2. New вызывается аж 2 раза, а Dispose - ни разу. Будем иметь утечку памяти.


 
MegaPiha ©   (2008-03-16 21:39) [6]


> Семеныч   (16.03.08 20:52) [5]
>
> > MegaPiha ©   (16.03.08 19:43) [3]
>
> 1. New(pp) выделяет буфер размером 1 байт. Каким образом
> в него может поместиться строка явно большей длины?
>
> 2. New вызывается аж 2 раза, а Dispose - ни разу. Будем
> иметь утечку памяти.

Не усложняй. Все прекрасно работает


 
Anatoly Podgoretsky ©   (2008-03-16 21:40) [7]

4 байта, SizeOf(Type)


 
Семеныч   (2008-03-16 22:52) [8]

> MegaPiha ©   (16.03.08 21:39) [6]
Это тебе так кажется. Если хочешь убедиться - посмотри New в справке.

> Anatoly Podgoretsky ©   (16.03.08 21:40) [7]
1 байт. Как раз потому, что SizeOf(Type). А тип - char.


 
Плохиш ©   (2008-03-16 23:54) [9]


> MegaPiha ©   (16.03.08 21:39) [6]


> Все прекрасно работает

Попробуй запустить свой глюкокод в нерусской локали.


 
Anatoly Podgoretsky ©   (2008-03-17 00:41) [10]


> Семеныч   (16.03.08 22:52) [8]

Да, да, неправ был.


 
MegaPiha ©   (2008-03-17 19:50) [11]


> Плохиш ©   (16.03.08 23:54) [9]
>
>
> Попробуй запустить свой глюкокод в нерусской локали.
>


Зачем?


> Семеныч   (16.03.08 22:52) [8]
>
> > MegaPiha ©   (16.03.08 21:39) [6]
> Это тебе так кажется. Если хочешь убедиться - посмотри New
> в справке.


Не кажется. У меня работает - никаких проблем еще не возникало.

Народ. Может кто нибудь свой вариант напишет?

Есть еще один вариант из Delphi 2006 Архангельского.
Сам по себе спецификатор mmmm дает название месяца в именительном падеже. Но если наряду с этим спецификатором в строке форматирования используется одна из форм спецификатора, отображающего день месяца, то спецификатор mmmm отображает название месяца в родительном падеже в нижнем регистре.
Пример:
var S:string;
    D: DateTime;
...
D:=DateTime.Now;
S:=D.ToString("Сегодня d mmmm yyyy года")

Результат : Сегодня 16 марта 2005 года
Правда у меня не заработало. Может умные люди поправят?


 
Johnmen ©   (2008-03-17 20:07) [12]


>  Может умные люди поправят?

А смысл? (c)


 
MegaPiha ©   (2008-03-17 20:21) [13]


> Johnmen ©   (17.03.08 20:07) [12]
>
>
> >  Может умные люди поправят?
>
> А смысл? (c)

Почему не заработало?


 
Johnmen ©   (2008-03-17 20:30) [14]

Ты думаешь охота что-то объяснять, если ты вштыки принимаешь объяснения? "Работает и ничего не хочу понимать"
А ты выкинь New(pp) и посмотри, как работает. Подумай.
Потом м.б. перейдем к [11].


 
Leonid Troyanovsky ©   (2008-03-17 20:48) [15]


> MegaPiha ©   (17.03.08 19:50) [11]

> Правда у меня не заработало. Может умные люди поправят?

Возможно, возможно.
Один дурак может озадачить и всех мудрецов мира.

--
Regards, LVT.


 
Ega23 ©   (2008-03-17 20:54) [16]


> Есть еще один вариант из Delphi 2006 Архангельского.


Зря ты его к ночи помянул...


 
MegaPiha ©   (2008-03-17 21:06) [17]


> Johnmen ©   (17.03.08 20:30) [14]
>
> Ты думаешь охота что-то объяснять, если ты вштыки принимаешь
> объяснения? "Работает и ничего не хочу понимать"
> А ты выкинь New(pp) и посмотри, как работает. Подумай.
> Потом м.б. перейдем к [11].


Простите люди добрые, виноват. Больше никаких штыков. А зачем выкидывать New(pp)? Допустим не работает. Что это меняет. Может объяснишь?


 
Семеныч   (2008-03-17 21:21) [18]

> MegaPiha ©   (17.03.08 19:50) [11]

> Не кажется. У меня работает - никаких проблем еще не возникало.

Блин. И что с того? Ты думаешь, что если ошибка еще не проявилась, так ее и совсем нет? А то, что тебе тут профессионалы хором говорят - это пофиг? Ребята просто пофлудить решили?

Смотри. Ты выделяешь буфер размером 1 байт, но при вызове GetDateFormat сообщаешь, что выделил 255 байт. GetDateFormat не знает, что ты врешь, она думает, что длины буфера хватает и спокойно пишет в него строку длиной намного больше одного байта. Допустим, что она пишет туда N байт (кстати, GetDateFormat возвращает длину реально записанных в буфер данных, так что N можно узнать).

Что при этом происходит? А то, что N-1 байт памяти, которые идут сразу после твоего буфера затираются - то есть, информация в них портится. Если эта "испорченная" область памяти программой реально не используется, то ничего не будет, но если используется - то получишь большой привет. А используется она, или нет - этим заведуешь не ты, а менеджер памяти. И рано или поздно он эту область заюзает, не сомневайся - вот тогда и схлопочешь тот самый большой привет. И будешь долго ломать голову, почему это в совершенно другом месте программы вдруг вылезает ошибка, которой раньше не было - притом вылезает еще и не всегда. И тебе просто повезло, что ты пока еще на эти грабли не нарвался (а может, уже и нарывался, но не понял истинную причину).

А уж то, что после New ты не вызываешь Dispose - это вообще ни в какие ворота не лезет, за такие штуки даже на первом курсе двойки ставят, без разговоров. И справка тебе тоже не указ, да? Она для ламеров, реальные пацаны справку не юзают - так, что ли?

Так что - вперед, за книжки. Изучай тему "Указатели и динамическая память" (кстати, без понимания этого в Delphi вообще делать нечего). Будут вопросы - спрашивай здесь.

Потом можно будет и об Архангельском поговорить. А пока что - извини, но говорить нет смысла. На разных языках разговор получается.


 
MegaPiha ©   (2008-03-17 21:35) [19]


> Семеныч   (17.03.08 21:21) [18]


Я был неправ.

> Так что - вперед, за книжки. Изучай тему "Указатели и динамическая
> память" (кстати, без понимания этого в Delphi вообще делать
> нечего). Будут вопросы - спрашивай здесь.

Тут у меня действительно пробел. Постараюсь исправиться. Но только я не совсем согласен, что без знания указателей в Delphi делать нечего. Без них в принципе можно обойтись.

Напиши пожалуйста как правильно сделать то что просит автор ветки.


 
Ega23 ©   (2008-03-17 21:51) [20]


> Без них в принципе можно обойтись.
>


Боюсь, что нельзя...


 
Семеныч   (2008-03-17 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;


 
sniknik ©   (2008-03-17 22:59) [22]

>> Без них в принципе можно обойтись.
> Боюсь, что нельзя...
в принципе нельзя, в частном случае можно.

> Правда, код можно упростить:
ага
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 23:15) [23]

> sniknik ©   (17.03.08 22:59) [22]

А у вас, маэстро, в строке нолик лишний... хе-хе... и кусочек стека зазря откушать изволили... и формат несистемный какой-то, право... и константу MS завтра поменять может... они такие...
:о)


 
sniknik ©   (2008-03-18 00:16) [24]

нолик не лишний нолик запасной... ;) (делать функцией надо без копи...)
кусочек стека, так он же вернется, и это все одно "легче" чем выделение даже меньшего количества памяти из кучи.
формат, именно тот, что просил автор ветки и котрый ранее привели.
а с константой согласен, лучше использовать ее, хотя она конечно же завтра не поменяется.

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;


так лучше? или еще что не то?


 
sniknik ©   (2008-03-18 00:18) [25]

блин, конечно же не то.
окончательный вариант "упрощения" ->
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;


 
Семеныч   (2008-03-18 00:51) [26]

Формат несистемный... гы... и... эт-та... а вот вызову я ее рекурсивно раз эдак тыщу - и накрылся стек медным тазом... а хип - он большой...
:о)


 
Семеныч   (2008-03-18 00:55) [27]

Про формат - снимается...
Да и хватит уже, пошутили. Спать пора.
Всем спокойной ночи.


 
Плохиш ©   (2008-03-18 11:28) [28]


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 11:31) [29]

Плохиш ©   (18.03.08 11:28) [28]


>   CSIDL_RECENT = $0011;


А это ты для массы ? :)


 
Плохиш ©   (2008-03-18 11:40) [30]


> Игорь Шевченко ©   (18.03.08 11:31) [29]

Ну, дык :-))


 
MegaPiha ©   (2008-03-18 19:00) [31]


> Семеныч   (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;


Спасибо за полезный урок.



Страницы: 1 вся ветка

Текущий архив: 2008.04.13;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.017 c
2-1205757729
Pavelkq
2008-03-17 15:42
2008.04.13
Не переходит курсор в позицию в RichEdit


15-1204450706
Nucer
2008-03-02 12:38
2008.04.13
Apple TimeMachine


2-1205758991
savyhinst
2008-03-17 16:03
2008.04.13
Повернуть картинку


11-1180814127
Rusya
2007-06-02 23:55
2008.04.13
А теперь ecmListEdit


2-1205958322
ply
2008-03-19 23:25
2008.04.13
floattostr