12
votes

Comment ferme une forme modale juste après l'avoir ouverture?

de ma candidature, je souhaite ouvrir une boîte de dialogue, qui devrait se fermer immédiatement (après un court message) dans certaines circonstances.

J'ai essayé ceci: p>

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


0 commentaires

4 Réponses :


5
votes

Ne serait-il pas plus facile de vérifier la certaine circonstance avant que le formulaire ne s'ouvre et ne pas l'ouvrir?

Je ne peux pas voir une raison pour que le formulaire reste ouvert, il devrait disparaître immédiatement après avoir cliqué sur OK dans la boîte de dialogue Afficher le message.

Le showMessage bloque de sorte que vous ne serez pas capable de fermer jusqu'à ce que ça soit OK'D (si vous avez besoin de fermer avant, vous pouvez retourner un résultat modal différent (ou faire votre choix qui ne vous heurte pas avec l'existant ceux comme mrunparavailable = 12). Ensuite, vous pourriez montrer le message si le modalresult était en mrunparavailable.

S'il exécute le code et s'il ne ferme pas, essayez d'utiliser version au lieu de fermer.

EDIT: Si vous réutilisez le même formulaire à plusieurs endroits, n'utilisez pas de libération, sauf si vous souhaitez recréer le formulaire à chaque fois! Postez le message proche lorsque les autres ont suggéré


2 commentaires

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


Utilisez ensuite une méthode que vous pouvez appeler à partir de plusieurs endroits. Faites les chèques dans cette méthode et si vous ne pouvez alors ouvrir que le formulaire



19
votes

Postez un message WM_Close au lieu d'appeler directement directement;

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


4 commentaires

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


@Svein - ici, alors montre ma réponse battant son avec 37 secondes. Mais de toute façon, il est assez proche de ne pas faire de bruit à ce sujet. :-)


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


Voté pour cette réponse à cause de MrCancel



16
votes

Essayez 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 commentaires

0
votes

Vous pouvez essayer une minuterie:

  • Définissez la minuterie un intervalle bas (20)
  • sur l'événement Ontimer, fermez le formulaire;
  • Activez la minuterie sur l'événement FormActivate

0 commentaires