Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Recorrido de un Tlistview (https://www.clubdelphi.com/foros/showthread.php?t=3701)

Flores 17-09-2003 15:05:20

Recorrido de un Tlistview
 
Hola a todos.
Tengo un problema con un Tlistview. He de rrecorrerlo y borrar de la lista los Items que tienen marcado la casilla de verificación. El problema que al hacerlo siempre me da un error. Creo que es porque lo recorro con un bucle for tal como el siguiente:

procedure borramsgs;
var
i: integer;
begin

for i:=0 to Form1.list2.Items.Count-1 do
begin
if Form1.list2.Items[i].Checked then Form1.list2.Items[i].Delete;
end;

end;


Cuando llega al Item 5 (por ejemplo) y lo borro, creo que ya el campo count del Tlistview.Items cambia y me transtoca el bucle for. Al menos esto es lo que creo.
¿Estoy equivocado?
¿El error me lo merezco por mal programador?
¿Saldré alguna vez de este "bucle infinito de desesperanza"?
¿Alguien me sacará de la oscuridad para llevarme de nuevo a la luz?

Gracias por adelantado.

__cadetill 17-09-2003 15:35:43

bueno, creo que te respondes tu mismo. En lugar de un bucle for, utiliza un bucle while

Código:

procedure borramsgs;
var
  i: integer;
begin
  i := 0;
  while i <= Form1.list2.Items.Count-1 do
  begin
    if Form1.list2.Items[i].Checked then Form1.list2.Items[i].Delete;
  end;
end;


Flores 17-09-2003 16:40:15

Echo de menos el smilies aquel que salía con la cara colorada.
Es que cuando uno se encabezona con algo...

Muchas gracias cadetill por tu pronta respuesta, era SIMPLEMENTE es.

__cadetill 17-09-2003 18:14:54

Cita:

Posteado originalmente por Flores
Echo de menos el smilies aquel que salía con la cara colorada.
jejeje, sigue saliendo, mira :o

Lo único que cambia algo el formato :cool:

Julià T. 17-09-2003 19:40:59

Lo lógico de un bucle es recorrerlo de menor a mayor, pero cuando tenermos que recorrer una lista en la que se van a borrar (parcial o totalmente) lo que se debe hacer es recorrer me mayor a menor.

procedure borramsgs;
var
i: integer;
begin
for i:=Form1.list2.Items.Count-1 downto 0 do
if Form1.list2.Items[i].Checked then
Form1.list2.Items[i].Delete;
end;

Flores 18-09-2003 01:52:57

Gracias Julà T.
Otra solución sencilla y elegante.
No os podéis imaginar la de cosas que intenté con el dichoso bucle For.... :o

__________________

Francisco J. Flores


La franja horaria es GMT +2. Ahora son las 09:11:38.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi