2016-04-15 118 views
0

为什么下面的代码不能迭代ListView?无法通过TListView迭代

for x := 1 to ListView1.Items.Count do 
    Begin 
    PName := ListView1.Items.Item[i].Caption; 
    Variable := ListView1.Items.Item[i].SubItems[0]; 
    Val := ListView1.Items.Item[i].SubItems[1]; 
    ToFIle(PName, Variable, Val); 
    End; 
+0

'for x ...'和'... Item [i] .....您可能还想使用索引'0'到'count -1' –

回答

1

如何,如果你作为循环变量x但内环i可以使用迭代。

这一个:

for x := 1 to ListView1.Items.Count do 

是不正确的,因为你永远无法到达的第一个元素。请更改为:

for x := 0 to ListView1.Items.Count - 1 do 
    Begin 
    PName := ListView1.Items.Item[x].Caption; 
    Variable := ListView1.Items.Item[x].SubItems[0]; 
    Val := ListView1.Items.Item[x].SubItems[1]; 
    ToFIle(PName, Variable, Val); 
    End; 
7
  • 你的循环变量是x,但是你用i循环体内部。
  • 您迭代错误的索引。德尔福的指数按惯例为零。你的循环应该从0运行到Count-1

的其他一些观点:

  • x不是整数索引一个伟大的变量名。使用iindex
  • ItemTListItems的属性是默认属性,因此可以通过省略该属性来简化代码。

我会写代码应该像这样:

var 
    i: Integer; 
    PName, Variable, Val: string; 
.... 
for i := 0 to ListView1.Items.Count-1 do 
begin 
    PName := ListView1.Items[i].Caption; 
    Variable := ListView1.Items[i].SubItems[0]; 
    Val := ListView1.Items[i].SubItems[1]; 
    ToFIle(PName, Variable, Val); 
end; 

或利用到每个项的引用,从而避免重复:

var 
    i: Integer; 
    Item: TListItem; 
    PName, Variable, Val: string; 
... 
for i := 0 to ListView1.Items.Count-1 do 
begin 
    Item := ListView1.Items[i]; 
    PName := Item.Caption; 
    Variable := Item.SubItems[0]; 
    Val := Item.SubItems[1]; 
    ToFIle(PName, Variable, Val); 
end; 

,或者通过使用for/in环和不需要关心列表项目的索引:

var 
    Item: TListItem; 
    PName, Variable, Val: string; 
... 
for Item in ListView1.Items do 
begin 
    PName := Item.Caption; 
    Variable := Item.SubItems[0]; 
    Val := Item.SubItems[1]; 
    ToFIle(PName, Variable, Val); 
end;