2010-08-06 5 views
9

De mon application, je souhaite ouvrir une boîte de dialogue, qui devrait se fermer immédiatement (après un court message) dans certaines circonstances.Comment fermer un formulaire modal juste après l'avoir ouvert?

J'ai essayé ceci:

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

mais la boîte de dialogue reste ouverte. J'ai également essayé de mettre le code dans l'événement OnShow, mais le résultat est le même.

Pourquoi cela ne fonctionne-t-il pas?

Répondre

11

essayer celui-ci

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

Merci, cela a fonctionné. –

4

Ne serait-il pas plus facile de vérifier certaines circonstances avant que le formulaire s'ouvre, et ne pas l'ouvrir?

Je ne vois pas de raison pour que le formulaire reste ouvert, il doit disparaître immédiatement après avoir cliqué sur OK dans la boîte de dialogue de message. Le showmessage bloque donc vous ne serez pas en mesure de fermer jusqu'à ce que ce soit OK (si vous devez fermer avant, vous pouvez retourner un résultat modal différent (ou faire votre propre qui n'est pas en conflit avec le . celles qui existent déjà comme mrUnavailable = 12) ensuite, vous pouvez montrer le message si le ModalResult était mrunavailable

S'il exécute le code et tout simplement pas fermer puis essayez d'utiliser Release au lieu de près

Edit:.. Si vous réutilisez le même formulaire à plusieurs endroits, n'utilisez pas Release à moins de vouloir recréer le formulaire à chaque fois! ave suggéré

+0

J'ouvre la boîte de dialogue de plusieurs endroits, et je ne veux pas vérifier tous les lieux. –

+4

Ensuite, utilisez une méthode que vous pouvez appeler à partir de plusieurs endroits. Faites les vérifications dans cette méthode et si oui, seulement alors ouvrez le formulaire –

15

Publier un message WM_CLOSE au lieu de l'appeler directement;

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

J'ai accepté la réponse de Bharat, même si votre réponse était presque identique. Pardon. Il vous a battu de deux secondes :-) –

+1

@Svein - Ici, SO montre ma réponse battre le sien avec 37 secondes. Mais de toute façon, il est assez proche pour ne pas faire de bruit à ce sujet. :-) –

+2

Comme l'a dit Einstein: la perception du temps dépend de votre vitesse. –

0

Vous pouvez essayer une minuterie:

  • régler la minuterie à faible intervalle (20)
  • sur l'événement OnTimer, fermez le formulaire;
  • permettent la minuterie de l'événement FormActivate
Questions connexes