Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-02-2005
bustio bustio is offline
Miembro
NULL
 
Registrado: oct 2003
Posts: 231
Poder: 16
bustio Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 23-02-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.239
Poder: 10
roman Tiene un aura espectacularroman Tiene un aura espectacular
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
Responder Con Cita
  #3  
Antiguo 27-02-2005
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.538
Poder: 24
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile Í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.
__________________
@algonzalez74

Última edición por Al González fecha: 27-02-2005 a las 19:55:10.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 03:09:32.


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