我想要一个 TPageControl 和一些 TTabSheets,当我依次将鼠标悬停在每个选项卡上时,可以看到“每个选项卡”工具提示提示。
有没有办法在 Delphi 2009 中获得这种效果?
只需挂钩 Page Control 的 Mouse Move 事件并使用 TabAtPos 属性来确定鼠标悬停在哪个选项卡上。然后将该选项卡的提示分配给页面控件的提示属性。
procedure TForm.PageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: integer);
var
tabindex: integer;
begin
tabindex := PageControl.IndexOfTabAt(X, Y);
if (tabindex >= 0) and (PageControl.Hint <> PageControl.Pages[tabindex].Hint) then
begin
Application.CancelHint;
PageControl.Hint := PageControl.Pages[tabindex].Hint;
PageControl.ShowHint := true;
end;
end;
当鼠标直接从一个选项卡移动到另一个选项卡时,CancelHint/ShowHint 将负责更新提示窗口。
当鼠标直接从一个选项卡移动到另一个选项卡时,下面的改进但丑陋的版本也将 HintPause 临时更改为 0,以便立即重新显示提示。(解决方案的“丑陋”部分转到 Application.ProcessMessages 调用,该调用强制在恢复 HintPause 之前处理提示消息。)
procedure TForm.PagesMouseMove(Sender: TObject; Shift: TShiftState; X, Y: integer);
var
hintPause: integer;
tabindex: integer;
begin
tabindex := PageControl.IndexOfTabAt(X, Y);
if (tabindex >= 0) and (PageControl.Hint <> PageControl.Pages[tabindex].Hint) then
begin
hintPause := Application.HintPause;
try
if PageControl.Hint <> '' then
Application.HintPause := 0;
Application.CancelHint;
PageControl.Hint := PageControl.Pages[tabindex].Hint;
PageControl.ShowHint := true;
Application.ProcessMessages; // force hint to appear
finally Application.HintPause := hintPause; end;
end;
end;
若要隐藏主页正文上的提示,请将以下方法分配给页面控件的 OnMouseLeave 事件。
procedure TForm.PageMouseLeave(Sender: TObject);
begin
PageControl.Hint := '';
PageControl.ShowHint := false;
end;
在Raize Components中,这可以通过将trzpagecontrol.tabhints
属性设置为 来完成true
。好的组件可以为您节省大量时间(因此可以节省金钱)。
(只是一个快乐的客户,顺便说一句)
来自raize.com FAQ(Raize Components选项卡)的更新(响应@Rigel 的评论):
Raize 组件发生了什么?
早在 2015 年,Embarcadero 从我们那里收购了 Raize Components,并将该产品重新命名为 Konopka Signature VCL Controls (KSVC)。最初他们单独销售该产品,但在过去的几个 RAD Studio 版本中,这些组件已通过 GetIt 包管理器免费提供。只需从 Delphi 或 C++Builder 工具菜单中打开 GetIt 包管理器,然后搜索“Konopka”即可找到安装程序。组件名称、单元和封装与 Raize Components 中的相同,只是产品名称不同。
1 - 填写 .Hint 属性,并将 PageControl 的 .ShowHint 属性设置为 True(假设每个选项卡的 ParentShowHint 设置为 true;否则您必须单独设置每个页面)。
2 - 将此事件分配给 PageControl 的 OnChange 事件处理程序:
procedure TForm1.PageControl1Change(Sender: TObject);
begin
PageControl1.Hint := PageControl1.ActivePage.Hint;
end;
完成此操作后,提示将是活动选项卡的任何内容。我不知道如何让它根据鼠标悬停的位置改变提示 - 实际上,这是我以前从未注意到的一个有趣现象。
在 tPageControl.OnMouseMove 通过 Pgctrl.IndexOfTabAt( X, Y ) 找到 TabIndex 并将 TabSheet 提示分配给 tPageControl 提示
看这里:
最初在一个 C++ Builder 6 (!) 项目上工作(所以请原谅这个成绩单中的任何错字),我从Gerard [1]的答案开始,并尽可能地减少了代码。为了更好地控制对的调用Application.CancelHint
,我引入了成员FLastHintTabIndex
,必须用-1初始化。
procedure TForm1.PageControl1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
var
TabIndex: Integer;
begin
TabIndex := PageControl1.IndexOfTabAt(X, Y);
if FLastHintTabIndex <> TabIndex then
Application.CancelHint;
if TabIndex <> -1 then
PageControl1.Hint = PageControl1.Pages[TabIndex].Hint;
FLastHintTabIndex := TabIndex;
end;
[1] 我的回答没有太多新内容,但我发现所有这些代码和文本都太分散注意力了。