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

Вниз

Вывести пустой TDateTimePicker   Найти похожие ветки 

 
С-К   (2014-08-08 17:44) [0]

То есть, чтобы DateTimePicker отображал пустые места, типа «  .  .  »

Можно, конечно, dtp.Format := """"""; - а потом при выборе значения из календарика подставлять dtp.Format := "";
но в таком случае в первоначально пустом виде нельзя сразу ручками вбить дату цифрами.

Если присвоить dtp.Date := 0, то, конечно, просто выставится 1899 год.

А нужно, чтобы DateTimePicker изначально был пустым и это можно было определить. Если так и не заполнили - то в БД писать nil.


 
А не проще ли ...   (2014-08-08 18:26) [1]

А не проще ли, если 1899 , то писать nil
чего тут городить ...


 
Rouse_ ©   (2014-08-08 21:32) [2]


> А нужно, чтобы DateTimePicker изначально был пустым и это
> можно было определить.

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


 
Германн ©   (2014-08-09 02:45) [3]


> А нужно, чтобы DateTimePicker изначально был пустым и это
> можно было определить. Если так и не заполнили - то в БД
> писать nil.
>

TDateEdit от RxLib (JVCL) возможно позволяет определить введена ли какая-нибудь дата или нет. Это если не хочешь писать свой компонент.


 
ВладОшин ©   (2014-08-10 10:39) [4]

combobox на ондропдаун исчезает, показывается календарь


 
С-К   (2014-08-10 21:11) [5]


> А не проще ли, если 1899 , то писать nil

проще, только вопрос был не о том


> Что ты хочешь от контрола, который изначально должен отображать
> не цифры, а время и дату?

ты принципиально не прав. TDateTimePicker предназначен не для отображения даты, а для ВВОДА даты. И легко можно себе представить ситуацию, когда он должен быть изначально "пустой". То есть, даты просто нету. Пользователь может ввести дату, а может её принципиально не ввести.


 
Германн ©   (2014-08-11 01:58) [6]


> С-К   (10.08.14 21:11) [5]
> ты принципиально не прав.

Ты тоже. Причём гораздо более.
Пустыми могут быть строки или массивы. Переменные целого или вещественного типа пустыми быть не могут в принципе. (Практику использования NULL в БД не рассматриваю). Как должна программа реагировать на "пустое" поле ТDateTimePicker?


 
sniknik ©   (2014-08-11 08:23) [7]

> Пустыми могут быть строки или массивы.
это с точки зрения программирования, а по нуждам заказчиков (/пониманию пользователя) при начале ввода анкеты например в "год рождения" должно быть пусто... ведь он туда ничего еще не ввел.
ситуация часто встречающаяся (у меня точно).


 
С-К   (2014-08-11 09:25) [8]


> Переменные целого или вещественного типа пустыми быть не
> могут в принципе

переменные - да, но причем здесь это? Я говорю про интерфейс пользователя, когда контрол по умолчанию должен быть пустым, например.


>  Как должна программа реагировать на "пустое" поле ТDateTimePicker?

записать в соответствующее поле БД null


 
Rouse_ ©   (2014-08-11 10:23) [9]


> ты принципиально не прав

Ну что ж - каждому свое, однако я бы сделал это совершенно по другому.


 
Styx   (2014-08-11 10:36) [10]

А если заполнили, а потом передумали? Imho, лучше дополнительную галочку сделать.


 
С-К   (2014-08-11 10:43) [11]


> однако я бы сделал это совершенно по другому.

как?


> А если заполнили, а потом передумали?

вот именно. Для пользователя интуитивно  просто стереть дату, выделить её и нажать DEL. Но контрол стандартный это, судя по всему, не позволяет (


 
sniknik ©   (2014-08-11 10:43) [12]

> А если заполнили, а потом передумали?
в большинстве случаев это значит полный отказ от ввода всего (если продолжать пример анкеты).
но вообще если будет (/сделать) датапикер с дополнительным(/начальным) пустым значением, то разве проблема сделать в нем очистку ввода? ну например прямо в поле редактирования.


 
junglecat   (2014-08-11 11:11) [13]

А ShowCheckbox или что-то наподобие - не то ли часом?


 
Inovet ©   (2014-08-11 11:12) [14]

Наварример, надо ввести период, начальная дата известна, конечная пока открыта. Интуитивно её надо или не заполнять или стереь, если уже ввели что-то раньше. Галочки там и прочее дополнительная путаница


 
С-К   (2014-08-11 11:13) [15]


> А ShowCheckbox или что-то наподобие

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

Или как-то можно?


 
С-К   (2014-08-11 11:15) [16]


> начальная дата известна, конечная пока открыта

верно, это еще один пример такого контрола


 
Rouse_ ©   (2014-08-11 11:25) [17]


> как?

Не использовал бы ТDateTimePicker, а по быстрому реализовал бы свой составной контрол (который будет отображать к примеру "дата не введена"), там делов-то на 15 минут.


 
junglecat   (2014-08-11 12:10) [18]

MaskEdit?


 
С-К   (2014-08-11 13:07) [19]


> там делов-то на 15 минут.

ну нет. Дело в том, что пользователи привыкли выбирать дату зачастую из календарика, который отображается по стрелочке вниз. Это же не чисто текстовый контрол.


 
junglecat   (2014-08-11 13:10) [20]

> [19] С-К   (11.08.14 13:07)

MaskEdit + MonthCalendar?
да можно и просто readonly Edit


 
С-К   (2014-08-11 13:13) [21]

>MonthCalendar

что это такое?


 
Rouse_ ©   (2014-08-11 13:17) [22]


> ну нет. Дело в том, что пользователи привыкли выбирать дату зачастую из календарика, который отображается по стрелочке вниз. Это же не чисто текстовый контрол.

Стандартный TDateTimePicker является составным контролом из Edit и MonthCalendar, тебе предлагают сделать то-же самое, только поведение эдита изменить на такое, как тебе нужно.


 
sniknik ©   (2014-08-11 13:34) [23]

procedure TForm1.FormCreate(Sender: TObject);
begin
 Edit1.Parent:= DateTimePicker1;
 Edit1.Align := alLeft;
 Edit1.BorderStyle:= bsNone;
 Edit1.Width:= DateTimePicker1.ClientWidth - GetSystemMetrics(SM_CXVSCROLL);
 //Edit1.ReadOnly:= true;
end;

procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
 Edit1.Text:= DateToStr(DateTimePicker1.Date);
end;

procedure TForm1.DateTimePicker1Enter(Sender: TObject);
begin
 DateTimePicker1.DateTime:= StrToDateDef(Form1.Edit1.Text, Now());
end;


 
С-К   (2014-08-11 13:47) [24]

sniknik, как я понял поверх dtp ты фигачишь Edit... интересная идея, спасибо


 
sniknik ©   (2014-08-11 14:15) [25]

не поверх, внутрь.


 
Rouse_ ©   (2014-08-11 16:19) [26]


> С-К

Ну хорошо, давай попробуем без велосипедов.
Смотри, у TDateTimePicker есть стиль DTS_SHOWNONE: http://msdn.microsoft.com/en-us/library/windows/desktop/bb761728(v=vs.85).aspx
Который отвечает за отображение того что пикер не содержит валидной даты.

Управляется этот стиль при помощи свойства ShowCheckbox, при этом когда чекбокс выключен, дата задисейблена и сразу видно что дата не введена.


 
С-К   (2014-08-11 17:23) [27]


>  при этом когда чекбокс выключен, дата задисейблена и сразу
> видно что дата не введена.

ну я бы не сказал, что верно.

Вот: http://goo.gl/5JwKAi

Задисейблено - видно, но вот что дата не введена - не факт. Многие подумают, что дата введена (сегодняшнее число), но её изменить нельзя. Корректно было - если даты реально не было (пустое поле).


 
Rouse__   (2014-08-11 17:50) [28]

Что значит ты бы не сказал? Ты хочешь сказать что люди разрабатывающие юзабилити в MS делают все не верно? ;)


 
С-К   (2014-08-11 19:35) [29]


> Что значит ты бы не сказал?

что сразу видно, что дата не введена.


> Ты хочешь сказать что люди разрабатывающие юзабилити в MS
> делают все не верно?

я думаю нет смысла дискутировать на эту тему.

Я в целом обозначил задачу, она такая.


 
Rouse_ ©   (2014-08-11 19:55) [30]


> Я в целом обозначил задачу, она такая.

Ну раз так, то ответ был озвучен еще в [17]. Давно бы свой контрол склепал, чем время тратить на форуме.


 
С-К   (2014-08-11 19:58) [31]


> то ответ был озвучен еще в [17]

я писал ответ на этот пост.


 
Rouse_ ©   (2014-08-11 20:04) [32]


> С-К   (11.08.14 19:58) [31]
> я писал ответ на этот пост.

Ты написал неверный ответ. Составной контрол дружественный пользователю (с сохранением основных принципов ввода/вывода и листом выбора даты) пишется за 15 минут. Выглядит идентично DateTimePicker, но работает так как ты хочешь.


 
Rouse_ ©   (2014-08-11 20:05) [33]

Принцип реализации составных контролов можешь посмотреть вот тут: http://rouse.drkb.ru/components.php#fwvistapathedit


 
имя   (2014-08-11 20:37) [34]

Удалено модератором


 
Rouse_ ©   (2014-08-11 20:39) [35]


> С-К   (11.08.14 19:35) [29]
> что сразу видно, что дата не введена.

Кажется именно такая и была изначальная задача в самом первом посте:


> С-К   (08.08.14 17:44) [0]
>  и это можно было определить


 
Германн ©   (2014-08-12 01:25) [36]


>  С-К   (11.08.14 13:07) [19]
>
>
> > там делов-то на 15 минут.
>
> ну нет. Дело в том, что пользователи привыкли выбирать дату
> зачастую из календарика, который отображается по стрелочке
> вниз.

Ещё раз повторю TDateEdit от RxLib.
Ставить библиотеку не надо как и не обязательно использовать этот компонент. Но его исходный код был бесплатно отдан всем желающим. И работает он именно так как тебе хочется.


 
Германн ©   (2014-08-12 01:27) [37]


> sniknik ©   (11.08.14 08:23) [7]
>
> > Пустыми могут быть строки или массивы.
> это с точки зрения программирования, а по нуждам заказчиков
> (/пониманию пользователя) при начале ввода анкеты например
> в "год рождения" должно быть пусто... ведь он туда ничего
> еще не ввел.
> ситуация часто встречающаяся (у меня точно).
>

Я же специально сказал
>  (Практику использования NULL в БД не рассматриваю)

:)


 
С-К   (2014-08-12 09:08) [38]


> пишется за 15 минут

как реализовать выпадающий календарик?


> Ещё раз повторю TDateEdit от RxLib.

еще раз повторю:


> А сейчас требование работать на стандартных компонентах



> Я же специально сказал
> >  (Практику использования NULL в БД не рассматриваю)

ну а мне от этого не легче, потому что если пользователь не ввел дату - то в БД надо писать null, и это логично.


 
junglecat   (2014-08-12 09:38) [39]

> сейчас требование работать на стандартных компонентах

обычно под этим понимается "не юзать платные компоненты, потому что бабланетнах". А rxlib - бесплатна


 
Rouse_ ©   (2014-08-12 10:24) [40]


> С-К   (12.08.14 09:08) [38]
> как реализовать выпадающий календарик?

Ну я ж тебе даже ссылку на пример дал :)
Ладно, пойдем более простым путем, на форму кидай кнопку и календарь, у календаря свойство Visible ставь в False, потом в обработчике кнопки пиши следующий код:

procedure TForm1.Button1Click(Sender: TObject);
begin
 MonthCalendar1.Left := Button1.Left;
 MonthCalendar1.Top := Button1.Top + Button1.Height;
 AnimateWindow(MonthCalendar1.Handle, 200, AW_SLIDE or AW_VER_POSITIVE);
 MonthCalendar1.Visible := True;
end;


 
С-К   (2014-08-12 11:02) [41]

Rouse_, крутяк вообще получилось все :) Спасибо!


 
С-К   (2014-08-12 11:41) [42]

Не все крутяк.. (

Почему то по бокам у TMonthCalendar возникает серая полоска.

Картинка: http://bit.ly/1q66LKC


 
С-К   (2014-08-12 11:43) [43]

Хм... Потому что когда создается TMonthCalendar - он почему то шире, чем нужно для отображения.

Его ширина: 191
Ширина, когда он "нормально" выглядит без серых полосок: 155

Могу ли я ему присвоить ширину 155 (допустим, при динамическом создании) - валидно ли это будет? Он всегда попиксельно одинаковый?


 
С-К   (2014-08-12 11:50) [44]

И еще один баг...

Когда скрывать календарь, как определить момент выбора? Я сделал событие на OnClick, но бяда в том, что OnClick возникает и тогда, когда пользователь нажимает стрелочки влево, вправо для смены месяца. Происходит OnClick и мой календарь неожиданно исчезает ((

Я ж говорю - не все так просто - написать свой компонент.


 
Rouse_ ©   (2014-08-12 12:05) [45]


> Я ж говорю - не все так просто - написать свой компонент.

Все там просто, если немножко подумать.

 TForm1 = class(TForm)
   Button1: TButton;
   MonthCalendar1: TMonthCalendar;
   procedure Button1Click(Sender: TObject);
 private
   FOldCalendarWndProc: TWndMethod;
   procedure CalendarWndProc(var Message: TMessage);
 end;

..

uses
 CommCtrl;

procedure TForm1.Button1Click(Sender: TObject);
var
 R: TRect;
begin
 // получаем минимальные размеры календаря
 MonthCalendar1.Left := -1000;
 MonthCalendar1.Top := -1000;
 MonthCalendar1.Visible := True;
 MonthCalendar1.Perform(MCM_GETMINREQRECT, 0, R);
 with R do
 begin
   MonthCalendar1.Width := Right - Left;
   MonthCalendar1.Height := Bottom - Top;
 end;
 MonthCalendar1.Visible := False;
 // указываем еу позицию
 MonthCalendar1.Left := Button1.Left;
 MonthCalendar1.Top := Button1.Top + Button1.Height;
 // делаем анимацию
 AnimateWindow(MonthCalendar1.Handle, 200, AW_SLIDE or AW_VER_POSITIVE);
 MonthCalendar1.Visible := True;
 // ставим фокус и перекрываем оконную процедуру
 MonthCalendar1.SetFocus;
 FOldCalendarWndProc := MonthCalendar1.WindowProc;
 MonthCalendar1.WindowProc := CalendarWndProc;
end;

procedure TForm1.CalendarWndProc(var Message: TMessage);
begin
 // а в оконной процедуре реагируем на потерю фокуса
 if Message.Msg = WM_KILLFOCUS then
 begin
   // где скрываем календарь
   MonthCalendar1.Visible := False;
   // и снимаем перехват
   MonthCalendar1.WindowProc := FOldCalendarWndProc;
 end;
 // не забываем все сообщения передать старой оконной процедуре
 FOldCalendarWndProc(Message);
end;


 
Rouse_ ©   (2014-08-12 12:07) [46]

там же в оконной процедуре реагируй на выбор даты мышкой (раз стрелочки не устраивают)


 
brother ©   (2014-08-12 12:08) [47]

> Я ж говорю - не все так просто - написать свой компонент.

конечно, когда знаний не хватает на элементарное...
зы. а что это розыч так расщедрился на код?)


 
Rouse_ ©   (2014-08-12 12:09) [48]


> brother ©   (12.08.14 12:08) [47]
> зы. а что это розыч так расщедрился на код?)

Да там кода-то :)


 
С-К   (2014-08-12 12:14) [49]


> там же в оконной процедуре реагируй на выбор даты мышкой
> (раз стрелочки не устраивают)

не понял фразы.

Вопрос вот в чем - как отличить выбор даты от выбора даты стрелочками (которые листают месяцы и при этом не нужно скрывать календарь).


 
Rouse_ ©   (2014-08-12 12:30) [50]


> Вопрос вот в чем - как отличить выбор даты от выбора даты
> стрелочками (которые листают месяцы и при этом не нужно
> скрывать календарь).

На, последний раз подсказываю, дальше сам, не буду же я за тебя весь код писать?

procedure TForm1.CalendarWndProc(var Message: TMessage);

 procedure Hide;
 begin
   // где скрываем календарь
   MonthCalendar1.Visible := False;
   // и снимаем перехват
   MonthCalendar1.WindowProc := FOldCalendarWndProc;
 end;

 procedure SetNewValue;
 begin
   Hide;
   ShowMessage(DateToStr(MonthCalendar1.Date));
 end;

begin

 case Message.Msg of
   // а в оконной процедуре реагируем на потерю фокуса
   WM_KILLFOCUS, WM_CANCELMODE: Hide;
   // реагируем на выбор мышкой
   WM_LBUTTONUP: SetNewValue;
   WM_CHAR:
   begin
     case Message.WParam of
       // реагируем на выбор клавишей Enter
       VK_RETURN: SetNewValue;
       // закрываем по ESC
       VK_ESCAPE: Hide;
     end;
   end;
 end;

 // не забываем все сообщения передать старой оконной процедуре
 FOldCalendarWndProc(Message);
end;


 
junglecat   (2014-08-12 12:35) [51]

Ну вот, Розыч практически написал сторонний компонент. А по правилам его юзать нельзя o)


 
С-К   (2014-08-12 12:37) [52]


> На

я не понял по коду как отличить то в результате? И то и другое является кликом. Но клик по стрелочкам не должен скрывать календарь.


 
junglecat   (2014-08-12 12:44) [53]

скрывать календарь можно кликом по форме либо по кнопке раскрытия. Определить можно по координатам


 
Rouse_ ©   (2014-08-12 12:46) [54]


>  И то и другое является кликом. Но клик по стрелочкам не
> должен скрывать календарь.

А, ну да, с этим ты не разберешся, тогда вот так :)))

procedure TForm1.CalendarWndProc(var Message: TMessage);

 procedure Hide;
 begin
   // где скрываем календарь
   MonthCalendar1.Visible := False;
   // и снимаем перехват
   MonthCalendar1.WindowProc := FOldCalendarWndProc;
 end;

 procedure SetNewValue;
 begin
   Hide;
   ShowMessage(DateToStr(MonthCalendar1.Date));
 end;

 function NeedCloseUp(X, Y: Integer): Boolean;
 const
   MCM_GETCURRENTVIEW = (MCM_FIRST + 22);
 var
   MCHitTest: TMCHitTestInfo;
 begin
   Result := False;
   ZeroMemory(@MCHitTest, SizeOf(TMCHitTestInfo));
   MCHitTest.cbSize := SizeOf(TMCHitTestInfo);
   MCHitTest.pt := Point(X, Y);
   MonthCal_HitTest(MonthCalendar1.Handle, MCHitTest);
   if MCHitTest.uHit and MCHT_CALENDARDATE = MCHT_CALENDARDATE then
     Result := SendMessage(MonthCalendar1.Handle, MCM_GETCURRENTVIEW, 0, 0) = 0
   else
     if MCHitTest.uHit and MCHT_TODAYLINK = MCHT_TODAYLINK then
       Result := True;
 end;

begin

 case Message.Msg of
   // а в оконной процедуре реагируем на потерю фокуса
   WM_KILLFOCUS, WM_CANCELMODE: Hide;
   // реагируем на выбор мышкой
   WM_LBUTTONUP:
     if NeedCloseUp(TWMMouse(Message).XPos, TWMMouse(Message).YPos) then
     begin
       FOldCalendarWndProc(Message);
       SetNewValue;
       Exit;
     end;
   WM_CHAR:
   begin
     case Message.WParam of
       // реагируем на выбор клавишей Enter
       VK_RETURN: SetNewValue;
       // закрываем по ESC
       VK_ESCAPE: Hide;
     end;
   end;
 end;

 // не забываем все сообщения передать старой оконной процедуре
 FOldCalendarWndProc(Message);
end;


 
brother ©   (2014-08-12 13:13) [55]

Эээ, а это по-феншую?)
> MonthCalendar1.Left := -1000;
> MonthCalendar1.Top := -1000;


 
С-К   (2014-08-12 13:13) [56]

Что-то не работает.

У меня при вызове:
> MonthCal_HitTest(MonthCalendar.Handle, MCHitTest);

MCHitTest.uHit - всегда равен нулю (

Правда, я не перехватывал сообщения. Просто проверил это на обработке OnClick.


 
С-К   (2014-08-12 13:14) [57]

Ну и соответственно вместо:

>(TWMMouse(Message).XPos, TWMMouse(Message).YPos

Я передаю Mouse.Cursor.X и .Y


 
junglecat   (2014-08-12 13:20) [58]

WM_LBUTTONUP - х и у относительно календаря. Mouse.Cursor.X и .Y - относительно десктопа


 
Rouse_ ©   (2014-08-12 13:20) [59]


> brother ©   (12.08.14 13:13) [55]
> Эээ, а это по-феншую?)

Это по быстрому ;)


> Правда, я не перехватывал сообщения. Просто проверил это
> на обработке OnClick.

А это не правильно.


 
brother ©   (2014-08-12 13:22) [60]

Ну, что Вы ему мастер-класс по перехвату сообщений даете? Видно же, что он код ждет и не понимает как это все работает...
Давайте уж тогда с основ...


 
brother ©   (2014-08-12 13:23) [61]

а то, он же обозначил задачу)


 
С-К   (2014-08-12 13:41) [62]


> WM_LBUTTONUP - х и у относительно календаря. Mouse.Cursor.
> X и .Y - относительно десктопа

спасибо! Все заработало.

Rouse_, спасибо большое!


 
С-К   (2014-08-12 13:44) [63]

Остался маленький глючок, конечно. Если кликнуть на область обозначений дней недели - то это засчитывается за клик-выбор даты.

На картинку обозначил проблемную область: http://bit.ly/1rlxKDT

Но это, конечно, мелочи. Спасибо за помощь.


 
Rouse_ ©   (2014-08-12 14:01) [64]

То что на картинке соответствует MCHT_CALENDARDAY при вызове MonthCal_HitTest, стало быть NeedCloseUp это должна учитывать, хотя судя по картинке у тебя какая-то старая ОС, вполне возможно что там не возвращалась эта константа.


 
С-К   (2014-08-12 14:05) [65]


>  судя по картинке у тебя какая-то старая ОС

Windows Server 2003 R2


 
С-К   (2014-08-12 14:12) [66]


> Windows Server 2003 R2

на Windows 7 абсолютно аналогично.

Еще нашел глюк. Если перейти к отображению календаря по месяцам: http://bit.ly/1pM7cfF
то клик на месяц тоже приводит к выбору даты и календарь закрывается ((
При этом в режиме отображения годов - этого не происходит. Интересно.


 
Rouse_ ©   (2014-08-12 14:29) [67]


> на Windows 7 абсолютно аналогично.

У меня Windows 7 все работает штатно, что-то значит опять не так сделал: http://rouse.drkb.ru/tmp/mct.zip


 
С-К   (2014-08-12 14:42) [68]

У тебя в таком случае uHit = 131074
А у меня, если MonthCal_HitTest делать при OnClick: 33685505

Видимо, есть какая-то разница в состоянии компонента в разное время. Хотя и не понимаю какая.. Сделаю тогда тоже на перехвате сообщения.


 
Германн ©   (2014-08-13 01:40) [69]


> С-К   (12.08.14 09:08) [38]
>
>
> > пишется за 15 минут
>
> как реализовать выпадающий календарик?
>
>
> > Ещё раз повторю TDateEdit от RxLib.
>
> еще раз повторю:
>
>
> > А сейчас требование работать на стандартных компонентах
>

Неужели трудно прежде чем прежде чем выпрашивать код здесь скачать из Инета RxLibrary(ссылок дофига) и посмотреть код упоминаемого мною компонента.
Лень матушка.



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

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

Наверх




Память: 0.66 MB
Время: 0.011 c
2-1407761173
TTN
2014-08-11 16:46
2016.02.28
Преобразование строки с датой в формат даты


2-1407153497
nokia4ever
2014-08-04 15:58
2016.02.28
версия bpl


11-1263286942
magi6162
2010-01-12 12:02
2016.02.28
KOL-CE and DBGrid


15-1427053261
Kerk
2015-03-22 22:41
2016.02.28
Конкурс


2-1408100312
lewka_s
2014-08-15 14:58
2016.02.28
Изменение иконки (значка)