Pourquoi ne puis-je pas créer un pointeur vers un TTreeNode dans un TTreeView
Utilisation de C++ Builder dans Rad Studio 10.4
Pourquoi ne puis-je pas créer un pointeur vers un TTreeNode
?
J'ai un TTreeView
appelé BookmarksTree
et je veux parcourir tous ses nœuds. Quand j'essaie de compiler ceci:
TTreeNode *Node;
Node = BookmarksTree->Items[1];
J'obtiens une erreur de compilation:
affectation à 'Vcl::Comctrls::TTreeNode *' à partir d'un type incompatible 'Vcl::Comctrls::TTreeNodes'
Selon Vcl.ComCtrls.TCustomTreeView.Items, je devrais pouvoir utiliserMyTreeNode = TreeView1->Items[[1]];
Quelqu'un at-il une idée de ce qui ne va pas ici?
Solution du problème
BookmarksTree->Items
est un pointeur vers un seul TTreeNodes
objet. Vous essayez d'effectuer une arithmétique de pointeur pour accéder à un nœud comme s'il Items
s'agissait d'un tableau de TTreeNode*
pointeurs, ce qui n'est tout simplement pas le cas.
Vous devez utiliser la TTreeNodes::Item[]
sous-propriété à la place, par exemple :
int count = BookmarksTree->Items->Count;
for(int i = 0; i < count; ++i)
{
TTreeNode *Node = BookmarksTree->Items->Item[i];
...
}
Alternativement, vous pouvez utiliser le TTreeNodes::operator[]
, mais cela vous oblige à déréférencer d' TTreeNodes*
abord le pointeur, par exemple :
int count = BookmarksTree->Items->Count;
for(int i = 0; i < count; ++i)
{
TTreeNode *Node = (*(BookmarksTree->Items))[i];
...
}
Alternativement, dans les compilateurs basés sur Clang uniquement, vous pouvez utiliser des itérateurs C++, par C++ Iterator Support for Delphi Enumerable Types and Containers, par exemple:
auto iter = std::begin(BookmarksTree->Items);
auto end = std::end(BookmarksTree->Items);
while (iter!= end)
{
TTreeNode *Node = *iter++;
...
}
Ou une boucle range-for (qui utilise des itérateurs en interne):
for(TTreeNode *Node: BookmarksTree->Items)
{
...
}
Commentaires
Enregistrer un commentaire