菜鸟碰到一个奇怪的问题,我想通过一个按钮把listview2的全部内容导入listview1里,我的代码有错吗?(116分)

  • 主题发起人 xiaoxiami0
  • 开始时间
X

xiaoxiami0

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
listitem:tlistitem;
begin
for i:=0 to listview2.items.Count-1 do
begin
listitem:=listview1.Items.add;
listitem.Caption:=listview2.Items.Caption;
listview2.items.Delete;

end;
end;
 
直接赋值不可以吗,或者用Assign
 
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
listitem:tlistitem;
begin
for i:=listview2.items.Count-1 downto 0 do //注意循环
begin
listitem:=listview1.Items.insert(0);
listitem.Caption:=listview2.Items.Caption;
listview2.items.Delete;
end;
end;
更简单的如下
ListView2.Items.Assign(ListView1.Items);
ListView1.Items.Clear;
 
不用这么麻烦吧,直接赋就行了。
 
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
listitem:tlistitem;
begin
for i:=0 to listview2.items.Count-1 do
begin
listitem:=listview1.Items.add;
listitem.Caption:=listview2.Items.Caption;
end;

listview2.items.clear;
end;
 
你上面的代码错在在循环总调用了listview2.items.Delete;
在循环外调用listview1.Items.Clear;就没问题了。

推荐用Assign
 
直接赋值没问题,TListItem已经实现了Assign方法.
 
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
listitem:tlistitem;
begin
for i:=0 to listview2.items.Count-1 do
begin
listitem:=listview1.Items.add;
listitem.Caption:=listview2.Items.Caption;
listview2.items[0].Delete;
end;
end;
程序确实是错误的,因为在ListView的item中,你删掉一个项目以后,后面的元素就向前提
了,所以,要是按你的算法删除的话,会删除的是1,3,5。。。。一直到2*i-1项,显然,
在i到了比项目数的一半大的时候,最终要出现一个Index的异常的。要每次都删除第一的
项目,就可以了。
楼上的利用反向循环来做,也很好,,他回避了删除的index的问题,但是在插入的时候,
要注意2个列表的项目的顺序,所以,他插入的总是0项,但是逆向毕竟是需要回避的方法
[V]
 
直接赋值就可以了,Delphi的Assign写得比较完美.
listview1.items=listview2.items;

 
listview1.viewStyle:=listview2.viewStyle;
listview1.columns.Assign(listview2.columns);
listview1.items.Assign(listview2.items);
 
多人接受答案了。
 
顶部