Мне нужно определить событие OnMouseLeave
для компонента TDateTimePicker
, но оно не содержит такого события в списке событий. Есть ли способ обнаружить его вручную?Как поймать событие onmouseleave для компонента TDateTimePicker в Delphi 7
ответ
Вы можете снять защиту с CMMouseLeave.
TDateTimePicker = class(ComCtrls.TDateTimePicker)
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
end;
{ TDateTimePicker }
procedure TDateTimePicker.CMMouseLeave(var Message: TMessage);
begin
{do something};
end;
Независимо от того, защищена ли она, не имеет значения. Обработчики сообщений могут быть закрытыми и все еще переопределяемыми. Трюк здесь заключается в том, что вы можете поместить этот класс выше своего объявления класса формы, а затем автоматически получить новое поведение без необходимости установки нового компонента. Чтобы сделать это без использования трюков, просто назначьте новое значение для свойства 'WindowProc' элемента управления. –
Эта вещь работает только один раз, когда сообщение OnMOuseLeave было поймано, оно больше не работает. Кто-нибудь знает, почему? –
Для меня это работает каждый раз, когда вы покидаете контроль. – Linas
TDateTime не является визуальным компонентом, поэтому у него не было бы события оставления мыши. Вы можете проверить фактический компонент (это выбор времени?) Событие onExit должно обрабатывать мышь, оставляя визуальный контроль.
Было бы также полезно знать, какую версию Delphi вы используете
Благодаря ...
Жаль, что я мог бы предложить больше помощи вчера, компьютер я был на не установлен Delphi. Чтобы получить событие Mouse Leave для определенного элемента управления, который его не экспортирует, попробуйте следующее. (Этот код находится в форме, держащего время управления выбора даты)
procedure TForm1.FormCreate(Sender: TObject);
begin
application.OnMessage := AppMsg;
// Save the windows hande of the date time picker...
DTWind := DateTimePicker1.handle;
end;
procedure TForm1.AppMsg(var Msg: TMsg; var Handled: Boolean);
begin
// If we find a mouse leave event, for the date/time picker,
// then do something
if (msg.message = 160) and
(msg.hwnd = DTWind)
then
begin
if dateTimePicker1.color = clBlue
then dateTimePicker1.Color := clRed
else dateTimePicker1.Color := clBlue;
end;
end;
Создать процедуру, чтобы получить сообщения приложения (AppMsg) и назначить его к событию OnMessage объекта приложения. Сохраните дескриптор окна элемента управления dateTimePicker.
В рамках процедуры, посмотрите на сообщение отпуска мышь от управления DateTimePicker, а затем делать то, что обработка вы хотите (если мой пример, я просто играть с цветами)
Надежда это дает вам работу вокруг ,
Название вопроса гласит Delphi 7. Событие 'OnExit' не обрабатывает движение мыши, а только движение curosr. –
Yep, TDateTimePicker, но OnExit - это совсем другое. –
Извините, мой браузер отключил версию Delphi ... Вы можете попробовать захватить событие onMessage и ответить на сообщение CMMouseLeave. – Sparky
JVCL имеет элемент управления datetimepicker, и он должен иметь события OnMouseEnter/OnMouseLeave независимо от версии Delphi (у AFAIK все элементы управления JVCL есть).
Не совсем уверен, что вы имеете в виду здесь. TDateTime - это базовый тип данных, а не компонент. –
Вы имеете в виду компонент TDateTimePicker? –
Ops, yes TDateTimePicker :) –