【问题标题】:How to catch onmouseleave event for TDateTimePicker component in Delphi 7如何在 Delphi 7 中捕获 TDateTimePicker 组件的 onmouseleave 事件
【发布时间】:2023-03-10 19:42:01
【问题描述】:

我需要为TDateTimePicker 组件检测OnMouseLeave 事件,但它在事件列表中不包含此类事件。有办法手动检测吗?

【问题讨论】:

  • 不太清楚你在这里指的是什么。 TDateTime 是一种基本数据类型,而不是组件。
  • 你的意思是TDateTimePicker组件吗?

标签: delphi events datetime mouseevent onmouseout


【解决方案1】:

您可以取消保护 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 消息,它就不再工作了。有人知道为什么吗?
  • 好的,我发现了问题所在,现在可以了!谢谢 :) 另一个问题出现了,我如何确定是哪个组件发送了这条消息?
【解决方案2】:

JVCL 有一个 datetimepicker 控件,无论 Delphi 版本如何,它都应该有 OnMouseEnter/OnMouseLeave 事件(AFAIK 所有 JVCL 控件都有这些)。

【讨论】:

    【解决方案3】:

    TDateTime 不是可视组件,因此它不会有鼠标离开事件。你能检查一下实际的组件(它是日期时间选择器吗?) onExit 事件应该处理鼠标离开可视控件。

    了解您使用的是哪个版本的 Delphi 也会很有帮助

    谢谢...

    对不起,我昨天可以提供更多帮助,我所在的计算机没有安装 Delphi。要为不导出它的特定控件获取鼠标离开事件,请尝试以下操作。 (此代码在包含日期时间选择器控件的表单上)

    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 事件不处理鼠标移动,仅处理光标移动。
    • 是的,TDateTimePicker,但 OnExit 完全不同
    • 对不起,我的浏览器关闭了Delphi版本...您可以尝试捕获onMessage事件并响应CMMouseLeave消息。
    猜你喜欢
    • 2015-02-15
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 2022-12-05
    • 2021-07-18
    • 1970-01-01
    • 2021-03-13
    • 2016-12-27
    相关资源
    最近更新 更多