本帖最后由 HXQ_88888888 于 2012-03-29 11:18:49 编辑

解决方案 »

  1.   

    function TfrmXXX.delNodeRecord(iNode:TcxTreelistNode):TcxTreeListNode;
    var
      childNode:TcxTreelistNode;
    begin
      childNode := iNode.GetLastChild;
      while childNode<>nil do
      childNode:=DelNodeRecord(childNode);
      if (iNode <> nil) then 
      begin
       if (iNode.Parent <> nil) then 
       Result:=iNode.Parent.GetPrevChild(iNode);
      if(iNode.level =1) then
      DestroyVersionList(iNode.values[0]);
      iNode.Delete;
    end;
    end;
      

  2.   

    问题出在DestroyVersionList(iNode.values[0]);
    DestroyVersionList是做什么用的?跟踪进去看看
      

  3.   

    您看我的代码了吗?我就是从最后一个删除啊。有没有懂的。我现在是这么一个问题.就这么假定:一个节点下有两个子节点,现在传了这个节点,要实现删除这两个子节点和自己。好,我现在是先删除第二个子节点,同时返回这个子节点的他的上一个节点(也就是第一个子节点)这是第一步没有问题,这个时候代码中的CHILDNODE则第一子节点的指针了,对吧?这个时候再执行while childNode<>nil do childNode:=DelNodeRecord(childNode);传进去 的是第一个子节点的指针,这个时候就再一次调用了这个递归函数,此时的INODE为第一个子节点了。继续执行,可是当执行   if (iNode.Parent <> nil) then Result:=iNode.Parent.GetPrevChild(iNode);此时这iNode.Parent 竟然为NIL了?明明还在的。这太奇怪了!
      

  4.   

    var select,childNode:TcxTreelistNode; 
    childNode := iNode.GetLastChild;
    其实我觉得你应该是在删除第二个节点前,让当节的selectedNode 为上一个节点(
    if childNode.PriorNode <> nil then 
    select := childNode.PriorNode
    else
    select := childNode.ParnetNode;
    ,然后再去删除最后的那个节点
      

  5.   

    我只是说了下我的思路,现在公司是有个EXE的DEV控件,但是是2004年的吧,有个BPL的2008年的,但要安装的话也汰费时间了,so……
      

  6.   


    您这个加了这行其实关系不大.还是没有找到问题点。唉。是不是这个控件的BUG啊?奇怪啊。
      

  7.   

    这样应该没有问题,没有环境故为调试:
    function TfrmXXX.delNodeRecord(iNode:TcxTreelistNode):boolean;
    var
      childNode:TcxTreelistNode;
      aNode:TcxTreelistNode;
    begin
      childNode := iNode.GetLastChild;
      while childNode<>nil do
      begin
         aNode:=iNode.Parent.GetPrevChild(iNode);     
         DelNodeRecord(childNode);
         childNode:=aNode;
      end
      iNode.Delete;
    end;