如何检测是否在mousemove事件中将鼠标移动到TImage组件内的左,右,上或下?

时间:2018-08-20 16:26:47

标签: delphi delphi-10-seattle onmousemove timage

我想知道如何检测我将鼠标移动到哪一侧:mousemove事件中TImage组件的左,右,上,下?

谢谢。

1 个答案:

答案 0 :(得分:1)

下面是一个在FMX项目中使用的示例。对于VCL项目,您将使用整数变量。

首先,例如在表单的私有部分中声明两个变量Xold, Yold: single;

private
  Xold, Yold: Single;

初始化这些变量,例如以OnCreate()形式的事件。使用NaN需要在uses子句中使用System.Math

procedure TForm5.FormCreate(Sender: TObject);
begin
  Xold := NaN;
  Yold := NaN;
end;

然后,在OnMouseMove()事件中,计算水平和垂直方向的移动,负值表示向左或向上移动,正向或向下移动。

procedure TForm5.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Single);
var
  horz, vert: Single;
begin
  if not IsNan(Xold) then horz := X - Xold else horz := 0;
  if not IsNan(Yold) then vert := Y - Yold else vert := 0;
  Xold := X; // save new values
  Yold := Y; //
  // use horz and vert as needed
  Label1.Text := Format('h: %f, v: %f',[horz, vert]);
end;

当鼠标离开图像时,您可能还想将XoldYold变量重置为NaN

procedure TForm5.Image1MouseLeave(Sender: TObject);
begin
  Xold := NaN;
  Yold := NaN;
end;

有人在评论中问,为什么初始化为NaN而不是零? Xold := 0; Yold := 0是左上角。如果鼠标进入图像发生在例如右侧,第一步是从0跳到图像宽度。使用NaN,我们可以忽略第一个条目作为移动,而仅将入口点存储在XoldYold中,以用于下一步移动。