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 16-06-2004
ctronx ctronx is offline
Miembro
 
Registrado: jun 2004
Posts: 214
Poder: 13
ctronx Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 16-06-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.871
Poder: 20
delphi.com.ar Va por buen camino
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í:

Código Delphi [-]
for i := Screen.FormCount -1 downto 0 do
  if Screen.Forms[i] is TMiForm Then
    Screen.Forms[i].Free;
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 16-06-2004
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 18
eduarcol Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 16-06-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.243
Poder: 21
jachguate Va por buen camino
Cool

Cita:
Empezado por eduarcol
Algo que yo haria seria quitar la referencia al objeto Form2.Close
En general evitá usar este tipo de referencias, y cuando programes un formulario del que podrán haber varias instancias definitivamente es imprescindible que lo hagas. De hecho, es buena idea que incluso quites la variable Global que delphi ha creado de la clase del formulario (en este caso Form2).

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
Responder Con Cita
  #5  
Antiguo 17-06-2004
ctronx ctronx is offline
Miembro
 
Registrado: jun 2004
Posts: 214
Poder: 13
ctronx Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 17-06-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.243
Poder: 21
jachguate Va por buen camino
Cool

Podes tener una variable global que se llame UltimoForm2Activo, por ejemplo, de tipo TForm2.

En el evento OnActivate del TForm2 pone:

Código Delphi [-]
Begin
  UltimoForm2Activo := self;
End;

Y en el form3 podes hacer algo como:

Código Delphi [-]
Begin
  if assigned(UltimoForm2Activo) Then
    UltimoForm2Activo.Edit1.Text := 'CualquierCosa';
end;

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
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 01:18:10.


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