Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Problema al cerrar formulario (https://www.clubdelphi.com/foros/showthread.php?t=73696)

mizzard 10-05-2011 20:39:56

Problema al cerrar formulario
 
Hola, se me presenta el siguiente problema.

Digamos que tengo un formulario principal y que cuando pulso un boton muestro otro:
Código:

        TfrmRetirarTarjeta *frmRetirarTarjeta;
        frmRetirarTarjeta = new TfrmRetirarTarjeta(this);
        frmRetirarTarjeta->ShowModal();

El caso es que una vez que lo abro desactivo el timer del formulario principal (que detecta eventos) y habilito el timer del nuevo formulario.

Mi intención es que cuando se detecte el evento automáticamente se cierre el formulario y volver al principal.

Debugeando he visto como efectivamente lo hace todo bien, pero cuando llega a la linea:

Código:

Close();
La ignora y no lo cierra. He probado con un boton en el nuevo formulario y la misma linea de codigo y si que va. Tambien he probado con CloseModal() y nada...

No le encuentro sentido..., ideas?

Un saludo!

escafandra 10-05-2011 22:34:56

No entiendo porque usas un formulario modal, éstos se usan para bloquear la aplicación y requerir al usuario cierta acción que precisa su intervención.

En cualquier caso y sin ver tu código de cierre, intuyo tu problema. Posiblemente tengas definida la variable frmRetirarTarjeta dos veces, una como global y otra como local en la función donde creas el formulario modal. A demás, posiblemente, tu Formulario frmRetirarTarjeta lo definiste como autocreado y no como disponible.

Si frmRetirarTarjeta es un autocreado esto te servirá:
Código:

// Mostrar
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Timer1->Enabled = true;
  frmRetirarTarjeta->ShowModal();
}

// Cerrar
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  Timer1->Enabled = false;
  frmRetirarTarjeta->Close();
}

En otro caso debes declarar frmRetirarTarjeta como global o como miembro de Form1 y proceder así:

Código:

// Global...
TfrmRetirarTarjeta *frmRetirarTarjeta;

// Mostrar
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Timer1->Enabled = true;
  frmRetirarTarjeta = new TfrmRetirarTarjeta(this); 
  frmRetirarTarjeta->ShowModal();
  Timer1->Enabled = false; 
}

// Cerrar
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  Timer1->Enabled = false;
  frmRetirarTarjeta->Close();
}

// Y definir el evento OnClose de TfrmRetirarTarjetapara destruir el formulario y liberarlo de la RAM
void __fastcall TfrmRetirarTarjeta::FormClose(TObject *Sender, TCloseAction &Action)
{
  Action = caFree;
}


Saludos.

mizzard 11-05-2011 23:16:49

hola, gracias por la respuesta, es justo lo q necesitaba.

El problema lo tenia porque me habia hecho un lio y desactivaba el timer del form principal y activaba el del secundario y la cosa no iba bien.

Al tener control desde el timer del principal (que como está abierto en segundo plano) todo funciona perfectamente y con menos código.

Muchas gracias por tu amable ayuda.

Un saludo!


La franja horaria es GMT +2. Ahora son las 19:04:14.

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