2017-12-18 26 views
0

My TListViewコントロールにShowHintsが有効で、OnInfoTipイベントを処理しています。ポップアップInfoTipボックスのメッセージは、OnInfoTipハンドラに設定されています。ただし、InfoTipポップアップボックスの位置は、リスト内の項目にマウスを重ねるときのマウスの位置に相対的です。ポジションをカスタマイズする方法はないようです。InfoTipの位置を設定する

ヒントポップアップの位置を、たとえばTListViewの特定の領域や、TListViewコントロールの境界外のフォームのどこかに設定することはできますか?理想的には、ヒントポップアップを表示して、TListView内の他のアイテムを不明瞭にする(または排除する)ようにしたいと思います。

答えて

2

まず次のようTListViewののCMHintShowを公開する必要があります。

type 
    TListView = class(Vcl.ComCtrls.TListView) 
     private 
     FPos: TPoint; 
     protected 
     procedure CMHintShow(var Message: TCMHintShow); message CM_HINTSHOW; 
     published 
     property MyPos: TPoint read FPos write FPos; 
    end; 


    TfrmMain = class(TForm) 
    ... 
    ListView1: TListView; 

はその後OnInfoTipイベントで、希望する位置を設定します。私の例では、ScrollBox(sbxFilter - TlistViewの下にあります)のTopLeft Cornerの座標を取得し、CoordをTListViewプロパティMyPosに渡します。

procedure TfrmMain.ListView1InfoTip(Sender: TObject; Item: TListItem; var InfoTip: string); 
var 
    p: TPoint; 
begin 
    InfoTip := 'Test'; 
    p := sbxFilter.ClientToScreen(point(0, 0)); 
    ListView1.MyPos := p; 
end; 


{ TListView } 

procedure TListView.CMHintShow(var Message: TCMHintShow); 
begin 
    inherited; 
    Message.HintInfo.HintPos := FPos; 
end; 
+1

これはうまく動作します。私は自分のTListViewサブクラスの名前を 'THintPostListView'と命名し、宣言と関数を別々の基本単位に入れて、フォームが必要に応じてコントロールを使用できるようにしました。コントロールを使用するフォームの上部では、この例のように 'TListView = class(THintPosListView);を宣言するだけです。 – AlainD

3

たとえば、OnInfoTip()イベントで定義したヒントを表示することができます。 StatusBarStatusPanel(フォームの最下部)。例えば

procedure TForm1.ListView1InfoTip(Sender: TObject; Item: TListItem; 
    var InfoTip: string); 
begin 
    InfoTip := ''; 
    StatusBar1.Panels[0].Text := 'ListView Infotip, Item '+IntToStr(Item.Index); 
end; 
+0

ニース、簡単な解決策!ただし、ヒントの詳細を表示するには、フォームのどこかに未使用のスペースが必要です。 – AlainD

関連する問題