Текущий архив: 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.54 MB
Время: 0.007 c