为什么在D2010中鼠标不移动时OnMouseMove会反复触发?

时间:2009-12-31 19:49:30

标签: delphi event-handling delphi-2010 onmousemove

我正在将Delphi 5应用程序移植到D2010,我遇到了一些问题。在一个窗体上是一个带有OnMouseMove事件的TImage组件,当鼠标移动到图像上时,该事件应该更新标签。这在原始应用程序中运行得很好,但是现在OnMouseMove事件会在鼠标悬停在图像上时不断触发,无论它是否在移动,这会导致标签闪烁可怕。

有谁知道造成这种情况的原因以及如何解决这个问题?

3 个答案:

答案 0 :(得分:5)

我的通灵调试意识告诉我你在Windows上,标签是工具提示窗口,你正在更新每个鼠标移动。

严肃地说,当我们切换到Vista时,我已经通过工具提示窗口看到了这个问题。当您更新它们时,似乎更新版本的Windows工具提示窗口以某种方式生成WM_MOUSEMOVE消息。我能找到的唯一解决方法是仅在文本实际更改时更新标签。

所以,如果你不在窗户上,请忽略我。但是,如果您使用的是Windows,请尝试仅在实际更改时更新标签文本。

答案 1 :(得分:4)

由于我无法添加评论,因此我正在使用答案部分来确认此行为更改。我有一个在Delphi 2007中开发的项目,其中OnMouseMove事件仅在鼠标位置发生变化时被调用。我发现,随着XE OnMouseMove不断被调用相同的代码。我不知道为什么,因为它们都是由WM_MOUSEMOVE触发的。

在我到达底部之前,我正在做的是比较之前的XY坐标,如果没有变化则退出:

if ( x = ZoomRect.Right ) and ( y = ZoomRect.Bottom ) then exit ;

答案 2 :(得分:1)

Mason,我无法重现这是Windows XP SP2上新的D2010(Update 4& 5)VCL Forms应用程序。这是我做的:

  • 文件|新建| VCL表单应用程序
  • 在表单上删除了TImage和TLabel
  • 从TImage.Picture的默认图像文件夹(GreenBar.bmp)中挑选一张随机图像
  • 双击Object Inspector中的TImage.OnMouseMove事件,并添加以下代码:
    procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      Label1.Caption := Format('X: %d Y: %d', [X, Y]);
    end;
  • 跑完申请表(F9)。

标签显示“Label1”(当然是默认标题),直到我第一次将鼠标移到图像上。然后它正确更新以显示X和Y坐标。只要我将鼠标指针移出图像,标签就会停止更新。

它似乎是您特定代码中的某些内容,或某些特定于您正在使用的Windows版本的内容,而不是Delphi 2010本身。