FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
cerrar formularios creados dinamicamente
tengo un boton que crea un formulario dinamicamente, cada vez que presiono el boton se crean tantos formularios como veces presione el boton, en ese formulario hay un boton con el codigo form2.close que queria utilizar para cerrarlo, pero solo cierra el ultimo, cuando doy clic a otro boton del formulario de los creados para cerrarlo me marca algo asi como error de acceso a memoria, mas sin embargo si a cada formulario de los creados lo voy cerrando con el icono de la "x" del lado superior derecho de cada uno, puedo irlos cerrando sin ningun problema.
gracias por cualquier ayuda que pueden darme. |
#2
|
||||
|
||||
Tienes muchas formas de hacerlo, crear un form es casi lo mismo que crear cualquier otro objeto, y cuando creamos un objeto, si luego queremos tener alguna referencia a este para poder eliminarlos, lo que hacemos es crear o un vector o una colección con los apuntadores a estos objetos. Tratándose de Forms, podrías recorrer la colección screen.Forms[] y liberar aquellos que pertenezcan a una misma clase, prueba algo así:
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#3
|
||||
|
||||
Algo que yo haria seria quitar la referencia al objeto Form2.Close, solamente con colocar el Close estarias haciendo referencia al formulario que quieres cerrar en ese momento ya que el codigo lo tienes dentro del mismo
__________________
...Yo naci en esta ribera del arauca vibr@d0r Soy hermano de la espuma, de la garza, de la rosa y del sol... Viva Venezuela |
#4
|
||||
|
||||
Cita:
De esta manera el código programado hará referencia a los métodos de la instancia sobre la que se ejecuten, y no de la instancia hacia donde apunte la variable Form2, que en tu caso (y porque creas el formulario con algo como Form2 := TForm2.Create(application)) apunta siempre al último formulario creado. Para la creación de las instancias del formulario, podes utilizar una variable local, o simplemente un TForm2.Create(application); Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#5
|
|||
|
|||
ya puse solo close en lugar de form2.close y me funciono perfectamente para cerrar cada instancia creada de los formularios.
intente quitar la variable globlal var form2: Tform2; y ponerla como local, pero en una parte en que intento pasar el un valor al form2 estando en un formulario distinto llamado form3: form2.Edit1.Text:=Edit5.Text; //este codigo y el Edit5 estan en un boton del Form3 Me marca error, el cual creo que es porque ya no tiene la varible global que utilizaba form2, antes si me funcionaba pero pasaba el valor solo al ultimo form2 creado, Como puedo pasarle un valor desde el Form3 a la instancia que tenia activa del Form2 que no necesariamente es la ultima creada. Gracias por la ayuda que puedan darme. |
#6
|
||||
|
||||
Podes tener una variable global que se llame UltimoForm2Activo, por ejemplo, de tipo TForm2.
En el evento OnActivate del TForm2 pone:
Y en el form3 podes hacer algo como:
Aprovecho para darte otro consejo, y es que nunca acceses a las propiedades de los objetos contenidos en un formulario desde otro. Es mejor, de cara a las futuras modificaciones de la interfaz, crear propiedades en los formularios y hacer las asignaciones mediante estas. De esta forma el día de mañana podes dejar de usar TEdits y cambiarlo por (digamos) TComboBox o TdbEdits y tenes que reprogramar únicamente dentro del TForm2, siendo el cambio transparente para el resto de la aplicación. Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
|
|
|