8

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

有谁知道是什么原因造成的以及如何解决它?

4

3 回答 3

5

我的心理调试感觉告诉我你在 Windows 上,标签是一个工具提示窗口,你在每次鼠标移动时都在更新。

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

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

于 2009-12-31T20:01:13.147 回答
4

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

在我深入了解之前我正在做的是比较以前的XY坐标并在没有变化的情况下退出:

if ( x = ZoomRect.Right ) and ( y = ZoomRect.Bottom ) then exit ;
于 2012-03-13T15:28:07.450 回答
1

Mason,我无法重现这是 Windows XP SP2 上的新 D2010(更新 4 和 5)VCL 表单应用程序。这是我所做的:

  • 文件|新建|VCL 表格申请
  • 在表单上放置了一个 TImage 和 TLabel
  • 从默认图像文件夹 (GreenBar.bmp) 中为 TImage.Picture 挑选一个随机图像
  • 在 Object Inspector 中双击 TImage.OnMouseMove 事件,添加如下代码:
    过程 TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y:整数);
    开始
      Label1.Caption := Format('X: %d Y: %d', [X, Y]);
    结尾;
  • 运行应用程序 (F9)。

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

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

于 2009-12-31T20:28:38.877 回答