如何确保要与列表视图项目相关联的气球提示正确放置,使其位于相关项目的旁边,并始终在屏幕上显示完整的气球文本?
例如,如果我在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。
答案 0 :(得分:4)
DisplayRect
给出相对于包含项目而不是表单的列表视图的客户坐标。因此,在转换为屏幕坐标时,必须使用listview作为基础,而不是以下形式:
R := Item.DisplayRect(drBounds);
R.TopLeft := ListView1.ClientToScreen(R.TopLeft); // <--
R.BottomRight := ListView1.ClientToScreen(R.BottomRight); // <--