Error TStringList creados en tiempo de ejecución
Hola a todos/as....
Nuevamente consultado... Mi problema es el siguiente, tengo una una FORM en la cual tengo incluidos varios componentes dentro de los cuales esta un Combobox, el cual es llenado desde una consulta, ya que es necesario guardar el identificador de los datos que son almacenados en el Combo, declaro una variable de tipo TStringList en Private, y luego a este le digo que se cree en el evento OnCreate de la Forma de esta manera: Lista := TStringList.Create; Luego lleno los datos tanto en el combo como en la lista que he creado y hasta aqui todo bien. Cuando cierro la Form en el evento OnClose libero la variable: Lista.Free; El problema surge cuando nuevamente quiero entrar a esta forma pués me indica que hay una excepcion con un error en la violación de la dirección, encerre el codigo con el que hago el llamado en try...except pero sigue apareciendo el error Agradezo cualquier idea... |
¿Podemos ver el código? ¿El OnCreate, el OnClose y el código de llenar el Combo y la Lista? Gracias
|
bueno puse a que el objeto se creara no cuando se crea la forma sino cuando se abre en el evento OnShow de la Form
y hasta el momento parece funcionar... Gracias "ixMIKE" |
Cita:
Salu2. |
Si tus formularios no son creados dinámicamente, es decir solo necesitas llamarlos a través de formulario.show, realiza la creación de la variable en el evento Onshow del formulario.
|
Cita:
Salud OS |
siguiendo la sugerencia de ixMIKe esto es lo que hago....
Espero que ahora este mucho más claro... saludos! |
En primer lugar, recomiendo que el TStringList debiera crearse en el OnCreate del formulario y destruirse en el OnDestroy.
En el OnShow basta con que se quede la sentencia Lista.Clear que por ahora está de mas. Hasta luego. ;) |
Cita:
suerte |
Cita:
De hecho, creo que podría ser en ambos... siempre depende. |
Yo opto por el OnCreate, es lo "más seguro para nuestro código", o bien amarrar bien con FreeAndNil la lista, pero es marear la perdiz en este caso. Si queremos tener una lista en memoria a la misma par que un combo, dará igual cargarla después de crear el form que antes de mostrar el form.
Si lo dejas en el OnShow, basta que hagas un : form1.hide; form1.show; form1.hide; form1.show; form1.hide; form1.show; Para crear 3 listas en memoria con los datos repetidos, las 2 primeras listas se quedaran en el limbo de RAM. Y en otro orden..... ¿para qué usas esa lista? ya tienes el combo, podrías utilizarlo para buscar elementos o lo que quieras, mientras no asignes el itemindex del combo, no cambiará la selección del mismo. Saludos |
Cita:
Dinámico: El formulario es creado al vuelo. Antes de iniciar la llamada al formulario debe crearse la instancia. Estático: El formulario es creado al iniciar la aplicación. Al llamarlo, siempre se llama a la misma instancia. Dinámico. Los elementos se destuyen y construyen con el formulario. Estático. Se crean elementos en el evento OnCreate (Elementos creados una sola ocasión) Se destruyen los elementos al cerrar el formulario. Al llamar a la misma instancia, debido a que esta no es creada nuevamente, los elementos a los que se intenta acceder ya no existen pues fueron destruidos al cerrar el formulario. Punto |
Cita:
Cita:
|
Cita:
Hasta luego. ;) |
Completo un poquito más:
Cita:
El ciclo de vida es el mismo para ambos tipos de Forms. En honor a la verdad, poliburro ha detectado el fallo del access violation, pero creo no ha sabido explicarse porque tanto jachguate como yo lo hemos malinterpretado. 1º- Deja el StringList en el oncreate como lo tenías. Liberas la lista en el OnDestroy. 2º- El access violation es problema de cómo usas tus ventanas, no tiene nada que ver con el TStringList. Si tu ventana se llama FrmClientes (por decir algo) y esa variable la usas en todas tus ventanas, en el Onclose añade:
cuando necesites usar la ventana de nuevo, comprueba si ya está abierta:
Si no usas la variable FrmCliente en tu aplicación, es decir, creas las ventanas así:
Entonces no puedes usar el evento OnClose para poner la variable FrmClientes a nil, siempre deberías usar FreeandNil(f) o de la variable que uses. Saludos |
La franja horaria es GMT +2. Ahora son las 04:44:49. |
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