关于LISTVIEW的问题~(20分)

L

logpie

Unregistered / Unconfirmed
GUEST, unregistred user!

(一):
begin
k:=0;
for i:=1 to 10 do
begin
k:=k+1;
ListView1.Items.Add.SubItems.Add(inttostr(k));
ListView1.Items.Add.Caption :=inttostr(k);
ListView1.Update ;
end;
end;
(二)
k:=0;
for i:=1 to 10 do
begin
k:=k+1;
with ListView1.Items.Add do
begin
caption:=inttostr(k);
SubItems.Add(inttostr(k));
end;
ListView1.Update ;
end;
end;


为什么代码(一)再显示时每列之间都和SUBITEM之间错开一个,而代码(二)却没有这个问题?
谢谢!
 
很明显阿,第一个调用了两次ListView1.Items.Add,就是会创建了20个item,一半的item
有SubItems,另一半有caption。而第二个只调用了一次ListView1.Items.Add,并且每个
item的subitems和caption都被付了值。
 
那有什么办法解决呢?比如我要在两个循环中分别加入Caption和Subitem.Add
那不是位置又错开了吗?
 
你可以在第一个循环中保存Items的序号,在第二个循环中用上面的序号就可以了:
li: TListItem;
sl: TStringList;

循环一:
li := ListView1.Items.Add;
li.caption := 'aaa';
sl.add(IntToStr(ListView1.Items.Count-1));
...

循环二:
for i:= 0 to sl.Count - 1 do
begin
ListView.Items.Item[StrToInt(sl.string)].....
end;
 
我是要用SubItem.add啊
你的方法好象不行啊
 
你指的是SubItem.add的参数需要用k的值吗?
那样你可以:

循环一:
li := ListView1.Items.Add;
li.caption := 'aaa';
sl.addObject(IntToStr(ListView1.Items.Count-1), TObject(k));
...

循环二:
for i:= 0 to sl.Count - 1 do
begin
ListView.Items.Item[StrToInt(sl.string)].SubItems.Add(IntToStr(Integer(sl.object)));
end;

//好像是很麻烦,不知道有没有别的方法
 
谢谢二位了!
刚解决了问题,是用LISTBOX 配合 LISTVIEW做的。

可是不知道有什么纯代码方法,期待中。。。
 
for i:=0 to 10 do
begin
ListView1.Items.Add.Caption:=inttostr(k);
ListView1.Items.SubItems.add(inttostr(k));
end;
 
用LISTBOX 配合 LISTVIEW就可以搞定。
 
那如果有2个或以上个SUBITEMS又怎么添加CAPTION呢?好象无法使用SUBITEMS.ADD方法呀
 
for i:=0 to 10 do
begin
with lv.Items.Add do
begin
caption:=inttostr(i);
subitems.Strings[0]:=inttostr(i);
subitems.Strings[1]:=inttostr(i);
...............
end;
 
多人接受答案了。
 
顶部