【发布时间】:2015-03-13 09:53:57
【问题描述】:
如何删除某个树节点中的所有子节点?
TTreeNode* ParentNode = TreeView->Selected;
int countNode = ParentNode->Count;
for(int p=0; p<countNode-1; p++)
{
ParentNode->Item[p]->Delete();
}
此代码不起作用!
【问题讨论】:
标签: c++builder vcl
如何删除某个树节点中的所有子节点?
TTreeNode* ParentNode = TreeView->Selected;
int countNode = ParentNode->Count;
for(int p=0; p<countNode-1; p++)
{
ParentNode->Item[p]->Delete();
}
此代码不起作用!
【问题讨论】:
标签: c++builder vcl
在父节点上调用DeleteChildren:
ParentNode->DeleteChildren();
【讨论】:
David 给了你正确的答案(使用TTreeNode::DeleteChildren()),但你也应该明白为什么你的原始代码会失败,这样你以后就不会再犯同样的错误了。
您正在从第一个子节点循环到最后一个子节点,同时删除每个节点。每次删除一个子节点时,父节点的Count 会递减,但您没有相应地更新您的countNode 变量,并且每个后续子节点的索引都会递减,但您在访问Item[p] 时没有考虑到这一点。
编写这样一个循环的正确方法看起来更像这样:
TTreeNode* ParentNode = TreeView->Selected;
int countNode = ParentNode->Count;
for(int p = 0; p < countNode; ++p)
{
ParentNode->Item[0]->Delete();
}
或者:
TTreeNode* ParentNode = TreeView->Selected;
int countNode = ParentNode->Count;
while (countNode > 0)
{
ParentNode->Item[0]->Delete();
--countNode;
}
或者:
TTreeNode* ParentNode = TreeView->Selected;
int countNode = ParentNode->Count;
for(int p = countNode-1; p >= 0; --p)
{
ParentNode->Item[p]->Delete();
}
【讨论】:
Delete() 会这样做?