Firemonkey 10.3中的“鼠标离开”事件

时间:2019-12-21 09:48:41

标签: delphi firemonkey delphi-10.3-rio

我有一个带有控件(myControl)和一个子控件(myChildControl)的表单。

我想管理myControl上的鼠标出口,以便采取一些措施。

问题在于,即使鼠标仍物理位于myControls内,但仍超过myChildControl时,都会触发“离开鼠标”事件,而在这种情况下,我不需要触发该事件。

我无法在子控件中设置HitTest属性,因为我也需要对其上的鼠标事件进行一些操作。

从概念上讲,“鼠标离开”事件可以正确触发,但是处理这种情况的最干净的方法是什么?

1 个答案:

答案 0 :(得分:0)

为子控件设置HitTest = False。然后,在父控件的OnMouseDown中,使用PtInRect()检查是否在子控件上发生了鼠标按下事件。

如果需要,您也可以对其他鼠标事件执行相同的操作。


在对几个子控件发表评论后,

编辑

我不太同意您的凌乱。下面的示例针对父控件(此示例中为TPanel)上可能需要响应鼠标按下事件的任意数量的子控件。 IMO,将最后两行添加到其他最终事件也没什么大不了的。

procedure TForm20.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
var
  ctrl: TControl;
begin
  for ctrl in (Sender as TControl).Controls do
    if PtInRect(ctrl.ParentedRect, PointF(X, Y)) then
      if assigned(ctrl.OnMouseDown) then
        ctrl.OnMouseDown(ctrl, Button, Shift, x-ctrl.Position.X, y-ctrl.Position.Y);
end;

一种完全不同的方法是使用父控件所在的控件的OnMouseEnter事件(或者如果放置在没有OnMouseEnter的窗体上,请使用OnMouseMove),以触发OnExit替代项。由于这很可能会触发,因此可以通过声明ActionRequired

的布尔值来避免不必要的操作