2010-02-18 7 views
4

Je dois utiliser une classe au lieu d'un enregistrement pour le nœud VirtualStringTree.Delphi, VirtualStringTree - classes (objets) à la place des enregistrements

Dois-je déclarer standard (mais dans ce cas - délicat) façon comme ça:

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

ou devrais-je utiliser directement TMyObject? Si c'est le cas, comment?! Que diriez-vous d'assigner (construire) l'objet et de le libérer? Merci d'avance m.

Répondre

8
  1. Configuration datasize pour la tenue de l'objet

    vstTree.NodeDataSize := SizeOf(TMyObject); 
    
  2. Obtenez le porte-datasize et se lient à votre objet

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

    ou

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

    ou
    utilisation de la méthode de vstTree.InsertNode

  3. Pour libérer l'objet de liaison de l'événement OnFreeNode raccordement des

    vstTree.OnFreeNode := FreeNodeMethod; 
    

    avec

    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; 
    
1

vous pouvez créer l'instance d'objet après avoir reçu les données de noeud, comme dans:

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

ou vous pouvez essayer de l'affecter directement

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

1

Et vous pouvez libérer votre objet Evénement OnFreeNode.

+0

Cela devrait être un commentaire à la réponse de Aldo. – jpfollenius

1

Ajoutez simplement une référence d'objet à votre enregistrement. Utilisez les événements OnInitNode et OnFreeNode pour créer et détruire votre objet.

Questions connexes