Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-01-2008
david.rguez david.rguez is offline
Miembro
 
Registrado: jun 2006
Ubicación: Zamora, la bien cercada
Posts: 104
Poder: 18
david.rguez Va por buen camino
Método Add(s) de TStringList no me hace caso

Hola a todos/as:

En un módulo de un programa tengo que utilizar un TStringList ya que tengo que mantener de forma dinámica una lista de claves de exclusión durante la ejecución del programa (para evitar que cierto proceso que tengo que hacer se duplique, generando basura en los resultados).

El caso es que cuando intento añadir un nuevo String a la lista:

Código:
lista.add(qtrazaTRAZA12.Value);
No hace ni caso. Es decir, no salta ningún error, pero la lista continúa vacía, con lo que se va al carajo el sistema de control que estoy montando para guiar el proceso.

El campo TRAZA12 al que hago referencia sí es un String y antes de usar la lista hago un create sobre la variable.

¿Alguien sabe por qué no hace nada?
Responder Con Cita
  #2  
Antiguo 24-01-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Y estás seguro que esa línea se ejecuta?

A lo mejor el compilador la elimina por que no le encuentra relevancia...

Pon un breakpoint en esa linea (F5) y compila tu programa, si el breakpoint sigue activo, ejecuta el programa y ve que sucede antes y despúes de esa línea...


Saludos...
Responder Con Cita
  #3  
Antiguo 24-01-2008
luisgutierrezb luisgutierrezb is offline
Miembro
 
Registrado: oct 2005
Ubicación: México
Posts: 925
Poder: 19
luisgutierrezb Va por buen camino
y si usas un cast?
lista.add(string(qtrazaTRAZA12.Value));

o incluso no se si puedas hacer esto:
lista.add(qtrazaTRAZA12.AsString);

o ya de plano:
stringTemp := qtrazaTRAZA12.Value;
lista.add(stringTemp);
Responder Con Cita
  #4  
Antiguo 24-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
De verdad, no me la creo!!!

Nunca he visto a un StringList fallar de esta manera. Creo que la línea de código no está ejecutándose, quizás porque las condiciones no se dan para que pase por allí. Estoy seguro que el optimizador no eliminaría una línea como esta.

Otra posibilidad es que estes determinando erroneamente que la línea no se añade, pero que realmente si lo hace. Ambas cosas son fáciles de determinar:

Código Delphi [-]
Lista.Add(qTrazaTRAZA12.Value);
ShowMessage(Lista.Text);

Si se muestra el mensaje, el código se está ejecutando. Si el mensaje mostrado es distinto del valor del campo, sigamos echandole la culpa al StringList, si no, busquemos al verdadero culpable!!.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #5  
Antiguo 24-01-2008
david.rguez david.rguez is offline
Miembro
 
Registrado: jun 2006
Ubicación: Zamora, la bien cercada
Posts: 104
Poder: 18
david.rguez Va por buen camino
LA línea sí llega a ejecutarse. Puse puntos de depuración lo primero para corroborarlo y sí llega ahí sin dar problemas.

Sin embargo, no hace nada, tras pasar esa línea el depurador me indica que la lista continúa vacía (no he puesto ShowMessage, lo consulté desde un estado de parada en depuración).

Ya he probado otros modos que me comentasteis como el AsString y el cast, pero el resultado es el mismo
Responder Con Cita
  #6  
Antiguo 24-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
¿Cómo estas comprobando que la lista está vacía?
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #7  
Antiguo 24-01-2008
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
¿Podemos ver el código (no sólo una línea)?
Responder Con Cita
  #8  
Antiguo 25-01-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Hola.

Cita:
Empezado por david.rguez Ver Mensaje
...LA línea sí llega a ejecutarse...tras pasar esa línea el depurador me indica que la lista continúa vacía...
Entonces la única explicación razonable que queda (considerando no te has equivocado de lista), es que la expresión qtrazaTRAZA12.Value, devuelve una cadena vacía en ese momento. ¿Estará ese campo vacío? (campo en blanco en el registro actual, cero registros en el conjunto de datos por estar éste cerrado o filtrado...).

No dejes de respondernos sobre estas cuestiones, aún cuando hayas encontrado la solución.

Saludos.

Al González.
Responder Con Cita
  #9  
Antiguo 25-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cita:
Empezado por Al González Ver Mensaje
Entonces la única explicación razonable que queda (considerando no te has equivocado de lista), es que la expresión qtrazaTRAZA12.Value, devuelve una cadena vacía en ese momento. ¿Estará ese campo vacío?
Me temo Al, que si ese fuese el caso, la lista no estaría vacía, pues contendría una cadena vacía en su primer elemento.

Se que puede tomarse por un tecnicismo... tampoco creas que me estoy entrenando para abogado, pero francamente no es lo mismo.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #10  
Antiguo 25-01-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Vaya que no es lo mismo. Mayor razón para que David responda a tu última pregunta con más precisión. Tú y yo sabemos lo que es una lista realmente vacía, pero en el sentido general un texto sin caracteres (visibles) es coloquialmente considerado como algo vacío. Mi sospecha va por esa línea de investigación.

Saludos.

Al González.
Responder Con Cita
  #11  
Antiguo 25-01-2008
david.rguez david.rguez is offline
Miembro
 
Registrado: jun 2006
Ubicación: Zamora, la bien cercada
Posts: 104
Poder: 18
david.rguez Va por buen camino
El valor de la traza que guardo no está vacío (lo compruebo pasando el ratón por encima de la variable cuando está en el punto de interrupción del Add, mostrando un cuadro emergente con el valor actual).

Os pongo la porción de código que se encarga del proceso:

Código Delphi [-]

        lista.Free;
        lista:= TStringList.Create;

        qtraza.SQL.Clear;

        if Label1.Caption = 'atras' then
            qtraza.SQL.Add('select * from trazavin where traza27 = :ref and traza05 = ''TRE''')
        else
            qtraza.SQL.Add('select * from trazavin where traza27 = :ref and traza05 = ''TRS''');
        qtraza.Parameters.ParamByName('ref').Value:= refPadre;
        qtraza.Open;

        while not qtraza.Eof do
        begin

            // En primer lugar debemos buscar si el parte actual está examinado. Si no lo está, continuamos.
            if not buscarLista(lista, qtrazaTRAZA12.Value) then
            begin

                qprocesos.Close;
                qprocesos.SQL.Clear;
                qprocesos.SQL.Add('select * from moviproce where mopromovi = arte and moproorden = rden');
                qprocesos.Parameters.ParamByName('parte').Value:= qtrazaTRAZA12.Value;
                qprocesos.Parameters.ParamByName('orden').Value:= qtrazaTRAZA23.Value;
                qprocesos.Open;
                while not qprocesos.Eof do
                begin
                    taprocesos.Open;
                    taprocesos.Locate('PROCODIGO',qprocesosMOPROCODIGO.Value,[]);
                    texto:= texto + taprocesosPRONOMBRE.Value + #13;
                    taprocesos.Close;
                    qprocesos.Next;
                end;
                // Ahora que ya está compuesto el texto lo agregamos
                conex.Text.Add(texto);
                conex.Style:= csSides;
                conex.Text.VertAlign:= vtaTop;
                conex.Text.Angle:= 90;

                // También debemos agregar este parte a la lista dinámica, para evitar que duplique la búsqueda
                lista.Add(qtrazaTRAZA12.AsString);


            end;

            qtraza.Next;


El Free y Create inicial es para asegurarme de que no quedan rastros si se producen ejecuciones consecutivas.
"qprocesos" y "qtraza" son componentes TADOQuery y "conex" es un componente de terceros para la composición de diagramas.

"buscarLista" es una función que he creado que comprueba mediante el método "IndexOf" si el elemento en cuestión está dentro de la lista.

Como veis, si el elemento no está, busca los datos necesarios, configura el componente del diagrama y agrega el elemento (o eso pretendía) a la lista para que si se repite en el bucle no vuelva a ejecutar todo el proceso.


Pd: Ahí puse "asString" porque fue lo último que probé, pero con "Value" el resultado es el mismo.

Última edición por jachguate fecha: 25-01-2008 a las 15:08:20. Razón: cambiar etiqueta code por delphi
Responder Con Cita
  #12  
Antiguo 25-01-2008
david.rguez david.rguez is offline
Miembro
 
Registrado: jun 2006
Ubicación: Zamora, la bien cercada
Posts: 104
Poder: 18
david.rguez Va por buen camino
Bueno, ya se resolvió.

Puse un ShowMessage con el Text y sí que me lo mostraba ahí (el error posterior es que el Free lo tenía colocado donde no debía), pero me queda una cuestión que no entiendo...

...si sí almacenaba correctamente el valor... ¿por qué no me lo mostraba al inspeccionar la lista durante un punto de interrupción (justo después de haber ejecutado el "Add")?

Gracias a todos por la ayuda.
Responder Con Cita
  #13  
Antiguo 25-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cita:
Empezado por david.rguez Ver Mensaje
...si sí almacenaba correctamente el valor... ¿por qué no me lo mostraba al inspeccionar la lista durante un punto de interrupción (justo después de haber ejecutado el "Add")?
Ahora veo que maeyanes podría estar en lo correcto cuando dijo:

Cita:
Empezado por maeyanes
A lo mejor el compilador la elimina por que no le encuentra relevancia...
Mientras yo estaba equivocado al decir:
Cita:
Empezado por jachguate
Estoy seguro que el optimizador no eliminaría una línea como esta.
.

Te explico brevemente: Delphi cuenta con un optimizador, que elimina todas aquellas instrucciones irrelevantes al ensamblar tu programa, de manera que no se gasten innecesariamente ciclos del procesador.

Así, si tenemos un código como este:

Código Delphi [-]
var
  I: Integer;
begin
  I:= 10;
end;

Al comiplar, el optimizador se da cuenta que el valor de I no es usado nunca, nos muestra un hint en la consola y elimina la instrucción de asignación, pues el valor no se utilizará en el programa. Esta pieza de delphi es realmente sofisticada, y nunca lo he visto fallar. Así, al hacer algo como:

Código Delphi [-]
var
  L: TList;
begin
  L:= TList.Create;
  try
    L.Add(Objeto1);
    UsarLista(L);
    L.Add(Objeto2);
  finally
    L.Free;
  end;
end;

Es probable que el optimizador también note que luego de añadir el Objeto2, la lista no se use mas, y por tanto, la instrucción no es necesaria. Esto supone que el optimizador conoce la VCL, y por tanto sabe cómo optimizar también su uso, cosa que yo no creía probable.

Habrá que leer un poco acerca de él.

Hasta luego.



pd. Edité tu mensaje para cambiar la etiqueta code por la etiqueta delphi. Veras que queda mucho mejor.
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #14  
Antiguo 25-01-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Hola...

Para poder ver lo que tiene un TStringList mediante el Watch, tienes dos formas:

1. Colocar en el Watch Lista.Text o
2. Colocar en el Watch Lista[n], donde n es el índice que quieras ver, así para ver que valor está en la primera posición de la lista haces: Lista[0]

Si colocas el cursor sobre la variable Lista no vas a ver el contenido de la variable, para eso tendrías que tener en código algo como Lista.Text y poner el cursor sobre Text...


Saludos...
Responder Con Cita
  #15  
Antiguo 25-01-2008
david.rguez david.rguez is offline
Miembro
 
Registrado: jun 2006
Ubicación: Zamora, la bien cercada
Posts: 104
Poder: 18
david.rguez Va por buen camino
jachguate, gracias por la información, realmente interesante; aunque no creo que ese sea el problema, pues sigue sin mostrarlo en depuración aunque sí lo graba (habiendo ya colocado correctamente el Free).

Cita:
Empezado por maeyanes Ver Mensaje
Hola...

Para poder ver lo que tiene un TStringList mediante el Watch, tienes dos formas:

1. Colocar en el Watch Lista.Text o
2. Colocar en el Watch Lista[n], donde n es el índice que quieras ver, así para ver que valor está en la primera posición de la lista haces: Lista[0]

Si colocas el cursor sobre la variable Lista no vas a ver el contenido de la variable, para eso tendrías que tener en código algo como Lista.Text y poner el cursor sobre Text...


Saludos...
Pues yo había mirado lo del cursor porque cuando voy a un objeto que no tiene valor como tal (sino que hay que acceder a una de sus propiedades) me sale el tipo y herencia del componente. Por eso, al ver dos paréntesis sin nada dentro en este, asumí que mostraba una lista sin contenido.

Gracias.
Responder Con Cita
Respuesta



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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
¡En un mes me caso! ContraVeneno La Taberna 54 23-10-2006 10:15:56
Caso específico sierraja Firebird e Interbase 9 12-01-2006 00:18:54
Caso con DLL. mlara Varios 12 19-08-2005 04:48:20
Caso SuperRaro con Transacciones AGAG4 SQL 2 19-08-2004 16:32:28
Caso real.... jafl1965 Humor 1 04-11-2003 10:36:05


La franja horaria es GMT +2. Ahora son las 15:01:03.


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
Copyright 1996-2007 Club Delphi