我想写一个操作TreeView的函数,当删除任何一个TreeNode的时候,当其有子结点
的话,把所有其字结点、子结点下的子结点.... 删除。我想用递归算法实现,
有那位知道呢?
函数体如下:
procedure DeleteTreeNode(DelNode:TTreeNode)
begin
end;

解决方案 »

  1.   

    treeview1.Selected.Delete;不就可以了
      

  2.   

    procedure DeleteTreeNode(DelNode:TTreeNode);
    var i,j:integer;
    begin
      if delnode.HasChildren then
      begin
        for i:=0 to delnode.Count-1 do  begin
          DeleteTreeNode(delnode.Item[i]);
           form1.Memo1.Lines.Add(delnode.Text); //------------------记录删除顺序
          delnode.Delete;    end;
      end
      else
        begin
          form1.Memo1.Lines.Add(delnode.Text);  //------------------记录删除顺序
         delnode.Delete;
        end;
    end;
      

  3.   

    http://search.csdn.net/Expert/topic/2111/2111601.xml?temp=.6050226
    这里有你想要的
      

  4.   

    不行,我在TreeNode.Data中分配了一个数据,所以我必须在TreeNode.Delete中释放已分配的数据,不可以把它直接删除。所以我才要用递归算法来删除阿!
      

  5.   

    上面那个代码不行,因为在递归过程中DelNode.Count会改变,所以变量I会Out of bounds.
      

  6.   

    #include <iostream>
    using namespace std;typedef struct MyDoubleList
    {
    MyDoubleList* pPreLst;
    int nValue;
    MyDoubleList* pNextLst;
    }SomeList;
    void MyPrint(MyDoubleList* pList)
    {
    int i;

    if (pList->pNextLst != NULL)
    {
    i = pList->nValue;
    pList = pList->pNextLst;
    MyPrint(pList);
    }
    else
    {
    i = pList->nValue;
    cout<< "Last OutPut " << pList->nValue << endl;
    pList = pList->pPreLst;
    if (pList != NULL)
    {
    pList->pNextLst = NULL;
    MyPrint(pList);
    }
    }
    }
    void TestDoubleList(void)
    {
    MyDoubleList lst[10];
    lst[0].nValue   = 9;
    lst[0].pPreLst  = NULL;
    lst[0].pNextLst = &lst[1];

    for (int i=1; i<9; i++)
    {
    lst[i].nValue   = 9 - i;
    lst[i].pPreLst  = &lst[i-1];
    lst[i].pNextLst = &lst[i+1];
    }
    lst[9].nValue   = 0;
    lst[9].pPreLst = &lst[8];
    lst[9].pNextLst = NULL;

    MyPrint(lst);
    }
    // 刚写的代码 数的节点都类似上面的 双向链表 PreList就相当于 父节点,NextList就相当于子节点 TreeNode不是很熟悉所以。。
      

  7.   

    procedure DeleteTreeNode(DelNode:TTreeNode);
    var i,j:integer;
    begin
      if delnode.HasChildren then
      begin
        j:=delnode.Count-1  
        for i:=j downto 0 do  begin
          DeleteTreeNode(delnode.Item[i]);
           form1.Memo1.Lines.Add(delnode.Text); //------------------记录删除顺序
          delnode.Delete;    end;
      end
      else
        begin
          form1.Memo1.Lines.Add(delnode.Text);  //------------------记录删除顺序
         delnode.Delete;
        end;
    end;这个,倒着来应该可以了
      

  8.   

    function TForm1.DeleteTreeNode(DelNode: TTreeNode): Boolean;
    Var
    Node : TTreeNode;
    I : Integer;
    begin
      If DelNode = nil then
        Exit;
      If DelNode.HasChildren then
         begin
          Node := DelNode.getFirstChild;
          For I := 1 to DelNode.Count do
          begin
            DeleteTreeNode(DelNode);
            Node := Node.getNextSibling
          end;
          DelNode.Delete;
         end
      else
        DelNode.Delete;  Result := True;  
    end;
      

  9.   

    我测试了一下好象这样写还有点问题,
    我用TVirtualStringTree 这个树的时候这样是没问题的
      

  10.   

    void MyPrint(MyDoubleList* pList)
    {
    while (pList->pNextLst != NULL)
    {
    pList = pList->pNextLst;
    } cout<< "Last OutPut " << pList->nValue << endl;
    pList = pList->pPreLst;
    if (pList != NULL)
    {
    pList->pNextLst = NULL; // 相当于DELETE
    MyPrint(pList);
    }}
    // 这段代码 相当于从最底层一个Node开始delete 然后倒数进行
      

  11.   

    如果是因为这个原因,那你何不在OnDelete中释放
      

  12.   

    嗯jinjazz(三个小时上下班)的代码可以了。