gpt4 book ai didi

Delphi 正确定位与 ListView 项关联的气球提示

转载 作者:行者123 更新时间:2023-12-03 15:26:35 24 4
gpt4 key购买 nike

如何确保我想要与 ListView 项目关联的气球提示正确定位,以便它位于相关项目旁边,并始终在屏幕上显示完整的气球文本?

例如,如果我在 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 属性,当项目位于屏幕的某个区域时,这可能会更好地定位气球,但当项目位于屏幕的其他部分时,气球就会偏离位置。

Delphi 10.3 Rio,Win 7 x64。

最佳答案

DisplayRect 给出相对于包含项目的 ListView 的客户端坐标,而不是表单。因此,当转换为屏幕坐标时,您必须使用 ListView 作为基础,而不是表单:

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

关于Delphi 正确定位与 ListView 项关联的气球提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54137922/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com