代码如下:
var
Nodes : TListItems
begin
Nodes := TListItems.Create(nil);
Nodes := ListView1.Items;
//Nodes.Assign(ListView1.Items);
//+++++++++++++++++++++++++++++++++++++
//以下语句,如果 ListView1.Items 被清掉,这时,Nodes 也被清掉了,
//有什么办法能保留 Nodes 的值呢。 ListView1.Items.Clear;
end;
var
Nodes : TListItems
begin
Nodes := TListItems.Create(nil);
Nodes := ListView1.Items;
//Nodes.Assign(ListView1.Items);
//+++++++++++++++++++++++++++++++++++++
//以下语句,如果 ListView1.Items 被清掉,这时,Nodes 也被清掉了,
//有什么办法能保留 Nodes 的值呢。 ListView1.Items.Clear;
end;
解决方案 »
- delphi报错
- 软件初始数据的修改
- RMB2K游戏制作大赛
- 100分求飞利浦630手机在DELPHI中的开发.分不够再加
- 什么定制?不好意思的问题
- 请问哪一位有Turbo pascal2.0,我在做些研究,急用2.0版,其他版没有我要的功能,谢谢!
- 简单问题 ,送分了
- 看看谁先说出来,c里的运算符“++”和pascal“Inc()”函数的区别~~
- delphi2007,.aspx中的<asp:button>标签是自动生成还是手动写
- 求snmpapi.dll中的函数声明。
- forgot的散分帖:这里有上海华东理工大学的朋友吗?请进来说两句(上海的朋友也可以)。
- 我拿到计算机专业本科证书啦!放分给各位弟兄们。
在使用了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来保存外,我目前还没有找到更好的办法。
但可以这样
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来保存吧,比较方便
虽然浪费了点资源。