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

cs_Apolinaire 42 Messages postés mardi 6 décembre 2005Date d'inscription 9 novembre 2013 Dernière intervention - 14 mai 2013 à 23:22 - Dernière réponse :  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
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
foliv57 423 Messages postés vendredi 17 novembre 2006Date d'inscription 15 juillet 2014 Dernière intervention - 15 mai 2013 à 10:06
3
Merci
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!).

Merci foliv57 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de foliv57
Utilisateur anonyme - 14 mai 2013 à 23:50
0
Merci
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.
Commenter la réponse de Utilisateur anonyme
cs_Apolinaire 42 Messages postés mardi 6 décembre 2005Date d'inscription 9 novembre 2013 Dernière intervention - 15 mai 2013 à 09:11
0
Merci
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
Commenter la réponse de cs_Apolinaire
cs_Apolinaire 42 Messages postés mardi 6 décembre 2005Date d'inscription 9 novembre 2013 Dernière intervention - 15 mai 2013 à 10:33
0
Merci
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
Commenter la réponse de cs_Apolinaire
Utilisateur anonyme - 15 mai 2013 à 19:39
0
Merci
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
Commenter la réponse de Utilisateur anonyme

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.