![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вывести пустой TDateTimePicker
С-К © (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]. Давно бы свой контрол склепал, чем время тратить на форуме.