Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Recorrer un StringList (https://www.clubdelphi.com/foros/showthread.php?t=18789)

bustio 23-02-2005 07:08:33

Recorrer un StringList
 
HOla:

Tengo un fichero .txt donde voy a tener una determinada cantidad de datos utiles y de marcas de comentarios(#). Es decir, el simbolo # representa algo asi como "//" en delphi; que lo que sigue a continuacion no me interesa para nada. Yo necesito recorrer ese fichero txt eliminando las lineas que empiecen con el simbolo "#". Para esto cree una variable de tipo StringList, almace el fihero dentro de ella con LoadFromFile, y luego recorro el ficehro haciendo lo sgte:

Código Delphi [-]

for i:= 0 to Cant - 1 do
      begin
        try
          if Script.Strings[i][1] = '#' then Script.Delete(i);
        except
        end;
      end;
      mScript.Lines := Script;

Mi problema surge a raiz de que cuando en el ficehro hay alguna linea que no empiece con "#" me salta una excepcion bastante molesta. La manipulo como muestro en el segmento de codigo que puse arriba.. solo que no me parece nada elegante ni limpio.
Alguien puede sugerirme una idea mejor??

GRACIAS!!

Lazaro Bustio Martinez.

roman 23-02-2005 07:45:08

Cita:

Empezado por bustio
me salta una excepcion bastante molesta.

¿Tan molesta que te fue imposible decirnos cuál es? ;)

Adivinando, lo único que se me ocurre es que la tal excepción es un "Access Violation" que se presenta no cuando hay líneas que no empiecen con # sino cuando hay líneas en blanco en cuyo caso Script.Strings[i] es una cadena vacía por lo que no puedes acceder a su primer elemento.

Si mis habilidades adivinatorias no van mal encaminadas entonces bastará con que compruebes que la línea no está en blanco antes de verificar la existencia de #:

Código Delphi [-]
if (Script.Strings[i] <> '') and (Script.Strings[i][1] = '#') then


// Saludos

Al González 27-02-2005 19:50:21

Índice de cadena o de carácter inválido
 
¡Buen día a todos!

Además de lo dicho por Román, suponiendo que la expresión Cant sea al comenzar el ciclo For la cantidad total de cadenas de la lista, se corre el riesgo de que, después de eliminar una o más cadenas (Script.Delete), la variable I haga referencia a un índice ya no existente, lo cual también es causa de excepciones.

Es decir, si inicialmente Cant = 10, la variable I irá de 0 a 9 en el ciclo For, siendo 9 el índice mayor. Pero al eliminar una cadena de la lista, el índice mayor se reduce en 1, y en ese caso una referencia como Script.Strings [ I] , donde I sea igual a 9, generará una excepción, ya que ahora el índice mayor será 8.

En los casos donde se aplica un proceso iterativo a una lista de elementos, es recomendable utilizar un ciclo While o Repeat en lugar de un ciclo For, cuando el proceso iterativo puede cambiar la cantidad de elementos de dicha lista.

Espero esto sea de utilidad, seguimos en contacto.

Al González. :)


La franja horaria es GMT +2. Ahora son las 09:13:02.

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