Formulaire qui passe en-dessous de toutes les fenêtres ?

Résolu
cs_Apolinaire Messages postés 44 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 25 avril 2019 - 14 mai 2013 à 23:22
 Utilisateur anonyme - 15 mai 2013 à 19:39
Bonsoir,
J'ai rencontré un problème que j'ai résolu mais... sans comprendre pourquoi. Et ça m'embête !
Je suis en VB.Net sous Visual Studio 2010.
Dans un nouveau projet, je crée 3 formulaires : Form1, Form2 et Form3.
Dans Form1, un bouton Button1 : Form2.Show()
Dans Form2, un bouton Button1 : Form3.ShowDialog() et un bouton Button2 : Me.Dispose()
Dans Form3, un bouton Button1 : Me.Dispose()

C'est simple, non ?

Lancer ce programme du siècle alors qu'une fenêtre quelconque occupe l'écran : un explorateur Windows, Firefox, Visual Studio ou toute autre fenêtre n'ayant rien à voir avec notre programme.

Form1 s'affiche : no problem. Cliquer sur Button1.
Form2 s'affiche : no problem. Cliquer sur Button1.
Form3 s'affiche : no problem. Cliquer sur Button1 pour le retour. SURPRISE : Form1 disparait derrière la fenêtre qui occupait l'écran au départ !

J'ai résolu le problème en mettant sur le Button1 de Form1 : Form2.ShowDialog() au lieu de Form2.Show(). Là ça fonctionne correctement et Form1 ne disparait pas quand on ferme Form3.
Ouais, bon. Je suis content et c'est le principal. Mais je suis incapable d'expliquer le phénomène.
Si quelqu'un a une idée, je suis preneur.
Apolinaire

5 réponses

foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
15 mai 2013 à 10:06
Bonjour,

Il y a deux solutions à votre problème.

La première solution est du au fait que fermer une fenêtre ouverte avec ShowDialog() avec un Me.Dispose() n'a aucun sens étant donné que le but principal de ce genre de formulaire est justement de renvoyer des informations au formulaire l'ayant ouvert. Donc libérer toutes les ressources entraîne la perte du résultat du ShowDialog(). Donc remplacez les "Me.Dispose()" par "Me.Close()" et le problème disparaît.

La deuxième solution est de lier les form entre elles dans la cascade d'ouverture. Remplacez "Form2.Show()" par "Form2.Show(Me)" (Form1 devient parente de Form2) et "Form3.ShowDialog()" par "Form3.ShowDialog(Me)" (Form2 devient parente de Form3). Dans ce cas vous pouvez conserver les "Me.Dispose()" (si nécessaire!).
3
Utilisateur anonyme
14 mai 2013 à 23:50
Bonjour,

Mais je suis incapable d'expliquer le phénomène.
Si quelqu'un a une idée, je suis preneur.


C'est donc le moment idéal de faire connaissance avec ton aide VB. Si tu ouvres ton aide VB à l'item Form, classe [Form, classe (System.Windows.Forms) dans l'onglet Recherche de la fenêtre de gauche] et que tu cliques sur les liens Show et ShowModal dans les Méthodes, tu vas voir la différence entre le mode modal et le mode non modal.

Et puis, lance ton programme seul, sans aucune autre fenêtre ouverte une fois avec Form2.show() et une fois avec Form2.showmodal() et essaie juste de fermer Form1 et Form3 avec l'une et l'autre des Form2, ou d'écrire dans un textbox sur Form1 ou Form3. Tu devrais remarquer assez vite que le choix entre show et showmodal n'est pas un choix anodin.
0
cs_Apolinaire Messages postés 44 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 25 avril 2019
15 mai 2013 à 09:11
Bonjour cmarcotte,
Merci de ces renseignements mais tu sais, il y a longtemps que je parcours l'aide VB locale et distante (MSDN Microsoft). Et très souvent ! En français et en anglais.
Je connais aussi très bien la différence entre les méthodes Show et ShowDialog. Ainsi que les conséquences sur les méthodes Close et Dispose selon la méthode Show utilisée.
Ce que je ne m'explique pas ici c'est l'action sur ce que j'appellerai le "ZOrder" du Form1 quand je ferme ou je valide le Form3. Je n'ai pas trouvé de propriété ZOrder pour un formulaire. Cette action doit donc passer par les APIs Windows...(enfin, je crois). Mais pourquoi ?
Une chose est certaine, cette action en question est sensible aux ordres successifs d'ouverture des formulaires. Soit Show suivi de ShowDialog (action sur le ZOrder de Form1), soit ShowDialog suivi de ShowDialog (pas d'action sur le ZOrder).
Apolinaire
0
cs_Apolinaire Messages postés 44 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 25 avril 2019
15 mai 2013 à 10:33
Bonjour foliv57,
Merci beaucoup pour ces explications. Ce serait donc cette notion de formulaire parent qui interviendrait. J'en prends bonne note.
Bonne journée.
Apolinaire
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
15 mai 2013 à 19:39
Bonjour


Ce serait donc cette notion de formulaire parent qui interviendrait


C'est justement ce qu'ils disent dans l'aide que tu connais si bien
0
Rejoignez-nous