2016-04-15 94 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;