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;
您看我的代码了吗?我就是从最后一个删除啊。有没有懂的。我现在是这么一个问题.就这么假定:一个节点下有两个子节点,现在传了这个节点,要实现删除这两个子节点和自己。好,我现在是先删除第二个子节点,同时返回这个子节点的他的上一个节点(也就是第一个子节点)这是第一步没有问题,这个时候代码中的CHILDNODE则第一子节点的指针了,对吧?这个时候再执行while childNode<>nil do childNode:=DelNodeRecord(childNode);传进去 的是第一个子节点的指针,这个时候就再一次调用了这个递归函数,此时的INODE为第一个子节点了。继续执行,可是当执行 if (iNode.Parent <> nil) then Result:=iNode.Parent.GetPrevChild(iNode);此时这iNode.Parent 竟然为NIL了?明明还在的。这太奇怪了!
var select,childNode:TcxTreelistNode; childNode := iNode.GetLastChild; 其实我觉得你应该是在删除第二个节点前,让当节的selectedNode 为上一个节点( if childNode.PriorNode <> nil then select := childNode.PriorNode else select := childNode.ParnetNode; ,然后再去删除最后的那个节点
这样应该没有问题,没有环境故为调试: 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;
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;
DestroyVersionList是做什么用的?跟踪进去看看
childNode := iNode.GetLastChild;
其实我觉得你应该是在删除第二个节点前,让当节的selectedNode 为上一个节点(
if childNode.PriorNode <> nil then
select := childNode.PriorNode
else
select := childNode.ParnetNode;
,然后再去删除最后的那个节点
您这个加了这行其实关系不大.还是没有找到问题点。唉。是不是这个控件的BUG啊?奇怪啊。
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;