Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вывести пустой TDateTimePicker


Страницы:   1 2 3 4

С-К ©   (2014-08-08 17:44:00) 

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

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

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

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


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


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

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

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


Rouse_   (2014-08-12 12:09:00) [22]


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

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


brother   (2014-08-12 12:08:00) [23]

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

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


Rouse_   (2014-08-12 12:07:00) [24]

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


Rouse_   (2014-08-12 12:05:00) [25]


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

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

 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;


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

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

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

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


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

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

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

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


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

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

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

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


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

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


Rouse_   (2014-08-12 10:24:00) [30]


> С-К   (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;


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

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

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


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


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

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


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

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


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



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

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


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


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

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

:)


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


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

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


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


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

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


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


  (2014-08-11 20:37:00) [36]

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


Rouse_   (2014-08-11 20:05:00) [37]

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


Rouse_   (2014-08-11 20:04:00) [38]


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

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


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


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

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


Rouse_   (2014-08-11 19:55:00) [40]


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

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


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо