PDA

Ver la Versión Completa : Problemas para borrar una cadena de un Tstrings


drykea
08-05-2008, 10:41:10
Hola a todo el mundo.

Pues eso, tengo un problema para borrar una cadena en concreto dentro de un tstrings.
Lo que hago es:


Código Delphi [-] (http://www.clubdelphi.com/foros/#)
for I := 0 to Cod.Count-1 do
begin
...
Cod.Delete(I);
...
end;





El problema es que me da 'List index of bounds'. Da igual el valor que tenga I.
¿Alguien sabe lo que estoy haciendo mal?
¿Hay otra manera de hacerlo?

Muchas gracias por su ayuda

roman
08-05-2008, 10:54:19
En estos casos, debes recorrer la lista alrevés:


for I := Cod.Count-1 downto 0 do
begin
...
Cod.Delete(I);
...
end;


Edito

También puedes intentar poniendo simplemente


Cod.Clear;


en lugar del ciclo.

// Saludos

Dedalo
08-05-2008, 11:04:46
Delphi toma el valor de I cuando se inicia el bucle. Si borras uno o mas elementos de la tabla, cuando I llega al valor inicialmente capturado Cod.Count-1 ya estas fuera de la tabla. Por ejemplo, tienes una tabla de 25 elementos, al inicio del bucle pascal determina que debe contar desde 0 hasta 24, si borras algun elemento de la tabla da igual, la cuenta llegará a 24, y como has borrado un elemento, cuando intentes borrar o comprobar el elemento num. 24 estas fuera de rango.

Lo mejor en esos casos es hacer un bucle While o Until.


I=0;
while I < Cod.Count do
begin
...
Cod.Delete(I);
...
inc(I);
end;



I=0;
repeat
...
Cod.Delete(I);
...
inc(I);
until I = Cod.Count;


Asi compruebas el valor de Cod.Count en cada pasada

drykea
08-05-2008, 11:39:43
Muchas gracias por respoder tan pronto.

He probado las dos formas, recorrer la lista al reves y poner un while en vez de un for, y las dos han funcionado.

Una última pregunta ¿Que es más rápido el while o el for?

Delfino
08-05-2008, 15:26:08
El problema es que me da 'List index of bounds'.
Eso pq al borrar un elemento el valor de Cod.Count cambia,
Una última pregunta ¿Que es más rápido el while o el for?
Son iguales las dos, o las tres :p

drykea
08-05-2008, 15:30:31
Muchas gracia por todas sus respuestas.:D