Delphi正确放置与列表视图项关联的气球提示

时间:2019-01-10 22:38:31

标签: delphi listitem

如何确保要与列表视图项目相关联的气球提示正确放置,使其位于相关项目的旁边,并始终在屏幕上显示完整的气球文本?

例如,如果我在Windows资源管理器中编辑文件名时输入了无效字符,则会弹出一个气球,提示无效字符是什么。即使列表项靠近屏幕边缘或部分不在屏幕上,整个气球也会始终显示在屏幕上。尾部始终位于列表项的中间底部。气泡通常在尾巴的右下角,但是如果列表项位于屏幕的底部和/或右边缘附近,则气泡可能在尾巴的右上方。

基本上,我无法使气泡和尾巴保持在列表项附近。

procedure TForm1.ListEdited(Sender: TObject; Item: TListItem;
var S: string);
var
  AHint: string;
  R: TRect;
  B : TBalloonHint;
begin
  if TRegEx.IsMatch(S, '[\\/:*?"<>|]') then
  begin
    AHint := 'A file name cannot contain any of the following' + sLineBreak +
      'characters:  \/:*?"<>|';
    R := Item.DisplayRect(drBounds);
    R.TopLeft := ClientToScreen(R.TopLeft);
    R.BottomRight := ClientToScreen(R.BottomRight);

    B := TBalloonHint.Create(Self);
    B.Description := AHint;
    B.HideAfter := 5000;
    B.ShowHint(R);

    S := TRegEx.Replace(S, '[\\/:*?"<>|]', '');
  end;
end;

我尝试了ShowHint的各种重载,以及JEDI气球提示组件。我还调整了矩形的Top属性,当该项目在屏幕的某个区域中时,可以使气球更好地定位,但是当该项目在屏幕的其他部分时,气球将处于关闭位置。 / p>

Delphi 10.3 Rio,Win 7 x64。

1 个答案:

答案 0 :(得分:4)

DisplayRect给出相对于包含项目而不是表单的列表视图的客户坐标。因此,在转换为屏幕坐标时,必须使用listview作为基础,而不是以下形式:

R := Item.DisplayRect(drBounds);
R.TopLeft := ListView1.ClientToScreen(R.TopLeft);         // <--
R.BottomRight := ListView1.ClientToScreen(R.BottomRight); // <--