ノードごとのツールヒントなどの機能によって、組み込みの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 mode
でadvancedrecords
、私のフォームユニットと私の拡張ユニットを使用しています - クラスヘルパーを使用するために:
{$mode objfpc}{$H+}
{$modeswitch advancedrecords+}
**「ユニバーサル」と、私が欲しいです少なくとも私のLazarus IDEの統合コントロールをTreeViewコントロール用に使用するが、コードを2回書くことなく拡張機能を使用する。
代わりにTTreeViewの子孫を作成し、保護されたメソッド 'procedure MouseMove(Shift:TShiftState; X、Y:Integer);をオーバーライドします。オーバーライド; ' – Abelisto
うん、クラスヘルパーのようなバロック構造を乱用しないでください。とにかく、クラスヘルパーがメソッドをオーバーライドすることを許可しているかどうかはわかりません。クラスヘルパーは松葉杖ですが、スイス軍はいいものではありません。 –
@Marco:FPCについてはわかりませんが、Delphiではクラスヘルパーが明白な理由から仮想メソッドや動的メソッドをオーバーライドできません。実際には、もともとTObjectと他のクラスを対応するC#クラスと互換性を持たせることを目的とした松葉杖です。彼らは今より多く使われていますが、彼らは松葉杖のままです。 –