代码如下:
var
  Nodes : TListItems
begin
  Nodes := TListItems.Create(nil);
  Nodes := ListView1.Items;
  //Nodes.Assign(ListView1.Items);
  
  //+++++++++++++++++++++++++++++++++++++
  //以下语句,如果 ListView1.Items 被清掉,这时,Nodes 也被清掉了,
  //有什么办法能保留 Nodes 的值呢。  ListView1.Items.Clear;
  
end;

解决方案 »

  1.   

    Nodes := ListView1.Items;去掉
      

  2.   

    TListItems对象和一般对象不一样,它并不能单独存在。必须和ListView一起使用,当然,你会发现Nodes := TListItems.Create(nil);这毫无问题,但是
    在使用了Nodes := TListItems.Create(nil);之后,你再使用Nodes.Add;方法,你会发现运行出错,查看TListItems的源码就可以看到,很多地方使用了Owner.
    但是这里,你的Owner=nil,访问空指针的数据自然出错了!所以,你使用Nodes.Assign(TListItems.Items)也会出错。再谈你写的语句:Nodes := ListView1.Items,
    对象在某种程度上可以看做是指针,那么看以下代码:
    var
      P1, P2:^Integer;
    begin
      P2^ := 1;
      P1 := P2;//此处相当与你的Nodes := ListView1.Items
      P2^ := 3;
    end;
    以上代码运行后P1^也是3,这就是为什么
      “//以下语句,如果 ListView1.Items 被清掉,这时,Nodes 也被清掉了,
      //有什么办法能保留 Nodes 的值呢。”
    的原因,因为Nodes仅仅只保留了指向LIstView1.Items的指针,而不是里面的
    数据。至于如何保存ListView中的数据,目前除了另建一个数据结构,或者放个不可见的
    ListView来保存外,我目前还没有找到更好的办法。
      

  3.   

    同意zwjchina(蒲石) 
    但可以这样
    var
      i: Integer;
      TmpItem: TListItem;
    begin
      Nodes := TList.Create;
      for i := 0 to  ListView1.Items.Count - 1  do
      begin
        TmpItem := TListItem.Create(nil);
        try
          TmpItem.Assign(ListView1.Items[i]);
        except
          ;
        end;
        Nodes.Add(TmpItem);
      end;  //+++++++++++++++++++++++++++++++++++++
      //以下语句,如果 ListView1.Items 被清掉,这时,Nodes 也被清掉了,
      //有什么办法能保留 Nodes 的值呢。  ListView1.Items.Clear;end;
    Nodes在结束时在释放
    如不加Try..Except也会出错,同样也要访问Owner,
    所以我这是个馊主意,除了Check属性,其他都可读,因为都保存在数据成员里,看源代码发生异常时是在数据成员都赋值以后发生
    当有异常就扔掉。
    基本上保存了大部分值吧,在IDE下调试会出现异常。单独执行没事
    不过我这不太可取,呵呵,还是放个不可见的TListView来保存吧,比较方便
    虽然浪费了点资源。