2016-07-03 10 views
0

ノードごとのツールヒントなどの機能によって、組み込みのTreeview/TreeNodeを拡張するための汎用的な解決策を探しています。最初に私はTExtendedTreeNode = class(TTreeNode)を派生させ、問題なく動作するように見える対応するプロパティを追加しました.TextTreeNodesに各ノードの異なるツールチップを追加できます。Lazarus(Delphi/FPC):ヘルパークラスのコンストラクタが実行されない

次の手順では、TTreeView.OnMouseMoveイベントを使用して対応するツールヒントを表示したいが、普遍的な方法でこの機能を拡張する最良の解決策は何か?

私の考えでは使用していたclass helper for TTreeView

type 
    TTreeViewExtension = class helper for TTreeView 
    private 
    procedure ShowNodeToolTips(Sender: TObject; Shift: TShiftState; X, Y: Integer); 
    public 
    constructor Create(AnOwner: TComponent); 
    end; 

...

constructor TTreeViewExtension.Create(AnOwner: TComponent); 

begin 
    inherited Create(AnOwner); 

    ShowMessage('TTreeViewExtension.Create'); 

    self.OnMouseMove := @self.ShowNodeToolTips; 
end; 

コードは警告やエラーなしでコンパイルされていますが、このコンストラクタは、の作成時に実行されていません私のフォームのツリービュー。

そして、はい、私は両方でobjfpc modeadvancedrecords、私のフォームユニットと私の拡張ユニットを使用しています - クラスヘルパーを使用するために:

{$mode objfpc}{$H+} 
{$modeswitch advancedrecords+} 

**「ユニバーサル」と、私が欲しいです少なくとも私のLazarus IDEの統合コントロールをTreeViewコントロール用に使用するが、コードを2回書くことなく拡張機能を使用する。

+1

代わりにTTreeViewの子孫を作成し、保護されたメソッド 'procedure MouseMove(Shift:TShiftState; X、Y:Integer);をオーバーライドします。オーバーライド; ' – Abelisto

+0

うん、クラスヘルパーのようなバロック構造を乱用しないでください。とにかく、クラスヘルパーがメソッドをオーバーライドすることを許可しているかどうかはわかりません。クラスヘルパーは松葉杖ですが、スイス軍はいいものではありません。 –

+0

@Marco:FPCについてはわかりませんが、Delphiではクラスヘルパーが明白な理由から仮想メソッドや動的メソッドをオーバーライドできません。実際には、もともとTObjectと他のクラスを対応するC#クラスと互換性を持たせることを目的とした松葉杖です。彼らは今より多く使われていますが、彼らは松葉杖のままです。 –

答えて

2

これらのツールチップを表示するには、既に利用可能なOnHintイベントを使用しないでください。 TTreeView.OnHintイベントは既にマウスカーソルの下にあるツリーノードへの参照を返します。したがって、ノードからカスタムヒント(ツールチップ)を読むのに問題はないはずです。

ヒントが1行のテキストで表示できる場合は、このイベントメソッドで公開されている変数Hintの値を変更するだけで済みます。

クラスにイベントメソッドによって返されたNode定数を型キャストして、このような値をExtended TreeNodeから簡単に読み取ることができます。 問題のノードが実際に正しいクラスであるかどうかを確認することを忘れないでください。

procedure TForm1.TreeView1Hint(Sender: TObject; const Node: TTreeNode; 
    var Hint: string); 
begin 
    //Check to see if the node beneath the cursor is the extended node 
    if Node is TExtendedTreeNode then 
    //if it is change the hint text to the custom hint stored in the 
    //node itself 
    Hint := TExtendedTreeNode(Node).CustomHint 
    //Else change the hint to empty string so no hintbox will be shown 
    else Hint := ''; 
end; 

そして、あなたは任意のヒントテキストが表示されるようにしたいとあなたは、単に空の文字列にHint値を設定する別の方法であなたの情報を示していない場合。

procedure TForm1.TreeView1Hint(Sender: TObject; const Node: TTreeNode; 
    var Hint: string); 
begin 
    //Set Hint to empty string in order to not show any hint box 
    Hint := ''; 
    //Do some other code instead if you like 
    MessageBeep(0); 
end; 
+0

アドバイスありがとうございますが、これは私の主な質問をアプリケーションのIDEのフォームデザイナーが作成した既存および将来のすべてのTreeViewに統合するという主な問題を解決するものではありません。 私はそれを間違いなく説明しなかったかもしれません - 私の英語は最高のものではありません。 –

+0

その場合は、TTreeViewコンポーネントを追加コードで拡張し、既存のすべてのTTreeViewコンポーネントを拡張されたものに置き換えることが最善のソリューションだと思います。 – SilverWarior

+0

LazarusのようなTTreeview.OnHintイベントはありません - それはDelphiの新しいバージョンで作成され、Lazarusは後のリリースでサポートされると思います... TTreeviewOnShowHintイベントのみです - これはMouseMoveよりも優れています新しいヒントが必要なときに呼び出されますが、私は上記と同じ方法で現在のノードを決定する必要があります。 私はフォームデザイナーのビジュアルコントロールとして登録できるIDEコンポーネントの開発に取り掛かりつつあります。今私はそれが少なくとも可能であることを知っており、これは確かに最高のソリューションです。 –

関連する問題