Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
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 29-05-2018
Avatar de ethangio
ethangio ethangio is offline
Miembro
 
Registrado: Jul 2008
Posts: 50
Poder: 11
ethangio Va por buen camino
Cerrar Form2 desde Form3

Buen día a todos.

Sonará común pero creanme que ya he buscado y probado código y no encuentro algun indicio de solución.

Tengo Form1 con un boton que muestra Form2 mediante ShowModal, Form2 que en su evento OnActivate muestra un Form3.ShowModal, en Form3 mediante un boton quiero cerrar Form2 y asi mismo y no lo hace, el codigo es el siguiente :

Código Delphi [-]
procedure TForm3.Button1Click(Sender: TObject);
begin
  form2.Close;
  form3.Close;
end;

Pero si en Form2 pongo un Boton que muestre Form3.ShowModal, en Form3 el boton (codigo anterior) si funciona, cierra Form2 y Form3.

Gracias anticipadas por tomarse el tiempo de leer y responder. Saludos.
Responder Con Cita
  #2  
Antiguo 30-05-2018
Avatar de ethangio
ethangio ethangio is offline
Miembro
 
Registrado: Jul 2008
Posts: 50
Poder: 11
ethangio Va por buen camino
El codigo es bastante sencillo.

Unit1:

Código Delphi [-]
uses unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.ShowModal;
end;

Unit2:

Código Delphi [-]
uses unit3;

procedure TForm2.Button1Click(Sender: TObject);
begin
  Form3.ShowModal; // Desde aqui SI funciona cerrar desde Form3
end;

procedure TForm2.FormActivate(Sender: TObject);
begin
  Form3.ShowModal; // Desde aqui NO funciona cerrar desde Form3
end;

Unit3:
Código Delphi [-]
uses unit2;

procedure TForm3.Button1Click(Sender: TObject);
begin
  form2.Close;
  form3.Close;
end;
Responder Con Cita
  #3  
Antiguo 30-05-2018
bucanero bucanero is offline
Miembro
 
Registrado: Nov 2013
Ubicación: Almería, España
Posts: 111
Poder: 5
bucanero Va por buen camino
hola ethangio

Cita:
Empezado por ethangio Ver Mensaje



Código Delphi [-]

....
procedure TForm2.FormActivate(Sender: TObject);
begin
  Form3.ShowModal; // Desde aqui NO funciona cerrar desde Form3
end;
Realmente si que funciona, lo que ocurre es que al cerrar el Form3 el form2 recupera nuevamente el foco y te vuelve a ejecutar el evento FormActivate, volviendo a lanzar otra vez el Form3, por lo que entras en bucle. Si deseas ejecutar el form3 al abrir el form2 usa el evento OnShow, que solo lo realiza una vez


En cuanto a tu código, si realmente en el botón del form3 quieres cerrar los dos formularios y para evitar vinculos cruzados de unidades yo lo pondría así:
Unit2
Código Delphi [-]
procedure TForm2.Button1Click(Sender: TObject);
begin
  //muestra el formulario 3
  Form3.showModal;
  // cierra el formulario 2
  Close;
end;

Unit3
Código Delphi [-]
procedure TForm3.Button1Click(Sender: TObject);
begin
  // cierra el formulario 3 
  Close;
end;
De esta forma cada formulario controla su propio cierre, sin que otro formulario intervenga.


Saludos!!
Responder Con Cita
  #4  
Antiguo 30-05-2018
Avatar de ethangio
ethangio ethangio is offline
Miembro
 
Registrado: Jul 2008
Posts: 50
Poder: 11
ethangio Va por buen camino
Muchas gracias bucanero por responder, la idea es que el form2 actúe como fondo de pantalla y solo deje al form3 completamente visible y es por eso mi necesidad de cerrar el form2 desde el form3.

Agradecería que probaras el código porque no sé cómo explicarme lo que sucede cuando se ejecuta form3.ShowModal en Form2.Activate.

Saludos y nuevamente gracias
Responder Con Cita
  #5  
Antiguo 30-05-2018
bucanero bucanero is offline
Miembro
 
Registrado: Nov 2013
Ubicación: Almería, España
Posts: 111
Poder: 5
bucanero Va por buen camino
Vale ya veo el problema que tienes. Si lo que quieres es utilizar el form2 como fondo e inicias el form3 en el ONSHOW del form2, el form2 no se te muestra hasta después de finalizar el form3, y por eso estas utilizando el ONACTIVATE... pero es que así entras en bucle o corres el riesgo de hacer operaciones en el form2 estando ya en modo de cierre o inactivo.

Prueba lo siguiente, inserta en el form2 un TTimer con la propiedad enabled desabilitada y utiliza el siguiente código en UNIT2:

Código Delphi [-]
procedure TForm2.FormShow(Sender: TObject);
begin
  // activa el temporizador para que le de tiempo a finalizar el proceso de creación y mostrado del form2
  Timer1.Interval := 300;
  Timer1.Enabled := True;
end;

procedure TForm2.Timer1Timer(Sender: TObject);
begin
  // desactiva el timer
  Timer1.Enabled := false;
  // muestra form3
  Form3.showModal;
  Close;
end;
Responder Con Cita
  #6  
Antiguo 30-05-2018
Avatar de ethangio
ethangio ethangio is offline
Miembro
 
Registrado: Jul 2008
Posts: 50
Poder: 11
ethangio Va por buen camino
Bucanero, hice como me dijiste y obtengo el siguiente error: " Cannot make a visible window modal "

No entro en bucle con el evento OnActivate. Probe poniento un mensaje en ese evento y solo lo hace despues de mostrarse:

Código Delphi [-]
procedure TForm2.FormActivate(Sender: TObject);
begin
  ShowMessage('Activo');
  Form3.ShowModal;
end;

Lo que no me puedo explicar es por qué cuando presiono el boton del Form2 y muestro el Form3 al cerrar las ventanas con el boton del Form3 si funciona el cierre del Form2.

Por favor prueba el codigo que utilizo en el ejemplo y sabrás a lo que me refiero. Gracias.
Responder Con Cita
  #7  
Antiguo 30-05-2018
bucanero bucanero is offline
Miembro
 
Registrado: Nov 2013
Ubicación: Almería, España
Posts: 111
Poder: 5
bucanero Va por buen camino
Cita:
Empezado por ethangio Ver Mensaje
Bucanero, hice como me dijiste y obtengo el siguiente error: " Cannot make a visible window modal "
No se por que te da ese error, he vuelto a probar el código que te puse y a mi me funciona perfectamente,
Comprueba que el Timer se lance en el evento OnShow y no en el OnActivate.
A mi se me abre el form2 y form3, quedando el form2 de fondo, y al cerrar el form3, bien con el botón o bien desde los controles de la ventana, también se cierra automáticamente el form2.

Cita:
Empezado por ethangio Ver Mensaje
Lo que no me puedo explicar es por qué cuando presiono el botón del Form2 y muestro el Form3 al cerrar las ventanas con el botón del Form3 si funciona el cierre del Form2.
Y probando exactamente tu código, me pasa lo mismo que explicas.

Creo que se debe a que hasta que no se ejecuten todos los procesos de inicialización de la ventana no te permite cerrarla, estos procesos al menos son los que incluye los eventos OnShow y el OnActivate.

De hay mi solución del TTimer para darle tiempo a la ventana a finalizar sus procesos y poner la parte del control del FORM3 fuera de los procesos de la ventana 2 .
Responder Con Cita
  #8  
Antiguo 30-05-2018
Avatar de ethangio
ethangio ethangio is offline
Miembro
 
Registrado: Jul 2008
Posts: 50
Poder: 11
ethangio Va por buen camino
Perdón bucanero tenia un error de dedo por eso el error, valga la redundancia.

La solucion que me dijiste efectivamente funciona. Agradezco mucho tu tiempo y la solucion que me proporcionaste.

Un abrazo y de nuevo muchas gracias.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Obtener valor de una propiedad de una Tabla en un Form1 desde otro Form2 Yugo C++ Builder 6 19-11-2015 10:57:08
abrir y cerrar form2 desde form1 aitorqrv Lazarus, FreePascal, Kylix, etc. 15 20-12-2013 21:11:05
Dejar siempre visible Form2 que se llama desde Form1 yevabas Varios 1 11-05-2013 00:45:40
acceder al form1 desde el form2. petete2008 OOP 2 08-02-2012 20:29:59
form2 cerrar el form1 ingabraham Varios 6 07-01-2009 19:11:13


La franja horaria es GMT +2. Ahora son las 05:25:55.


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