La forme est cachée derrière d'autres formes lorsque ShowModal est appelé
Mon application est basée sur les formulaires modaux. Formulaire principal s'ouvre un formulaire avec ShowModal, ce formulaire s'ouvre avec un autre ShowModal, donc, nous avons empilé les formulaires modaux. Il y a parfois un problème que lorsque nous appelons ShowModal dans la nouvelle forme, il se cache derrière des formes antérieures, au lieu de l'afficher sur le dessus. Après avoir appuyé sur alt+tab, la forme revient vers le haut, mais ce n'est pas la bonne solution. Avez-Vous rencontré ce problème et comment l'avez-vous fait cela?
MODIFIER:
J'utilise Delphi 7.
- Merci pour l'ajout de la version. Il aide si vous incluez dans votre question du texte ou des balises de quelque part. 🙂
- Je n'ai régler correctement la balise d'abord, puis ajouté EDIT:)
- Aussi longtemps que vous le mettre quelque part, il fonctionne. Il ne doit pas nécessairement être dans l'une des étiquettes, tant que c'est dans l'objet ou le texte de la question quelque part. Qui permet aux gens de savoir quelles fonctionnalités vous avez à votre disposition quand ils répondent. 🙂
- Nous avons eu ce problème avec une application tierce pour ans maintenant et aucun correctif n'a été encore trouvé.
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas parlé de la version de Delphi...
Plus récentes versions de Delphi ont ajouté deux nouvelles propriétés à TCustomForm: PopupMode et PopupParent. Réglage PopupParent de votre boîte de dialogue modale à la forme que de la création de cette boîte de dialogue permet de s'assurer que l'enfant reste au-dessus de celle du parent. Il permet généralement de résoudre le problème que vous décrivez.
Je pense que cette paire de propriétés ont été ajoutées dans Delphi 2006, mais il peut avoir été 2005. Ils sont bel et bien là dans Delphi 2007 et jusqu'.
EDIT: Après avoir vu que vous êtes à l'aide de Delphi 7, la seule suggestion que j'ai, c'est que, dans le code qui affiche votre formulaire modal, vous désactivez le formulaire de création, et de le ré-activer sur le retour. Ce qui devrait éviter la création de fenêtre de réception d'entrée, ce qui peut aider à garder le Z-ordre correct.
Quelque chose comme cela peut fonctionner (non testé, que je ne suis plus à l'aide de D7):
Si Form2 crée une fenêtre modale (comme vous l'avez dit), il suffit de répéter le processus de désactiver la Form2, créer Form3 et montrer modal, et le ré-activer Form2 quand il retourne. Assurez-vous d'utiliser l'essayer..enfin comme je l'ai montré, de sorte que si quelque chose va mal dans le formulaire modal de la création de formulaire est toujours ré-activé.
Désolé pour l'ajout d'une réponse distincte, mais j'ai fait une recherche un peu plus, et il indique que ma réponse précédente (DisableProcessWindowsGhosting) n'aide pas. Depuis que j'ai ne peut pas toujours reproduire ce problème, je ne peux pas dire à coup sûr.
J'ai trouvé une solution qui semble approprié. J'ai référencé le code en Delphi 2007 pour le CreateParams méthode et ça correspond assez proche (sans avoir tous les autres le code qui gère la PopupMode).
J'ai créé l'unité au-dessous de laquelle les sous-classes
TForm
.Ce que je fais est alors inclure cette unité avec une forme d'unité, et puis changer la classe du formulaire (dans l' .pas de fichier de code) à partir de
class(TForm)
àclass(TModalForm)
Cela fonctionne pour moi, semble être proche de CodeGear de la solution.
De cette lien il semble que le problème est avec le "Ghosting " fenêtre" qui a été introduit en 2000/XP. Vous pouvez désactiver la fonctionnalité de création de fantômes en appelant le code suivant au démarrage.
Le seul problème que je vois c'est que cela va causer des problèmes avec la fonctionnalité qui permet à l'utilisateur de réduire, déplacer ou fermer la fenêtre principale d'une application qui ne répond pas. Mais de cette façon, vous n'avez pas à couvrir chaque appel avec le
Self.Enabled := False
code.Il suffit de régler le
Visible
propriété de la forme que vous souhaitez ouvrir modal, pourFalse
. Ensuite, vous pouvez l'ouvrir avec.ShowModal();
et il va fonctionner.l'essayer
OnShowForm:
J'ai trouvé que l'utilisation de l'option "Toujours visible" drapeau sur plus d'un formulaire causes des problèmes avec l'ordre. Et vous pouvez trouver aussi la nécessité pour le
BringWindowToTop
fonction.Lors du lancement d'une boîte de message en utilisant le haut-WinAPI (
MessageBox
), j'ai constaté que l'adoption de l'appel de la poignée de la fenêtre est nécessaire afin de s'assurer que le l'invite de commandes apparaît en haut de tous les temps.