为什么我不能在 TTreeView 中创建指向 TTreeNode 的指针

Why can't I create a pointer to a TTreeNode in a TTreeView

在 Rad Studio 10.4 中使用 C++ Builder

为什么我不能创建指向 TTreeNode 的指针?

我有一个名为 BookmarksTreeTTreeView,我想遍历它的所有节点。当我尝试编译时:

TTreeNode *Node;
Node = BookmarksTree->Items[1];

我收到一个编译器错误:

assigning to 'Vcl::Comctrls::TTreeNode *' from incompatible type 'Vcl::Comctrls::TTreeNodes'

根据Vcl.ComCtrls.TCustomTreeView.Items,我应该可以使用 MyTreeNode = TreeView1->Items[[1]];

有人知道这里出了什么问题吗?

BookmarksTree->Items 是指向单个 TTreeNodes 对象的指针。您正在尝试执行指针算法来访问节点,就好像 Items 是一个 TTreeNode* 指针数组一样,事实并非如此。

您需要使用 TTreeNodes::Item[] sub-property 来代替,例如:

int count = BookmarksTree->Items->Count;
for(int i = 0; i < count; ++i)
{
    TTreeNode *Node = BookmarksTree->Items->Item[i];
    ...
}

或者,您可以使用 TTreeNodes::operator[],但这需要您先解除对 TTreeNodes* 指针的引用,例如:

int count = BookmarksTree->Items->Count;
for(int i = 0; i < count; ++i)
{
    TTreeNode *Node = (*(BookmarksTree->Items))[i];
    ...
}

或者,仅在 Clang-based 编译器中,您可以根据 C++ Iterator Support for Delphi Enumerable Types and Containers 使用 C++ 迭代器,例如:

auto iter = std::begin(BookmarksTree->Items);
auto end = std::end(BookmarksTree->Items);

while (iter != end)
{
    TTreeNode *Node = *iter++;
    ...
}

或一个range-for loop(内部使用迭代器):

for(TTreeNode *Node : BookmarksTree->Items)
{
    ...
}