2010-07-22 5 views
1

J'ai une application Delphi 2006 qui affiche une boîte de dialogue d'alerte modale lorsqu'une condition d'erreur est détectée. Comme la vérification de la condition d'erreur est effectuée dans un gestionnaire inactif, la boîte de dialogue peut apparaître au-dessus d'une autre boîte de dialogue modale si celle-ci est affichée. Cela peut conduire à une situation confuse pour l'utilisateur où le formulaire principal de l'application ne reçoit pas de focus après la fermeture de la boîte de dialogue d'alerte, car il s'agit d'une autre boîte de dialogue modale masquée. Ce que je voudrais faire est de reporter les popups d'alerte tandis que l'application a ouvert toutes les boîtes de dialogue Modal.Delphi - détecter si mon application dispose d'une boîte de dialogue modale ouverte

J'ai essayé GetLastActivePopup (MyMainWindow.Handle) mais il semble retourner tout le temps non-zéro.

+0

duplication possible de [Comment puis-je savoir si mon application Delphi a actuellement une fenêtre modale?] (Http://stackoverflow.com/questions/284581/how-do-i-discover-if-my-delphi-application -couramment-a-une-fenêtre-modale) – mghie

Répondre

2

utilisation de la fonction AnyPopup()

A propos GetLastActivePopup(). Il peut renvoyer une valeur identique au paramètre hWnd lorsque

  • La fenêtre identifiée par hWnd était la plus récente.
  • La fenêtre identifiée par hWnd ne possède aucune fenêtre contextuelle.
  • La fenêtre identifiée par hWnd n'est pas une fenêtre de niveau supérieur ou appartient à une autre fenêtre.
+0

+1 pour AnyPopup; S'il vous plaît également ajouter cette réponse à http://stackoverflow.com/questions/284581/how-do-i-discover-if-my-delphi-application-currently-has-a-modal-window Note J'ai légèrement modifié votre réponse pour pointer vers la documentation en ligne des fonctions que vous mentionnez. –

+0

@Jeroen: AnyPopup doc indique: 'Cette fonction est fournie uniquement pour des raisons de compatibilité avec les versions 16 bits de Windows. Ce n'est généralement pas utile. »Pas quelque chose à recommander alors ...? –

+0

@ jeroen-pluimers Merci pour la modification. Je vais prendre comme règle. – histrio

2

Tout essai

if not IsWindowEnabled(MyMainWindow.Handle) then 

Cela permettrait également de prendre soin de situtations quand une boîte de dialogue non Delphi agit modales, comme dans windows.MessageBox(Handle.... ou un dialogue commun est affiché (c'est-à-dire un TOpenDialog).

+0

Malheureusement, si une boîte de dialogue non-Delphi est ouverte de manière modale, je perds les appels Application OnIdle de sorte que l'application est effectivement gelée de toute façon. – rossmcm

+0

ProcessMessages() ne gère pas le problème de "gel", rossmcm? –

Questions connexes