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-13 01:40:00) [1]


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

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


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

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

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


Rouse_   (2014-08-12 14:29:00) [3]


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

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


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


> Windows Server 2003 R2

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

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


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


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

Windows Server 2003 R2


Rouse_   (2014-08-12 14:01:00) [6]

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


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

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

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

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


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


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

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

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


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

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


brother   (2014-08-12 13:22:00) [10]

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


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

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


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


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

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


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

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


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

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

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

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


brother   (2014-08-12 13:13:00) [14]

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


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

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

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

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

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


Rouse_   (2014-08-12 12:46:00) [16]


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

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

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;


junglecat   (2014-08-12 12:44:00) [17]

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


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


> На

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


junglecat   (2014-08-12 12:35:00) [19]

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


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


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

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

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;


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

Наверх

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