FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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); 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? |
#2
|
|||
|
|||
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... |
#3
|
|||
|
|||
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); |
#4
|
||||
|
||||
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:
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 |
#5
|
|||
|
|||
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 |
#6
|
||||
|
||||
¿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 |
#7
|
||||
|
||||
¿Podemos ver el código (no sólo una línea)?
|
#8
|
||||
|
||||
Hola.
Cita:
No dejes de respondernos sobre estas cuestiones, aún cuando hayas encontrado la solución. Saludos. Al González. |
#9
|
||||
|
||||
Cita:
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 |
#10
|
||||
|
||||
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. |
#11
|
|||
|
|||
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:
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 |
#12
|
|||
|
|||
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. |
#13
|
||||
|
||||
Cita:
Cita:
Cita:
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:
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:
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 |
#14
|
|||
|
|||
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... |
#15
|
|||
|
|||
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:
Gracias. |
|
|
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 |
|