在Delphi 2009中有没有办法实现这种效果?
只需挂接页面控件的MouseMove事件并使用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;
procedure TForm.PageMouseLeave(Sender: TObject);
begin
PageControl.Hint := '';
PageControl.ShowHint := false;
end;
trzpagecontrol.tabhints
属性设置为true
来实现。好的组件可以节省很多时间(因此也节省了金钱)。Raize Components发生了什么?
回到2015年,Embarcadero从我们这里收购了Raize Components,并将产品重新命名为Konopka Signature VCL Controls(KSVC)。最初他们单独销售该产品,但在过去几个RAD Studio版本中,这些组件已经通过GetIt包管理器免费提供。只需从Delphi或C ++ Builder Tools菜单中打开GetIt Package Manager,然后搜索“Konopka”以查找安装程序。组件名称、单元和包与Raize Components中的相同,只是产品名称不同。
1 - 填写.Hint属性,并将.ShowHint属性设置为True,适用于PageControl(假设每个选项卡都已将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] 我的回答并没有太多新内容,但我发现所有那些代码和文本太过分散注意力。