Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Saber cuando se destruye un formulario (https://www.clubdelphi.com/foros/showthread.php?t=97395)

oscjae 09-04-2025 09:58:38

Saber cuando se destruye un formulario
 
Buenos días, tengo una pregunta rápida, hay alguna forma de saber si un formulario se ha cerrado?, para poder ejecutar la apertura de otro, pero necesito que el formulario primero se haya cerrado, se haya destruido, para poder abrir el segundo.
Gracias!!!

Neftali [Germán.Estévez] 09-04-2025 11:23:40

Cita:

Empezado por oscjae (Mensaje 563570)
hay alguna forma de saber si un formulario se ha cerrado?, para poder ejecutar la apertura de otro, pero necesito que el formulario primero se haya cerrado, se haya destruido, para poder abrir el segundo.

En el formulario tienes los eventos OnClose, OnCloseQuery y OnDestroy donde puedes poner el código que necesites para controlar eso.
Puedes capturar el evento OnDestroy para saber justo lo que estás pidiendo, saber cuando se está destruyendo eso form.

Neftali [Germán.Estévez] 09-04-2025 11:30:30

Con un código como este puedes capturar el evento OnDestroy.

Código Delphi [-]
...
type
  TFormMain = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure SeDestruyeForm(Sender:TObject);
  public
    { Public declarations }
  end;

var
  FormMain: TFormMain;

implementation

{$R *.dfm}

uses unit2;

procedure TFormMain.Button1Click(Sender: TObject);
begin
  Form2 := TForm2.Create(Application);
  Form2.OnDestroy := SeDestruyeForm;
  Form2.Show;
end;

procedure TFormMain.SeDestruyeForm(Sender: TObject);
begin
  ShowMessage(Format('Se ha destruido el formulario <%s>',[TForm(Sender).Name]));
end;

En el OnClose del segundo formularuio debes poner que se destruya.

oscjae 09-04-2025 12:39:31

Gracias por contestar, es un poco mas complicado, te pongo en situación, tengo un formulario desde el que llamo a otro, es un tema de fastreport, en ese formulario (Form2) recién creado tiene un componente frxDesigner que se utiliza para diseñar un informe, con sus eventos, SaveReport, etc... que capturo y tengo cierto código, cuando cierro ese formulario abro otro (Form3), que también tiene ese componente frxDesigner, y lo mismo que el anterior tiene sus eventos, el problema está que cuando se abre el tercer formulario esta cogiendo la instancia del componente del segundo formulario, y no pasa por los eventos del componente del propio formulario, espero estar explicándome bien, por eso necesito saber cuando se ha destruido "Form2" para poder crear "Form3"

Por cierto, el "form2" es ShowModal

Desde el "form1"....

Código Delphi [-]
procedure TForm1.CreateForm2;
begin
  Form2:=TForm2.Create;
  Form2.ShowModal;

  Form3:=TForm3.Create
  Form3.Show;
end;

Lo he solucionado con "Notifications", he creado en el Form1 ...

Código Delphi [-]
 

procedure Notification(AComponent: TComponent;  Operation: TOperation);override; 

...

procedure TForm1.Notification(AComponent: TComponent; Operation: TOperation);
begin
  if (Operation = opRemove) and (AComponent is TForm2) then
    CrearForm3;

end;

Me aseguro de que el formulario se ha eliminado y creo el "form3", y funciona, no se si habrá otra forma mas elegante, jeje
O si ves algún posible problema por utilizar ese método.

Gracias.

Neftali [Germán.Estévez] 09-04-2025 13:56:09

Cita:

Empezado por oscjae (Mensaje 563580)
...el problema está que cuando se abre el tercer formulario esta cogiendo la instancia del componente del segundo formulario, y no pasa por los eventos del componente del propio formulario,

Creo que independientemente de que lo hayas solucionado con notificaciones (como dices), lo grave y lo que tal vez te está indicando que tienes un problema de diseño es esto que te pasa.
No debería pasar (si las cosas se hacen correctamente) que un formulario "esté cogiendo la instancia de otro" (no entiendo muy bien qué quiere decir eso).

Yo me preocuparía, no porque se haya arreglado, sino porqué te pasaba eso.

oscjae 09-04-2025 15:35:00

Quizas me he expresado mal con lo de la instancia, en el "Form2" creé un destructor, y le puse un punto de ruptura, en un momento dado, en el Form2 hago un close, y la creación del Form3 ocurre antes de que salte el Destroy del "Form2", el close del Form2 tiene un
Código Delphi [-]
action:=caFree
, el problema es que antes de que se destruya el Form2 se esta creando el Form3, y en la documentación del FastReport dice que para el diseño, solo hace falta soltar el componente en el proyecto, y siempre que se llame a "DesignReport" internamente enlazará ese componente.
Hice una prueba de quitar el componente del Form2 y funcionó bien, así que el problema estaba en que algo estaba pasando con el componente del Form2, no se como FastReport hace ese enlace internamente.

Imagino que cuando haces Close, hay una pila de llamadas que tardan en procesarse, y la destrucción del Form2 no se ha procesado cuando se crea el Form3, por eso lo de "Notification".

Neftali [Germán.Estévez] 09-04-2025 16:04:51

Si quieres pon un ejemplo pequeño donde se reproduzca el problema y lo revisamos.

oscjae 10-04-2025 08:58:10

En cuanto pueda pongo un ejemplo y lo vemos.


La franja horaria es GMT +2. Ahora son las 09:35:38.

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