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

Comment signer la connexion OKEx API version 5 avec websockets ?

La fonction GCP Cloud pour écrire des données dans BigQuery s'exécute avec succès, mais les données n'apparaissent pas dans la table BigQuery

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