Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Form Modal me deja congelado el proceso (https://www.clubdelphi.com/foros/showthread.php?t=87450)

aguml 08-01-2015 10:41:27

Form Modal me deja congelado el proceso
 
Pues amigos, al no saber como crear un MessageBox con botones con textos personalizados, pues me he creado un nuevo form que muestro y elijo el boton que sea y esa es la idea pero no va como esperaba. Hago esto:

Linea que muestra el form del dialogo desde el form principal:
Código PHP:

DialogQuerySaveAs->ShowModal(); 

Form que nos pregunta que queremos hacer:
Código PHP:

#include <vcl.h>
#pragma hdrstop

#include "DialogQuerySaveAs.h"
#include "UnitMain.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TDialogQuerySaveAs *DialogQuerySaveAs;
//---------------------------------------------------------------------------
__fastcall TDialogQuerySaveAs::TDialogQuerySaveAs(TComponentOwner)
   : 
TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TDialogQuerySaveAs::FormShow(TObject *Sender)
{
   
FormMain->IdValorSaveAs ID_ERROR;
   
DialogQuerySaveAs->Close();
}
//---------------------------------------------------------------------------

void __fastcall TDialogQuerySaveAs::Button1Click(TObject *Sender)
{
   
FormMain->IdValorSaveAs ID_IMAGE_TO_FILE;
   
DialogQuerySaveAs->Close();
}
//---------------------------------------------------------------------------

void __fastcall TDialogQuerySaveAs::Button2Click(TObject *Sender)
{
   
FormMain->IdValorSaveAs ID_IMAGE_TO_CLIPBOARD;
   
DialogQuerySaveAs->Close();
}
//---------------------------------------------------------------------------

void __fastcall TDialogQuerySaveAs::Button3Click(TObject *Sender)
{
   
FormMain->IdValorSaveAs ID_FLOW_TO_FILE;
   
DialogQuerySaveAs->Close();
}
//---------------------------------------------------------------------------

void __fastcall TDialogQuerySaveAs::Button4Click(TObject *Sender)
{
   
FormMain->IdValorSaveAs ID_CANCELAR;
   
DialogQuerySaveAs->Close();
}
//--------------------------------------------------------------------------- 

El caso es que parece ir todo bien, obtengo el valor y todo y salgo del metodo desde donde llamo a ShowModal pero se queda congelado el form principal. Supongo que lo que hago es una salvajada pero no se me ocurrio nada mejor asi que, si podeis ayudarme, por favor ayudenme :(.

escafandra 08-01-2015 20:47:28

Te muestro un ejemplo usando ModalResult:
Crea el formulario que va a ser modal como disponible y no como autocreado.

UNIT1.CPP
Código PHP:

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponentOwner)
  : 
TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  
TForm2 *Dialog = new TForm2(this);
  
TModalResult Result Dialog->ShowModal();
  if(
Result == mrOkShowMessage("OK");
  else if(
Result == mrCancelShowMessage("Cancel");
  else if(
Result == mrOtroShowMessage("Otro");
}
//--------------------------------------------------------------------------- 

UNIT2.H
Código PHP:

#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------

TModalResult mrOtro mrNo 1;

class 
TForm2 : public TForm
{
__published:    // IDE-managed Components
  
TButton *Button1;
  
TButton *Button2;
  
TButton *Button3;
  
void __fastcall Button1Click(TObject *Sender);
  
void __fastcall Button2Click(TObject *Sender);
  
void __fastcall Button3Click(TObject *Sender);
private:    
// User declarations
public:        // User declarations
  
__fastcall TForm2(TComponentOwner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm2 *Form2;
//---------------------------------------------------------------------------
#endif 

UNIT2.CPP
Código PHP:

#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponentOwner)
  : 
TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm2::Button1Click(TObject *Sender)
{
  
ModalResult mrOk;
}
//---------------------------------------------------------------------------

void __fastcall TForm2::Button2Click(TObject *Sender)
{
  
ModalResult mrCancel;
}
//---------------------------------------------------------------------------

void __fastcall TForm2::Button3Click(TObject *Sender)
{
  
ModalResult mrOtro;
}
//--------------------------------------------------------------------------- 

Saludos.

aguml 09-01-2015 00:20:26

¿Como es eso de crearlo como disponible? Yo lo intenté hacer como tu pero en la linea del new se quedaba y no pasaba de ahi. ¿Como lo haces? Me interesa ver el unit1.h por si haces algo que me falta.

escafandra 09-01-2015 00:26:47

En opciones del proyecto->Forms puedes configurarlo como autocreado o disponible. Te interesa que solo exista cuando lo necesites. Te subo el proyecto.

Saludos.

aguml 09-01-2015 12:51:37

Ok amigo, muchas gracias por todo. En cuanto tenga un rato libre lo miro a ver si me entero.

aguml 09-01-2015 13:59:40

Muchas gracias amigo, yo hice todo lo que tu hiciste en tu proyecto pero me faltó lo que indicas de hacer accesible al form desde las opciones del proyecto y supongo que por eso se quedaba congelado. Ya funciona como la seda jejeje.


La franja horaria es GMT +2. Ahora son las 12:22:54.

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