为什么我不能在 TTreeView 中创建指向 TTreeNode 的指针
Why can't I create a pointer to a TTreeNode in a TTreeView
在 Rad Studio 10.4 中使用 C++ Builder
为什么我不能创建指向 TTreeNode
的指针?
我有一个名为 BookmarksTree
的 TTreeView
,我想遍历它的所有节点。当我尝试编译时:
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)
{
...
}
在 Rad Studio 10.4 中使用 C++ Builder
为什么我不能创建指向 TTreeNode
的指针?
我有一个名为 BookmarksTree
的 TTreeView
,我想遍历它的所有节点。当我尝试编译时:
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)
{
...
}