Formulaire qui passe en-dessous de toutes les fenêtres ? [Résolu]

Signaler
Messages postés
44
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
25 avril 2019
-
 Utilisateur anonyme -
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

Messages postés
420
Date d'inscription
vendredi 17 novembre 2006
Statut
Membre
Dernière intervention
15 juillet 2014
6
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!).

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.
Messages postés
44
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
25 avril 2019

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
Messages postés
44
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
25 avril 2019

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

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