生成treeView的代码:
      while not Eof do  
      begin  
        new(pnode);  
        pnode.id:=fieldbyname('ID').AsInteger;  
        Pnode.caption:=fieldbyname('Caption').AsString;  
        node:=Treeview1.Items.AddChildObject(parentNode,pnode.caption,pnode); //目录页  
        FillTreeView(fieldbyname('ID').AsInteger,node);//递归调用  
        Next;  
      end;  
================
以上代码没有dispose(pnode),点击节点时可以正常获得ID在语句     FillTreeView(fieldbyname('ID').AsInteger,node);//递归调用  
前面加上Dispose(Pnode);点击节点时,获得的ID不正确,是个很长的整数。请教:如果不使用dispose,系统在什么时候释放new的pnode呢?不使用dispose安全吗?

解决方案 »

  1.   

    //不用释放
    //TTreeNodes由TTreeNode管理,就像Items由Item管理一样,可以设置 OwnsObjects属性为True
    //让TTreeNode自动管理其成员对象的生命期。//声明
    var
      newnode: TTreeNodes;//用重载的方法创建
    newnode:= TTreeNodes.Create(true);
      

  2.   

    建议使用fcTreeview,功能大一些,好用。
      

  3.   

    不能在FillTreeView中是否,否则就访问出错,在窗体关闭时,可以做一个循环的释放操作
      

  4.   


    在每次重建 Tree 的时候,释放这个 tree 的时候,遍历下节点再释放.
      

  5.   

    谢谢各位朋友。
    遍历或者循环释放的话,需要使用Dispose(Pnode);PNODE参数是指针类型的变量,那么如何获得这个Pnode呢?
      

  6.   

    买个TreeNode都有一个Data属性,你可以用他来保持指针