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 TTreeViewappelé BookmarksTreeet 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->Itemsest un pointeur vers un seul TTreeNodesobjet. Vous essayez d'effectuer une arithmétique de pointeur pour accéder à un nœud comme s'il Itemss'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