2014-02-15 1 views
0

Я хава скрипт с ошибкой:Delphi Для каждого TListItem в ListView1

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject; 
    Socket: TCustomWinSocket); 
begin 
for tlistitem in listview1.items do 
    Try 
     ServerSocket1.Socket.Connections[tlistitem].Sendtext('TestConnection'); 
     except 
      listview1.Items.Delete(tlistitem); 
    end; 
end; 

Ошибка находится в: для tlistitem в listview1.items делать, но я не знаю, что это неправильно, может кто-то помочь мне ?

+0

Пожалуйста, не задавайте вопросы об ошибках без включения ошибки. –

ответ

6

TListItem это тип. Вы должны использовать локальную переменную этого типа в цикле.

var 
    item: TListItem; 
begin 
    for item in listView1.Items do 
    ... 

См. Iteration Over Containers Using For statements.

The type of the iteration variable Element must match the type held in the container. With each iteration of the loop, the iteration variable holds the current collection member. As with regular for-loops, the iteration variable must be declared within the same block as the for statement.

Warning: The iteration variable cannot be modified within the loop. This includes assignment and passing the variable to a var parameter of a procedure. Doing so results in a compile-time warning.

Если вы хотите удалить объект, вы должны пройти действительный индекс.

listView1.Items.Delete(listView1.Items.IndexOf(item)); 

TServerWinSocket.Connections ожидает целочисленный индекс, так что кажется, как вы должны преобразовать элемент в индекс, как показано выше.

Если ваша цель - удалить отключенный объект, и вы делаете это, проверяя все элементы, вы должны вместо этого перебирать нормальный верхний предел для цикла.

for i := Pred(listView1.Items.Count) downto 0 do 
+0

Вы можете использовать свойство 'TListItem.Index' в цикле' for..in..'. –

+0

@Remy не для части удаления –

1

С этим кодом связано множество проблем. Во-первых, для в цикле требует локальной переменной цикла:

var 
    Item: TListItem; 
.... 
for Item in listView1.Items do 
    .... 

На протяжении всего вашего кода, когда вы используете тип где переменная необходима.

Ваш плохой обработчик исключений. Он проглотит все исключения. Измените его, чтобы обрабатывать только ожидаемые исключения.

Это кажется маловероятным, что

ServerSocket1.Socket.Connections[Item] 

может быть проиндексирован пунктом, как вы пытаетесь сделать. Вам придется передумать, что вы имеете в виду в этой точке кода.

Наконец, как правило, вы не можете модифицировать контейнер во время итерации по нему. Вы делаете это, когда вы вызываете Delete, чтобы удалить элемент из списка. Я думаю, вам нужно создать список элементов для удаления, когда вы перебираете список. И затем, когда итерация завершена, удалите элементы. И обратите внимание, что Delete ожидает в качестве параметра индекс, а не элемент.

Как более общий совет, обычно использовать плохую идею использовать GUI-элемент управления в качестве основного контейнера данных. Где-то в очереди это дизайнерское решение, скорее всего, вернется, чтобы преследовать вас.

Смежные вопросы