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
Répondre
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;
votre solution est la meilleure. Absolument. – bbd
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.
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
oui, c'est ce que je l'ai prévu de faire, mais voir mise à jour. – MartynA
Je voudrais garder le node.text comme nom d'origine du noeud et ne pas y ajouter les informations. – bbd
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;
Assurez-vous d'utiliser l'événement 'TTreeView.OnDeletion' pour libérer les instances' MyRec' allouées, sinon elles seront divulguées. –
Thks. Que voulez-vous dire ? éliminer (MyrecPtr)? – bbd
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; ' –
Et avez-vous essayé quelque chose? – Frazz
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. –
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é". –