2010-08-06 19 views
9

Desde mi aplicación, deseo abrir un diálogo, que debe cerrarse inmediatamente (después de un breve mensaje) en algunas circunstancias.¿Cómo cierro un formulario modal justo después de abrirlo?

He intentado esto:

procedure TForm2.FormActivate(Sender: TObject); 
begin 
    if SomeCondition then 
    begin 
    ShowMessage('You can''t use this dialog right now.'); 
    close; 
    modalresult := mrCancel; 
    end; 
end; 

pero el diálogo permanece abierto. También traté de poner el código en el evento OnShow, pero el resultado es el mismo.

¿Por qué no funciona?

Respuesta

11

prueba este

procedure TForm2.FormActivate(Sender: TObject); 
begin 
    ShowMessage('You can''t use this dialog right now.'); 
    PostMessage(Self.Handle,wm_close,0,0); 
end; 
+0

Gracias, eso funcionó. –

4

¿No sería más fácil comprobar las circunstancias antes de que se abra el formulario y no abrirlo?

No veo una razón para que el formulario permanezca abierto, debe desaparecer inmediatamente después de hacer clic en OK en el cuadro de diálogo Mostrar mensaje.

El mensaje de show está bloqueando por lo que no podrá cerrar hasta que esté OK (si necesita cerrar antes, podría devolver un resultado modal diferente (o crear uno propio que no entre en conflicto con el . los ya existentes como mrUnavailable = 12) entonces se podría mostrar el mensaje si el ModalResult era mrunavailable

Si se está ejecutando el código y simplemente no cerrar a continuación, tratar de usar Release en lugar de cerca

Editar:.. si vuelve a utilizar el mismo formulario en varios lugares, no use Release a menos que quiera volver a crear el formulario cada vez. Publique el mensaje de cierre como los demás h sugerido

+0

abro el diálogo desde varios lugares, y no quiero para comprobar cada lugar. –

+4

Luego use un método que pueda llamar desde varios lugares. Haz los controles en ese método y, si está bien, solo abre el formulario –

15

Publique un mensaje WM_CLOSE en lugar de llamar directamente al cerrar;

ShowMessage('You can''t use this dialog right now.'); 
PostMessage(Handle, WM_CLOSE, 0, 0); 
modalresult := mrCancel; 
+0

. Acepté la respuesta de Bharat, aunque tu respuesta fue casi idéntica. Lo siento. Él te ganó por dos segundos :-) –

+1

@Svein - Aquí, SO muestra mi respuesta venció a su con 37 segundos. Pero de todos modos, está lo suficientemente cerca como para no armar un escándalo al respecto. :-) –

+2

Como dijo Einstein: la percepción del tiempo depende de tu velocidad. –

0

Usted puede tratar de un temporizador:

  • programar el temporizador de un intervalo bajo (20)
  • en el caso AlCronómetro, cierre el formulario;
  • activar el temporizador en el evento FormActivate
Cuestiones relacionadas