PDA

Ver la Versión Completa : Como salir del create con modalresult


jdiazan
27-06-2003, 12:08:46
Hola a todos:
Tengo un gran problema, cuando creo una ficha, quiero o en el create o en el activate poder salir de la ficha pero no tengo forma ocea.. si hago esto no sale

With tform1.create( application ) do
begin

case showmodal of

mrok:tal y tal;
mryes:tal y tal;

end;
free;

end;

ahora en el create de la tform1 esto por ejemplo claro.

constructor tform1.create( owner : tcomponent )
Begin
inherited create( owner );
// llamo a un procedimiento
//ahora me salgo

modalresult := mrok; //ó Close
{ se queda la ventana mostrandose pero no sale como puedo hacer que salga en este punto }

end;

Muchas gracias de antemano...

nachoasensio
27-06-2003, 14:20:45
Hola:

Me parece que estás haciendo un uso muy extraño de ModalResult y ShowModal. En principio ShowModal deberías utilizarlo para mostrar otro formulario distinto, no para tí mismo.


// Este código está en Form1

retorno := Form2.ShowModal;

if retorno = mrOk then
begin
...
end
else
begin
...
end;



Y, cuando quieras salir del formulario Form2 haces


// Este código está en Form2
ModalResult := mrOk;


Una pregunta: ¿buscáis programadores en Delphi en Domain?

Un saludo

Nacho

jdiazan
27-06-2003, 14:38:03
Gracias nacho por la respuesta.
Pero, Prueba hacer el modalresult dentro del create a ver que ocurre...
Verás que la ventana Form2 sigue viendose.

Por cierto con el método que te expongo,
1 te ahoras una variable de retorno
2 el uso de case es mas rápido que el if, almenos eso tengo entendido de los tiempos de turbo-pascal, aunque claro es tan válido como otro cualquiera el uso del if, ya que las máquinas son tanrápidas ahora que.....
3 incluso te ahoras la variable form2

Gracias nacho...
prueba eso y me dices...

Lo del trabajo aún no necesitamos pero quién sabe...

delphi.com.ar
27-06-2003, 17:17:48
El tema es que el create se ha ejecutado antes del ShowModal, si pones un BreakPoint en el evento Create del TForm y otro en donde haces el ShowModal te darás cuenta de lo que sucede, digamos que el formulario no es modal hasta que se ejecute el ShowModal.
Pero igualmente, si ven el código del método ShowModal, se darán cuenta que se ModalResult se evalúa una ves mostrado el Form, o sea que ni en el Activate puedes hacer lo que quieres.


Saludos!

roman
27-06-2003, 17:22:46
Una forma de hacerlo:


const
CM_CLOSE = WM_USER + 1;

type
TForm2 = class(TForm)
procedure FormCreate(Sender: TObject);
private
procedure CMClose(var Message: TMessage); message CM_CLOSE;
end;

implementation

procedure TForm2.CMClose(var Message: TMessage);
begin
ModalResult := mrOk;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
PostMessage(Handle, CM_CLOSE, 0, 0);
end;


PostMessage manda el mensaje pero sólo hasta que se procese el resto de mensajes, en este caso hasta que todos los mensajes necesarios para que el formulario termine de cargarse se procesen. Así, en el manejador del mensaje CM_CLOSE pones ya el valor deseado para ModalResult.

// Saludos

jdiazan
30-06-2003, 09:30:49
Gracias a todos..
Roman tu solución no la he probado aún, ya que al final y dentro de mi desesperación por solucionar mi problema, he capturado el evento OnPaint y parece que funciona, de hecho ya está puesto en el cliente y parece que va bien.

De nuevo muchas gracias.

Saludos
Juan Díaz.

roman
30-06-2003, 16:43:33
Posteado originalmente por jdiazan
... dentro de mi desesperación por solucionar mi problema, he capturado el evento OnPaint y parece que funciona, de hecho ya está puesto en el cliente y parece que va bien.


Sólo ten en cuanta que el evento OnPaint se genera cada vez que la ventana necesita redibujarse. Esto incluye cada vez que la ventana se oculta por otra aplicación y vuelve a aparecer. Esto ocasionará que el código se va a ejecutar varias veces y quizá esto no sea lo que desees.

// Saludos

jdiazan
30-06-2003, 18:23:05
Efectivamente Roman,
lo que he hecho es poner esto


Begin

@onpaint := nil;
// Y ademas con una variable de la ficha private ventana_activada
if not ventana_activada then
begin

ventana_activada := true;
ejecuta_el_procedimiento;

end;

end;


Gracias roman.