Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Cerrar Form2 desde Form3 (https://www.clubdelphi.com/foros/showthread.php?t=93145)

ethangio 30-05-2018 00:49:13

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.

ethangio 30-05-2018 03:47:14

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;

bucanero 30-05-2018 13:18:57

hola ethangio

Cita:

Empezado por ethangio (Mensaje 526689)



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!!

ethangio 30-05-2018 14:13:54

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

bucanero 30-05-2018 14:56:27

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;

ethangio 30-05-2018 19:29:17

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 :confused: 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.

bucanero 30-05-2018 20:10:16

Cita:

Empezado por ethangio (Mensaje 526723)
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 (Mensaje 526723)
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 .

ethangio 30-05-2018 20:43:50

Perdón bucanero tenia un error de dedo por eso el error, valga la redundancia. :D

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

Un abrazo y de nuevo muchas gracias.


La franja horaria es GMT +2. Ahora son las 14:12:06.

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