【问题标题】:Builder C++ Delete all sub node in TreeNodeBuilder C++删除TreeNode中的所有子节点
【发布时间】: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


    【解决方案1】:

    在父节点上调用DeleteChildren

    ParentNode->DeleteChildren();
    

    【讨论】:

    • 谢谢@David Heffernan.. 很抱歉这个简单的问题!
    • 没关系。完全不需要抱歉。很难找到所有树视图类的方法。这是一个复杂的野兽。
    【解决方案2】:

    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();
    }
    

    【讨论】:

    • 我用递减循环修复了我的问题。但在我的情况下,避免循环更高效,我使用 DeleteChildren。谢谢雷米。谢谢大卫。
    • 您需要删除孩子,还是 Delete() 会这样做?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多