Delphi中的ListView提示闪烁问题

4
当鼠标移动时,提示信息会一直闪烁,即使在同一行中也是如此。尝试设置双缓冲,但没有结果。还尝试将代码移动到鼠标事件上,但仍然是相同的问题。参考链接:http://delphi.about.com/od/delphitips2007/qt/listview_hints.htm
procedure TForm1.ListView2InfoTip(Sender: TObject; Item: TListItem;
  var InfoTip: string);
begin
      InfoTip := 'Gracz: ' + InfoTip + #13#10 + hintyStreamyObecne[Item.Index] ;
end;

我正在使用Delphi XE5。在PageControl上放置了Listview。当我为Application.HintPause设置非常低的值并勾选/取消复选框时,可以看到相同的提示闪烁。使用Application.HintPause的默认值对于ListView没有帮助。每次鼠标位置改变时都会触发ListView2InfoTip事件。有什么建议吗?

闪烁有多严重?我在我的应用程序中只能看到一点点,但是现在你提到了它。 - David Heffernan
非常烦人。我上传了一个视频(鼠标不可见,没有录制时更加强烈)https://www.youtube.com/watch?v=NQf38BM8Kic&feature=youtu.be - mca64
这确实非常令人恼火。我有一种感觉,提示的大小使它比我的更糟糕。我的只是一行。 - David Heffernan
是的,不幸的是。我总是可以将这些额外信息移动到弹出菜单下的窗口消息中,但我希望能够解决我的问题,因为提示对此更好。 - mca64
我可以。一个 THintWindow - TLama
显示剩余4条评论
1个回答

3
如果你使用的是Delphi.About.com的代码,我建议你进行以下更改:
在该代码中,这行应做如下修改:
li := ListView1.GetItemAt(pt.x, pt.y) ;

该函数用于确定鼠标指针所在的项。

现在我要做的是创建一些全局变量,或者更好的方法是将另一个字段添加到ListView组件中,用于存储最后一次显示提示的ListItem的引用。

然后,我会添加一个简单的检查,以查看通过上面的代码获取的当前ListItem是否与我们存储在新变量/字段中的那个相同。如果不同,我们则触发提示的显示,否则我们仅退出此过程。

var oli: TListItem; //Here we store reference to TListItem to which we shown hint last time

implementation

procedure TMyForm.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);

...
begin
  ...
  li := ListView1.GetItemAt(pt.x, pt.y) ;    
  if oli = li then Exit
  else
    oli := li;
    //hint showing code
  end;
end;

这个代码修改将确保只有当鼠标移动到另一个项目上时才会显示新提示,而不是在每次鼠标移动时都显示。

-1 提示在框架的不同层次上进行处理,代码非常复杂。您不能通过向单个控件的 OnMouseMove 事件添加一点代码来实现提示。 - David Heffernan
Zarko Gajic在delphi.about.com上的代码确实可以做到这一点。它动态地更改提示内容,然后使用Application.ActivateHint(Mouse.CursorPos)强制显示提示。OP遇到的问题是它在每次鼠标移动时都会触发,这会导致由于提示重新/绘制而出现闪烁。因此,我建议减少请求提示重新/绘制的次数,这应该可以消除闪烁。 - SilverWarior
如果您在答案中包含了完整的解释,那么我会很高兴。 - David Heffernan
我刚刚写了需要对Zarko的代码进行哪些更改。由于我目前在工作中没有访问Delphi,所以我可以在回家后编写完整的代码。 - SilverWarior
我想我之前尝试过减少提示分配,但我不知道我必须从对象检查器中删除"OnInfoTip" - 我只是删除了begin end之间的代码。 - mca64

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接