7

我想要一个 TPageControl 和一些 TTabSheets,当我依次将鼠标悬停在每个选项卡上时,可以看到“每个选项卡”工具提示提示。

有没有办法在 Delphi 2009 中获得这种效果?

4

5 回答 5

7

只需挂钩 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;
于 2009-08-10T23:15:42.490 回答
6

Raize Components中,这可以通过将trzpagecontrol.tabhints属性设置为 来完成true。好的组件可以为您节省大量时间(因此可以节省金钱)。

(只是一个快乐的客户,顺便说一句)

来自raize.com FAQRaize Components选项卡)的更新(响应@Rigel 的评论):

Raize 组件发生了什么?

早在 2015 年,Embarcadero 从我们那里收购了 Raize Components,并将该产品重新命名为 Konopka Signature VCL Controls (KSVC)。最初他们单独销售该产品,但在过去的几个 RAD Studio 版本中,这些组件已通过 GetIt 包管理器免费提供。只需从 Delphi 或 C++Builder 工具菜单中打开 GetIt 包管理器,然后搜索“Konopka”即可找到安装程序。组件名称、单元和封装与 Raize Components 中的相同,只是产品名称不同。

于 2009-08-10T23:28:09.563 回答
1

1 - 填写 .Hint 属性,并将 PageControl 的 .ShowHint 属性设置为 True(假设每个选项卡的 ParentShowHint 设置为 true;否则您必须单独设置每个页面)。

2 - 将此事件分配给 PageControl 的 OnChange 事件处理程序:

procedure TForm1.PageControl1Change(Sender: TObject);
begin
  PageControl1.Hint := PageControl1.ActivePage.Hint;
end;

完成此操作后,提示将是活动选项卡的任何内容。我不知道如何让它根据鼠标悬停的位置改变提示 - 实际上,这是我以前从未注意到的一个有趣现象。

于 2009-08-10T20:42:39.290 回答
1

在 tPageControl.OnMouseMove 通过 Pgctrl.IndexOfTabAt( X, Y ) 找到 TabIndex 并将 TabSheet 提示分配给 tPageControl 提示

看这里:

http://www.delphigroups.info/2/9/321680.html

于 2016-10-27T09:35:43.583 回答
0

最初在一个 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] 我的回答没有太多新内容,但我发现所有这些代码和文本都太分散注意力了。

于 2018-04-19T12:18:44.903 回答