2010-08-06 16 views
9

Dalla mia applicazione desidero aprire una finestra di dialogo, che dovrebbe chiudere immediatamente (dopo un breve messaggio) in alcune circostanze.Come si chiude un modulo modale subito dopo averlo aperto?

Ho provato questo:

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

ma la finestra di dialogo rimane aperta. Ho anche provato a inserire il codice nell'evento OnShow, ma il risultato è lo stesso.

Perché non funziona?

risposta

11

provare questo

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

Grazie, ha funzionato. –

4

Non sarebbe più semplice controllare la determinata circostanza prima che il modulo si apra e non aprirlo?

Non riesco a vedere un motivo per cui il modulo rimanga aperto, dovrebbe scomparire immediatamente dopo aver fatto clic su OK nella finestra di dialogo del messaggio di visualizzazione.

Lo showmessage sta bloccando in modo da non essere in grado di chiudere fino a quando non è OK (se è necessario chiudere prima di poter restituire un risultato modale diverso (o crearne uno che non si scontri con il . quelli esistenti come mrUnavailable = 12), allora si potrebbe mostrare il messaggio se il ModalResult era mrunavailable

Se è in esecuzione il codice e non solo di chiudere quindi provare a utilizzare Release invece di stretta

Edit:.. se si riutilizza lo stesso modulo in più punti, non utilizzare Release a meno che non si desideri ricreare il modulo ogni volta! Inviare il messaggio di chiusura come gli altri h suggerito

+0

apro la finestra di dialogo da diversi luoghi, e non voglio controllare ogni luogo. –

+4

Quindi utilizzare un metodo che è possibile chiamare da più posizioni. Esegui i controlli in quel metodo e se ok, solo allora apri il modulo –

15

Invia un messaggio WM_CLOSE invece di chiamare close direttamente;

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

Ho accettato la risposta di Bharat, anche se la tua risposta era quasi identica. Scusate. Ti ha battuto di due secondi :-) –

+1

@Svein - Ecco, SO mostra la mia risposta battere il suo con 37 secondi. Ma comunque è abbastanza vicino da non farci storie. :-) –

+2

Come ha detto Einstein: la percezione del tempo dipende dalla tua velocità. –

0

Si può provare un timer:

  • impostare il timer un basso intervallo (20)
  • sull'evento OnTimer, chiudere la maschera;
  • attivare il timer sull'evento FormActivate
Problemi correlati