TPageControl といくつかの TTabSheets が必要です。各タブにカーソルを合わせると、「タブシートごと」のツールチップ ヒントが表示されます。
Delphi 2009 でこの効果を得る方法はありますか?
ページ コントロールの 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 は、マウスが 1 つのタブから別のタブに直接移動したときにヒント ウィンドウを更新します。
以下の改善された見苦しいバージョンでは、マウスをタブからタブに直接移動すると、HintPause が一時的に 0 に変更され、ヒントがすぐに再表示されます。(ソリューションの「醜い」部分は、HintPause が復元される前にヒント メッセージを強制的に処理する Application.ProcessMessages 呼び出しに行きます。)
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
。優れたコンポーネントを使用すると、多くの時間を節約できます (したがって、お金も節約できます)。
(ただ幸せな顧客です、ところで)
更新 (@Rigel からのコメントに応じて) raize.com FAQ ( Raize Componentsタブ) から:
Raize コンポーネントはどうなりましたか?
2015 年に Embarcadero は Raize Components を買収し、その製品を Konopka Signature VCL Controls (KSVC) としてブランド変更しました。当初、彼らは製品を個別に販売していましたが、RAD Studio の過去数回のリリースでは、コンポーネントは GetIt Package Manager を通じて無料で入手できました。Delphi または C++Builder の [ツール] メニューから GetIt パッケージ マネージャーを開き、「Konopka」を検索してインストーラーを見つけます。コンポーネント名、ユニット、およびパッケージは、製品名が異なるだけで、Raize コンポーネントと同じです。
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 ヒントに割り当てます。
ここを見て: