7

TPageControl といくつかの TTabSheets が必要です。各タブにカーソルを合わせると、「タブシートごと」のツールチップ ヒントが表示されます。

Delphi 2009 でこの効果を得る方法はありますか?

4

5 に答える 5

7

ページ コントロールの 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;
于 2009-08-10T23:15:42.490 に答える
6

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 コンポーネントと同じです。

于 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 に答える