为什么删除一个TreeView的子节点总是报错啊?请大侠看看问题出在哪里?
var
    i,j,k : integer;
    RootItem : TTreeNode ;
begin
    RootItem := nil;
    for i := 0 to tvCamera.Items.Count -1 do
    begin
        if integer(tvCamera.Items[i].Data) = intStationHandle then
        begin
            RootItem := tvCamera.Items[i];
            RootItem.DeleteChildren;
            RootItem.Delete;
            
        end;
    end;
end;

解决方案 »

  1.   


        for i := 0 to tvCamera.Items.Count -1 do
    改为
        for i := tvCamera.Items.Count -1 downto 0 do或者
        i := 0;
        while(i<tvCamera.Items.Count)do
        begin
            if integer(tvCamera.Items[i].Data) = intStationHandle then
            begin
                RootItem := tvCamera.Items[i];
                RootItem.DeleteChildren;
                RootItem.Delete;            
            end
            else inc(i);
        end;
      

  2.   

    如果这个结点是唯一的,可以提前结束循环:
    var
        i,j,k : integer;
        RootItem : TTreeNode ;
    label
        loop;
    begin
      loop:
        RootItem := nil;
        for i := 0 to tvCamera.Items.Count -1 do
        begin
            if integer(tvCamera.Items[i].Data) = intStationHandle then
            begin
                RootItem := tvCamera.Items[i];
                RootItem.DeleteChildren;
                RootItem.Delete;
                Break; ///////////////////////////////////////////////
            end;
        end;
    end;否则,可以考虑:
    var
        i,j,k : integer;
        RootItem : TTreeNode ;
    begin
        RootItem := nil;
        for i := 0 to tvCamera.Items.Count -1 do
        begin
            if integer(tvCamera.Items[i].Data) = intStationHandle then
            begin
                RootItem := tvCamera.Items[i];
                RootItem.DeleteChildren;
                RootItem.Delete;
                goto loop;////////////////////////////////////////////
            end;
        end;
    end;
      

  3.   

    昏,贴错了-_-#如果这个结点是唯一的,可以提前结束循环:
    var
        i,j,k : integer;
        RootItem : TTreeNode ;
    begin
        RootItem := nil;
        for i := 0 to tvCamera.Items.Count -1 do
        begin
            if integer(tvCamera.Items[i].Data) = intStationHandle then
            begin
                RootItem := tvCamera.Items[i];
                RootItem.DeleteChildren;
                RootItem.Delete;
                Break; ///////////////////////////////////////////////
            end;
        end;
    end;否则,可以考虑:
    var
        i,j,k : integer;
        RootItem : TTreeNode ;
    label
        loop;
    begin
      loop:
        RootItem := nil;
        for i := 0 to tvCamera.Items.Count -1 do
        begin
            if integer(tvCamera.Items[i].Data) = intStationHandle then
            begin
                RootItem := tvCamera.Items[i];
                RootItem.DeleteChildren;
                RootItem.Delete;
                goto loop;////////////////////////////////////////////
            end;
        end;
    end;
      

  4.   

    for i:=0 to L do
     Delete(i)这样肯定会出错了。for i:=L downto 0 do
      Delete(i)这样才行,for 循环删除列表都要倒着来。要不就用 While 循环因为 Count 只会在开始的时候计算一次的
      

  5.   

    当你删除(或者增加)结点时,Items.Count 是变化的,然后去删除已不存在的结点,就会访问越界了
      

  6.   

    倒序删除才对,因为每次删除一个节点,节点中的指针会重新定位,节点序号也会依次变化。
    而且就算你使用DELETE(0),因为每次删除都要修改指针,效率也要低下,不如倒序删除效率高。
      

  7.   

    for i:=L downto 0 do
      Delete(i)
      

  8.   

    谢谢各位大侠指点。不过我这段代码的问题不在删除顺序上。我添加了Break之后,问题依然存在。断点调试的时候,每次在delete语句发生内存错误。我看了帮助,Delete可以删除本节点及其子节点。所以RootItem.DeleteChildren;这句可以不要。
    新建一个工程,使用相同的代码,没有出现内存错误。真是奇怪得很,在节点建立上也没有发现什么问题。在工程中,我是使用了data属性,用来保存一些数据。可以我将data设置为nil问题依然存在。
      

  9.   

    目前,我这段代码是这样写的:
    var
        i,j : integer;
        RootItem : TTreeNode ;
    begin
        for i := tvCamera.Items.Count -1 downto 0 do
        begin
            if integer(tvCamera.Items[i].Data) = intStationHandle then
            begin
                RootItem := tvCamera.Items[i];
                for j := 0 to tvCamera.Items.Count -1 do
                    if tvCamera.Items[i].Parent = RootItem then tvCamera.Items[i].Data := nil;
                RootItem.Data := nil;
                RootItem.Delete;
                Result := 1;
                break;
            end;
        end;
      

  10.   

    tvCamera.Items[i].Data := nil; ??????????
    这样能销毁对象么?你需要自己去销毁,DELPHI不是VB,也不是.NET。
      

  11.   

    谢谢大家对我的支持。本人的问题已经解决了,不在删除TreeNode里面,而是另外一个地方有内存泄漏问题,导致删除不成功。
    tvCamera.Items[i].Data := nil;这里我不是要删除什么对象。data属性是一个无类型的指针,我原来指向的是一块内存空间,这里只是把指针置空。