2017-03-27 3 views
-2

Je voudrais ajouter des informations aux nœuds chaque fois que je remplis un Treeview. Je veux dire par exemple, quand je crée un ChildNode je voudrais le lier avec son degré de kinhsip. Peut-être que les données de la propriété est faite pour cela, mais je ne sais pas comment le gérer.Delphi treeview ajouter des informations à tous les nœuds

+0

Et avez-vous essayé quelque chose? – Frazz

+1

Assez vague et peu claire. Nous ne savons même pas quel contrôle vous utilisez. Il y a l'arborescence VCL, l'arborescence FMX, l'arborescence virtuelle. Et nous ne savons pas ce que vous liez par "lien avec son degré de parenté". S'il vous plaît modifier la question pour le rendre plus clair. Commencez par lire ces articles sur [l'aide] plus attentivement. –

+0

Vos commentaires à la seule réponse que vous avez obtenu, indiquent que votre question n'est pas complète. La propriété 'Data' est probablement la plus simple et la bonne, mais il n'y a vraiment aucune idée de répondre à votre question avant de remplir tous les détails manquants dans votre question. Les détails qui déterminent si la réponse sera acceptée par vous. Btw, quel type de données est le "degré de parenté". –

Répondre

1

En supposant que vous utilisez le composant de VCL TTreeView, et non le composant de FireMonkey TTreeView, ou une autre vue arborescente 3ème partie, le La meilleure façon de gérer cette situation est de dériver une nouvelle classe de la classe TTreeNode de la VCL et d'y ajouter un champ personnalisé pour contenir la valeur souhaitée, puis vous pouvez utiliser l'événement TTreeView.OnCreateNodeClass pour laisser TTreeView créer des instances de votre classe:

type 
    TMyTreeNode = class(TTreeNode) 
    public 
    Toto: Real; 
    end; 

procedure TMyForm.TreeView1CreateNodeClass(Sender: TCustomTreeView; var NodeClass: TTreeNodeClass); 
begin 
    NodeClass := TMyTreeNode; 
end; 

Ensuite, chaque fois que vous ajoutez un nouveau nœud, ou besoin pour récupérer la valeur personnalisée d'un nœud existant, vous pouvez simplement taper moulé un pointeur TTreeNode-TMyTreeNode pour accéder à votre champ personnalisé:

Node := TreeView1.Items.Add(nil, '...'); 
TMyTreeNode(Node).Toto := ...; 

Node := TreeView1.Items.AddChild(Node, '...'); 
TMyTreeNode(Node).Toto := ...; 

... 

Value := TMyTreeNode(TreeView1.Items.Item[index]).Toto; 
+0

votre solution est la meilleure. Absolument. – bbd

0

Vous pouvez utiliser OnAddition événement pour faire du TTreeView:

procedure TForm1.TreeView1Addition(Sender: TObject; Node: TTreeNode); 
begin 
    Caption := 'Added ' + Node.Text + ', child count: ' +IntToStr(Node.Count); 
    if Node.Parent <> Nil then 
    Node.Text := Node.Text + ', child of ' + Node.Parent.Text; 

end; 

Mise à jour Il semble de vos commentaires que TTreeView est pas vraiment le bon endroit pour commencer à partir de ce que vous pouvez faire conditions d'ajout aux propriétés de treenode. Le point est, TTreeView est un wrapper tout à fait autour d'un des contrôles communs de Windows.

vous auriez beaucoup plus de contrôle si vous utilisez TVirtualStringTree à la place - il est l'un des composants de cette bibliothèque: https://github.com/Virtual-TreeView /Virtual-TreeView,

parce que les données de nœud d'arborescence est complètement défini par l'utilisateur.

+0

Thks MArtynA. J'ai essayé votre code, il a affiché les informations dans la légende du formulaire. Ce que j'aimerais, c'est quand je sélectionne un nœud pour connaître les informations précises le concernant. J'ai écrit sur le «degré de parenté», peu importe ce que c'est, cela pourrait être l'âge par exemple. Je pourrais écrire cette information dans node.text mais je préférerais écrire seulement le nom dans la propriété de texte. – bbd

+0

oui, c'est ce que je l'ai prévu de faire, mais voir mise à jour. – MartynA

+0

Je voudrais garder le node.text comme nom d'origine du noeud et ne pas y ajouter les informations. – bbd

-2

ici est:

type 
PMyrec = ^TMyrec; 
TMyrec = record 
toto: double; 
end; 

...

procedure TForm1.addnodewithdata(Sender: TObject); 
    var 
    NewNode : TTreeNode; 
    Myrec:double; 
    MyrecPtr: PMyrec; 
    begin 
     new(MyrecPtr); 
     MyrecPtr^.toto:=1000.; 
     NewNode := treeview1.Items.AddChildObject(Node, 'name',MyrecPtr); 
    end; 

    procedure TForm1.readdataofselectenode(Sender: TObject); 
    var 
    CNode : TTreeNode; 
    begin 
    Cnode:=treeview1.Items[strtoint(edit1.Text)]; 
    if (cnode.Data <> nil) then   
    showmessage(floattostr(PMyrec(cnode.Data)^.toto)); 
    end; 
+1

Assurez-vous d'utiliser l'événement 'TTreeView.OnDeletion' pour libérer les instances' MyRec' allouées, sinon elles seront divulguées. –

+0

Thks. Que voulez-vous dire ? éliminer (MyrecPtr)? – bbd

+0

Oui, vous devez 'Dispose()' tout ce que vous allouez avec 'New()', par exemple: 'procedure TForm1.TreeView1Deletion (Sender: TObject; Node: TTreeNode); commencer Dispose (PMyRec (Node.Data)); Node.Data: = nil; fin; ' –