4

VirtualStringTreeノードのレコードの代わりにクラスを使用する必要があります。

私はそれを次のように標準的な(しかしこの場合は-トリッキーな)方法で宣言する必要があります:

PNode = ^TNode;
TNode = record
 obj: TMyObject;
end;
//..
var
 fNd: PNode;
begin
fNd:= vstTree.getNodeData(vstTree.AddChild(nil));
fNd.obj:= TMyObject.Create; 
//..

または直接使用する必要がありますTMyObjectか?もしそうなら-どのように?!オブジェクトを割り当て(構築)して解放するのはどうですか?

よろしくお願いしますm。

4

4 に答える 4

8
  1. オブジェクトを保持するためのデータサイズを設定します

    vstTree.NodeDataSize := SizeOf(TMyObject); 
    
  2. データサイズ ホルダーを取得し、オブジェクトにバインドします

    vstTree.getNodeData(passed in interested node)^ := your object
    

    また

    vstTree.getNodeData(vstTree.AddChild(nil))^ := TMyObject.Create;
    

    または
    vstTree.InsertNode メソッドを使用します

  3. バインディング オブジェクトを解放するには、OnFreeNode イベントをフックします。

    vstTree.OnFreeNode := FreeNodeMethod;
    

    procedure TFoo.FreeNodeMethod(Sender: TBaseVirtualTree; Node: PVirtualNode);
    var
      P: ^TMyObject;
    begin
      P := Sender.getNodeData(Node);
      if P <> nil then
      begin
          P^.Free;
          P^ := nil; //for your safety or you can omit this line
      end;
    end;
    
于 2010-02-18T22:21:57.873 に答える
1

次のように、ノード データを受け取った後にオブジェクト インスタンスを作成できます。

fNd:= vstTree.getNodeData(vstTree.AddChild(nil)); 
fnd.obj := TMbyObject.Create;

または、直接割り当ててみることもできます

Pointer(Obj) := vstTree.getNodeData(...);

于 2010-02-18T20:01:16.847 に答える
1

オブジェクト参照をレコードに追加するだけです。OnInitNodeおよびイベントを使用しOnFreeNodeて、オブジェクトを作成および破棄します。

于 2010-02-18T22:10:28.433 に答える
1

OnFreeNode イベントでオブジェクトを解放できます。

于 2010-02-18T21:53:27.297 に答える