2009-11-20 1 views
0

Мне нужно определить событие OnMouseLeave для компонента TDateTimePicker, но оно не содержит такого события в списке событий. Есть ли способ обнаружить его вручную?Как поймать событие onmouseleave для компонента TDateTimePicker в Delphi 7

+0

Не совсем уверен, что вы имеете в виду здесь. TDateTime - это базовый тип данных, а не компонент. –

+0

Вы имеете в виду компонент TDateTimePicker? –

+0

Ops, yes TDateTimePicker :) –

ответ

2

Вы можете снять защиту с 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; 
+0

Независимо от того, защищена ли она, не имеет значения. Обработчики сообщений могут быть закрытыми и все еще переопределяемыми. Трюк здесь заключается в том, что вы можете поместить этот класс выше своего объявления класса формы, а затем автоматически получить новое поведение без необходимости установки нового компонента. Чтобы сделать это без использования трюков, просто назначьте новое значение для свойства 'WindowProc' элемента управления. –

+0

Эта вещь работает только один раз, когда сообщение OnMOuseLeave было поймано, оно больше не работает. Кто-нибудь знает, почему? –

+0

Для меня это работает каждый раз, когда вы покидаете контроль. – Linas

-2

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, а затем делать то, что обработка вы хотите (если мой пример, я просто играть с цветами)

Надежда это дает вам работу вокруг ,

+0

Название вопроса гласит Delphi 7. Событие 'OnExit' не обрабатывает движение мыши, а только движение curosr. –

+0

Yep, TDateTimePicker, но OnExit - это совсем другое. –

+0

Извините, мой браузер отключил версию Delphi ... Вы можете попробовать захватить событие onMessage и ответить на сообщение CMMouseLeave. – Sparky

0

JVCL имеет элемент управления datetimepicker, и он должен иметь события OnMouseEnter/OnMouseLeave независимо от версии Delphi (у AFAIK все элементы управления JVCL есть).

 Смежные вопросы

  • Нет связанных вопросов^_^