Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.04.13;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.019 c
2-1205760772
abhtr
2008-03-17 16:32
2008.04.13
Помогите с языком хранимых процедур


15-1203951929
Tirael
2008-02-25 18:05
2008.04.13
как получить document?


2-1205916579
Дмитрий
2008-03-19 11:49
2008.04.13
процент заряда акумулятора на нотбук ?


8-1178055969
XProger
2007-05-02 01:46
2008.04.13
Быстрый скриншот


15-1203982965
BlackSun
2008-02-26 02:42
2008.04.13
Полупрозрачный заголовок формы в XP





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский