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

Вниз

Формат даты   Найти похожие ветки 

 
aglar ©   (2008-12-04 14:46) [0]

procedure TForm1.Timer1Timer(Sender: TObject);
var
 formatsettings: tFormatSettings;
begin
GetLocaleFormatSettings(1049, formatsettings);
statusbar1.Panels[1].Text:=DateTimetoStr(Now, formatsettings);
end;

Как вывести в статусбаре дату в полном формате?


 
clickmaker ©   (2008-12-04 14:48) [1]

FormatDateTime("dd.mm.yyyy hh:nn:ss"


 
{RASkov} ©   (2008-12-04 14:49) [2]

> [0] aglar ©   (04.12.08 14:46)

Достаточно Now и FormatDateTime()


 
aglar ©   (2008-12-04 15:41) [3]

сделал так

procedure TForm1.Timer1Timer(Sender: TObject);
var
 NowDate: TDateTime;
 formatsettings: Tformatsettings;
begin
NowDate:= Now;
GetLocaleFormatSettings(1049, formatsettings);
FormatDateTime("dd mmmm yyyy hh:nn:ss", NowDate, formatsettings);
statusbar1.Panels[1].Text:=DateTimetoStr(NowDate);
end;

не получилось - выводит дату в формате 04.12.2008 15.43.15


 
clickmaker ©   (2008-12-04 15:46) [4]

вообще-то, FormatDateTime - это функция...


 
aglar ©   (2008-12-04 15:49) [5]

Всем спасибо, работает так

procedure TForm1.Timer1Timer(Sender: TObject);
var
 NowDate: TDateTime;
 formatsettings: Tformatsettings;
 TimeString: string;
begin
NowDate:= Now;
GetLocaleFormatSettings(1049, formatsettings);
TimeString := FormatDateTime("dd mmmm yyyy hh:nn:ss", NowDate, formatsettings);
statusbar1.Panels[1].Text:= TimeString;
end;


 
Ega23 ©   (2008-12-04 16:08) [6]

procedure TForm1.Timer1Timer(Sender: TObject);
var
NowDate: TDateTime;
formatsettings: Tformatsettings;
TimeString: string;
begin
NowDate:= Now;
GetLocaleFormatSettings(1049, formatsettings);
TimeString := FormatDateTime("dd mmmm yyyy hh:nn:ss", NowDate, formatsettings);
statusbar1.Panels[1].Text:= TimeString;
end;


Достаточно одной строчки:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 statusbar1.Panels[1].Text:= FormatDateTime("dd.mm.yyyy hh:nn:ss", Now);
end;


 
Anatoly Podgoretsky ©   (2008-12-04 16:21) [7]

> Ega23  (04.12.2008 16:08:06)  [6]

Ему другой формат нужен и делает он правильно, а у тебя слишком упрощеный, не учитывающий современных реалий. Борланд на этом споткнулся еще раньше тебя и в Д7 рекомендует делать только так.


 
clickmaker ©   (2008-12-05 11:31) [8]

> слишком упрощеный, не учитывающий современных реалий. Борланд
> на этом споткнулся

это что за реалии? И на чем споткнулся Борланд?


 
Anatoly Podgoretsky ©   (2008-12-05 11:48) [9]

Современные реалии это многопоточные приложения и озабоченые программисты, которые меняют LocaleFormatSettings при том иногда на ходу, а стандартные переменные не потокобезопасные. Да чего рассказывать, в справке все написано.


 
clickmaker ©   (2008-12-05 12:00) [10]

> [9] Anatoly Podgoretsky ©   (05.12.08 11:48)

так у нас же там явно формат задан.
"dd.mm.yyyy hh:nn:ss"
как на эту строку могут повлиять "озабоченые программисты, которые меняют LocaleFormatSettings"?


 
Ega23 ©   (2008-12-05 12:04) [11]


> как на эту строку могут повлиять "озабоченые программисты,
>  которые меняют LocaleFormatSettings"?


Мне вот тоже это как-то непонятно...


 
clickmaker ©   (2008-12-05 12:25) [12]

ну разве что TimeSeparator ":" или если мы обобщенный формат зададим, типа "c"


 
Anatoly Podgoretsky ©   (2008-12-05 12:26) [13]

Все просто - в программе написано изменение локальных настроек.
Часто по причине, что не смогли сделать это нормально и полезли в региональные настройки. Вспомните некоторые вопросы на данном форуме.
А в наше время еще и потоки вносят свою лепту. В переменные то считываются один раз при старте, а на последующие изменения не обращают внимания, при том не важно где сделаны эти изменения.
В справке есть указание по поводу  FormatSettings

> TFormatSettings data structure must be initialized by a
> call to GetLocaleFormatSettings before it can be used with
> any string formatting routines.

Про ошибки Борланда конечно ничего, но в группах Борланда есть информация, может есть и в справке, но тогда хорошо спрятано.

Кроме того замечание касалось [6]
Ему не нужен формат dd.mm.yyyy - это не длинный формат даты, а короткий. А длинный формат от многого зависит, например
GetLocaleFormatSettings(1049, formatsettings);
первый параметр, кроме ранее сказаного выбирает какую локаль использовать.

По этому в большинстве случаев лучше пользоваться этим с локальной переменной, а не с глобальными системными переменными, которые в любой момент безконтрольно меняются. Чаще это конечно касается цифр, поскольку вместо локальной работы, программист не задумываясь меняет DecimalSeparator и может получиться, что ряд чисел в отчете с запятой, а часть с точкой, это если не повезет.


 
Anatoly Podgoretsky ©   (2008-12-05 13:21) [14]

> clickmaker  (05.12.2008 12:00:10)  [10]

Это только часть формата, определяющий порядок и количество букв, правильно делать по инструкции Борланда, а именно вызывать GetLocaleSettings


 
Ega23 ©   (2008-12-05 13:47) [15]


> Anatoly Podgoretsky ©   (05.12.08 12:26) [13]


Интересно. Не знал. Буду иметь ввиду, спасибо.

Но всё равно (ИМХО), в статус-баре видеть строку "1 января 2008" - лично меня как-то коробит от этого.


 
Anatoly Podgoretsky ©   (2008-12-05 13:55) [16]

> Ega23  (05.12.2008 13:47:15)  [15]

Вероятнее будет "1 январь 2008"


 
clickmaker ©   (2008-12-05 13:57) [17]

> Вероятнее будет "1 январь 2008"

если озабоченный программист не сменит окончания в LongMonthNames )


 
Anatoly Podgoretsky ©   (2008-12-05 14:02) [18]

> clickmaker  (05.12.2008 13:57:17)  [17]

Может и проблема появится в другом месте.


 
Ega23 ©   (2008-12-05 14:12) [19]


> Вероятнее будет "1 январь 2008"


Тем более. Нафиг оно такое нужно...


 
Anatoly Podgoretsky ©   (2008-12-05 15:11) [20]

> Ega23  (05.12.2008 14:12:19)  [19]

Это еще не все, запустит программу на машине с другой локализацией и получит "1 januabris 2008"


 
Ega23 ©   (2008-12-05 15:28) [21]


> Это еще не все, запустит программу на машине с другой локализацией
> и получит "1 januabris 2008"


Ну, полное обобщение делать - это тоже своего рода паранойя.


 
Anatoly Podgoretsky ©   (2008-12-05 15:47) [22]

> Ega23  (05.12.2008 15:28:21)  [21]

Какое обобщение, если я заранее точно не знаю, где будет запущена программа с гарантией, что кто то не изменит локализацию. А у меня только в конторе используется минимум три локализации, разве могу я зависеть от природы? А пользователи, нафиг пользователю полная дата на английском или русском, если у него арабская локаль?


 
Ega23 ©   (2008-12-05 16:13) [23]


> Какое обобщение, если я заранее точно не знаю, где будет
> запущена программа с гарантией, что кто то не изменит локализацию.


Это у тебя. Я, например, знаю, что моя не будет запущена.


 
Anatoly Podgoretsky ©   (2008-12-05 16:19) [24]


> Это у тебя. Я, например, знаю, что моя не будет запущена.

Может, но только один раз.


 
aglar ©   (2008-12-05 16:47) [25]


> Это еще не все, запустит программу на машине с другой локализацией
> и получит "1 januabris 2008"


Разве то, что мы устанавливаем LCID в 1049 ( GetLocaleFormatSettings(1049, formatsettings) )не значит, что будут полученны именно "русские" настройки?


 
Anatoly Podgoretsky ©   (2008-12-05 17:03) [26]

> aglar  (05.12.2008 16:47:25)  [25]

Об этом уже была речь, но ты не хочешь смотреть с точки зрения пользователя, нахрена ему january 1, 2008?
Посмотри на иконку календаря и попробуй поменять локализацию.


 
ЮЮ ©   (2008-12-10 08:01) [27]

Кстати, тут как-то кто-приводил код как получить от винды декабря, а не Декабрь, а я своевременно не воспользовался :(

Может напомнит?


 
{RASkov} ©   (2008-12-10 10:42) [28]

function GetDate: string;
var
 st: TSystemTime;
 Date, FormatString: PChar;
 DateSize, FormatStringSize: integer;
begin
 Result := "";
 FormatStringSize := GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SLONGDATE, nil, 0);
 GetMem(FormatString, FormatStringSize * SizeOf(Char));
 GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SLONGDATE, FormatString, FormatStringSize);
 GetLocalTime(st);
 DateSize := GetDateFormat(LOCALE_USER_DEFAULT, 0, nil, FormatString, nil, 0);
 GetMem(Date, DateSize * SizeOf(Char));
 GetDateFormat(LOCALE_USER_DEFAULT, 0, @st, FormatString, Date, DateSize * SizeOf(Char));
 Result := Date;
 FreeMem(Date);
 FreeMem(FormatString);
end;

Помоему этот код приводил DVM


 
clickmaker ©   (2008-12-10 11:09) [29]

> как получить от винды декабря, а не Декабрь

To get the genitive form of the month name, call GetDateFormat with a date picture of ddMMMM and remove the two digits from the beginning of the returned string.
(c) MSDN



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

Форум: "Начинающим";
Текущий архив: 2009.01.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.008 c
15-1228043672
Riply
2008-11-30 14:14
2009.01.25
Недопустимые символы в Delphi


2-1229085959
Pavel
2008-12-12 15:45
2009.01.25
Работа с STream


1-1207222142
аноним
2008-04-03 15:29
2009.01.25
RemoteServer и ProgressBar на клиенте


15-1228144946
Layner
2008-12-01 18:22
2009.01.25
Убили форум или пропал интерес к Delphi?


1-1207046453
Sergey2
2008-04-01 14:40
2009.01.25
TMainMenu и Hint у контролов в рантайме отображается неправильно





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