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 utiliser
MyTreeNode = 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

Posts les plus consultés de ce blog

Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"

Détecter les appuis sur les touches fléchées en JavaScript

Une chaîne vide donne "Des erreurs ont été détectées dans les arguments de la ligne de commande, veuillez vous assurer que tous les arguments sont correctement définis"