PDA

Ver la Versión Completa : Form Modal me deja congelado el proceso


aguml
08-01-2015, 10:41:27
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:
DialogQuerySaveAs->ShowModal();

Form que nos pregunta que queremos hacer:
#include <vcl.h>
#pragma hdrstop

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

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TDialogQuerySaveAs *DialogQuerySaveAs;
//---------------------------------------------------------------------------
__fastcall TDialogQuerySaveAs::TDialogQuerySaveAs(TComponent* Owner)
: 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

#include <vcl.h>
#pragma hdrstop

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

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


UNIT2.H

#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(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm2 *Form2;
//---------------------------------------------------------------------------
#endif


UNIT2.CPP

#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: 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.