Aller au menu - Aller au contenu

Icône Fenêtres supplémentaires

Avatar
Mise à jour : 13/12/2010
Difficulté : Facile Facile Creative Commons BY-NC-SA
23 410 visites depuis 7 jours, dont 386 sur ce chapitre classé 14/786
Vous venez de faire un bien gros projet. Je suppose que vous allez vouloir en apprendre encore plus pour pouvoir agrémenter et améliorer vos programmes.

Eh oui, même avec tout ce que vous avez appris jusqu'ici, il vous reste encore bien des notions à acquérir.

Attaquons tout de suite les fenêtres supplémentaires.
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Ajouter des fenêtres

Attaquons alors ! Je suis sûr que vous vous impatientez.

Alors nous allons commencer par ajouter des fenêtres supplémentaires puis nous allons apprendre à les faire communiquer entre elles !

Créerons tout de suite un nouveau projet de test Windows Forms avec le nom que vous souhaitez (pour moi ce sera FenetresSupplementaires).

On se retrouve comme à l'accoutumée avec notre fenêtre form1 gisant au beau milieu de notre feuille de design.

Vu que nous allons travailler avec plusieurs fenêtres, les noms de fenêtres vont être important maintenant.

Renommons donc cette fenêtre principale. Appelons-là "Main" (lorsque vous créerez un programme je vous suggère de nommer cette première fenêtre avec le nom du programme).

Pour ce faire, cliquons une fois sur elle dans la fenêtre design pour avoir accès à ses propriétés. Dans la valeur (Name) inscrivez donc Main, faites de même pour la valeur Text.

Puis renommons la feuille contenant cette fenêtre que nous voyons dans la fenêtre de solutions. Clic droit sur "Form1.vb" puis renommer. Inscrivez à la place "Main.vb".

Image utilisateur


Voilà, vous venez de renommer entièrement votre fenêtre. Il faudra faire de même avec les supplémentaires.

Ajoutons une seconde fenêtre maintenant. Un clic droit sur le nom de votre projet (pour moi : FenetresSupplementaires), puis déplacez votre souris sur le menu "Ajouter" qui nous donnera accès à "Nouvel élément", cliquez dessus.

Image utilisateur


Une fenêtre vous proposant quel type d'élément vous voulez ajouter à votre projet s'est ouverte. Nous voulons une fenêtre, il va donc falloir sélectionner "Windows Form" (retenez bien cette manipulation, elle va nous permettre d'ajouter d'autres types d'éléments à notre projet), pensez également à renommer cette fenêtre, essayez de trouver un nom adapté à sa fonction. Vu que notre projet est là pour l'apprentissage et n'a aucune fonction particulière à remplir je vais lui donner comme nom "Secondaire".

Image utilisateur


Vous voici avec votre seconde fenêtre "Secondaire" qui s'est automatiquement ouverte. Comme vous avez pu le constater, les modification de renommage que nous avons effectués sur la fenêtre Main ont été automatiquement effectuées sur celle-ci.

Image utilisateur


Vous voilà avec votre première seconde fenêtre (dur à suivre :) ). Allons nous amuser avec elle !

Ouverture / Fermeture

Vous vous souvenez que je vous ai toujours appris à assigner des propriétés à vos contrôles en commençant la ligne par "Me.".

C'est dans ce chapitre que vous allez vous rendre compte de son utilité.

Créons tout de suite un contrôle sur notre seconde fenêtre, mettons un bouton fermer.

On vient à peine de la créer tu veux déjà nous apprendre à la fermer ?

Oui, on va effectuer simplement un programme avec un bouton qui l'ouvre et un bouton permettant de la fermer.

Donc, je crée mon bouton Fermer identifié BT_FERMER. Me voilà donc avec seulement ce bouton dans ma fenêtre secondaire.

Image utilisateur


Créons donc un bouton Ouvrir identifié BT_OUVRIR sur la fenêtre principale (Main). Vous pouvez accéder à la fenêtre main soit grâce au système d'onglets si vous ne l'avez pas fermée, soir grâce à la fenêtre solution en double-cliquant sur son nom.

Image utilisateur


Sur notre seconde fenêtre comme sur la première, si nous voulons accéder à des propriétés, il va falloir utiliser le Me. dans la page de code correspondante. En parlant d'elle, allons-y, créons l'évènement BT_FERMER_Click en double-cliquant sur le bouton.

L'évènement Load (ici Secondaire_Load) d'une fenêtre supplémentaire sera appelé à chaque fois que la demande d'ouverture de cette fenêtre sera demandé.


La fonction permettant de fermer une fenêtre individuelle est Close() .

Tu nous avais parlé de End dans les autres chapitres.

Oui, End permet de fermer le programme, dans notre cas nous voulons fermer la fenêtre seule, il faut donc utiliser la fonction close.

Maintenant l'objet sur lequel cette fonction va être exécutée va être important. La feuille de code dans laquelle je me trouve actuellement correspond à la fenêtre secondaire. En utilisant le préfixe Me. l'objet de cette fenêtre sera automatiquement pris en compte. Si vous avez suivis, notre fonction va se retrouver sous cette forme :
Code : VB.NET
1
2
3
Private Sub BT_FERMER_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_FERMER.Click
    Me.Close()
End Sub


Et donc avec cette méthode nous sommes certains que c'est cette fenêtre qui va être affectée par le Close() et donc fermée.

Retournons dans la fenêtre Main et double-cliquons sur le bouton "Ouvrir" pour créer son évènement correspondant.

Et insérons dans cet évènement le code nécessaire pour ouvrir une autre fenêtre qui est ...
La fonction Show()

La propriété Visible de la fenêtre supplémentaire peut aussi être utilisée pour afficher ou faire disparaître cette dernière. Cependant je vous la déconseille car c'est une fenêtre fantôme qui est toujours présente en mémoire. Les fonctions Show() et Close() permettent d'ouvrir et fermer proprement ces nouvelles fenêtres.


Alors, si vous avez suivi mon monologue sur les Objets, sur quel objet va-t-il falloir appliquer cette fonction ?

Eh bien c'est sur l'objet de la fenêtre supplémentaire. Autrement dit l'objet "Secondaire".

Ce qui nous donne :
Code : VB.NET
1
2
3
Private Sub BT_OUVRIR_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_OUVRIR.Click
    Secondaire.Show()
End Sub


Pourquoi pas Me. ?

Eh bien toi tu n'as pas dû écouter ce que j'ai dit sur les objets ! :pirate: L'utilisation du préfixe "Me." force l'utilisation de la fenêtre actuelle comme objet, vous ne voulez pas afficher une fenêtre déjà ouverte :lol: .

Image utilisateur


Si je test, tout fonctionne, lors du clic sur Ouvrir la seconde fenêtre s'ouvre, lors du clic sur Fermer, la seconde fenêtre se ferme.

Eh bien vous avez déjà réussi à faire apparaître et fermer votre nouvelle fenêtre.

Notions de parent/enfant

Pourquoi tu veux nous parler de famille ?


Non, non. Le concept de parent/enfant est aussi utilisé en informatique.

Je vais justement vous l'exposer sommairement ici.

Partie théorique, allez vous chercher un café et détendez-vous.


Programmation orientée objet



La notion de parent/enfant est à l'origine utilisée en Programmation Orientée Objet (abréviée POO).

La POO est un style de programmation de plus en plus répandu. Certains langages ne sont pas orientés objets, d'autres y sont totalement. Notre langage, VB.NET utilise énormément la notion d'orienté objet.

Le langage VB6, quant à lui ne prenait pas en charge les concepts de la POO


Concrètement que nous apporte cette notion de POO ?


Eh bien si vous voulez avoir plus de détail concernant la POO je vous renvoie sur un chapitre du tutoriel sur le C++ de M@teo21 qui explique très bien les concepts d'objets.

Pour faire simple : on a introduit la notion d'objet pour pouvoir gérer plus facilement les gros programmes. Par exemple, dans nos programmes, les fenêtres sont toutes des objets bien distincts. Lorsque nous voudrons agir sur une fenêtre en particulier, il nous suffira de manipuler son objet.

Bon, j'essaie de suivre mais pourquoi nous racontes-tu ça ?


Eh bien maintenant que je vous ai fait peur avec les Objets :diable: , je vais vous parler des relations parent/enfant qui s'applique sur les objets.

L'héritage



Cette notion a été introduite avec la notion d'héritage.

L'héritage existait bien avant l'informatique ...

Mais moi je vous parle de l'héritage en informatique. C'est un concept qui s'applique aux objets.

Imaginez que vous avez un objet de type instrument (eh oui, un objet peut être n'importe quoi du moment que vous le codez), cet objet va avoir des variables et des fonctions qui lui seront spécifiques (les notes qu'il est capable de jouer, la fonction "joue", etc ...).
Si je crée un autre objet de type guitare, vous voyez tout de suite qu'une guitare est un instrument, donc au lieu de recréer toutes les fonctions et variables qui existaient pour l'objet instrument, je vais faire hériter ma guitare de instrument.

Ouch ?

Voici un petit schéma :

Image utilisateur


Donc, les rectangles sont chacun des objets. Vous voyez l'objet Instrument, l'objet Guitare et l'objet Piano.
L'objet Guitare et Piano héritent tout les deux de l'objet Instrument.

Donc, la Guitare aura en plus de ses possibilités originelles (qui sont NbCordes et Vibrato()) celles de Instrument (qui sont Notes et Joue()). Pareil côté Piano.

Parent/enfant



Je crois comprendre. Pourquoi nous expliques-tu cela ?

Eh bien, vous voyez que si je détruis l'objet Instrument les objets qui en héritent (autrement dit Guitare et Piano) seront également détruits. Dans ce cas Instrument est le parent et Guitare et Piano sont les enfants.
Image utilisateur

Donc lorsqu'un parent est détruit ses enfants le sont également.


J'en viens donc à notre problème actuel : les fenêtres.

Lorsque je lance mon programme, la première fenêtre, ici le Main est considéré comme la fenêtre parent. et donc toutes les fenêtres supplémentaires crées seront ses enfants.
Si vous avez suivis ce que j'ai expliqué, si je ferme donc la fenêtre Main, les autres fenêtres se fermeront également.

Donc il va falloir bien faire attention à ça dans nos programmes. Ne pas fermer la fenêtre principale !

Et si je ne veux pas la voir ?

Et bien il vous suffit d'effectuer un Visible = false sur cette dernière (j'ai dit que c'est pas bien mais ici vous êtes obligés). Mais attention avec ça, c'est pas le tout de cacher la fenêtre et de ne jamais pouvoir la ré-afficher.

Bon, avec toutes ces nouvelles notions nous allons pouvoir attaquer la communication entre fenêtres.

Vous pouvez ré-ouvrir les yeux, le cauchemar est terminé.

Communication entre fenêtres

Bon, après cette lourde partie théorique, attelons nous a faire communiquer nos fenêtres entre elles.

Pourquoi diable aurais-je envie de faire ça ?

Eh bien vous avez vus comment déclarer des variables. Vous ne voulez pas aller modifier les variables de la fenêtre d'à côté ? Écrire dans une textbox présente sur une autre fenêtre ?

Et puis même si vous n'avez pas envie, je vais quand même vous l'expliquer.

Manipulation de contrôles



Commençons par manipuler les contrôles, le plus facile.

Créons un label dans notre fenêtre principale nommée LBL_MAIN et un dans la fenêtre secondaire nommée LBL_SECOND. Enlevez leur leurs textes pour ne laisser que du blanc.

Nous allons écrire un message dans le label de la fenêtre secondaire à son ouverture mais à partir de la feuille de code de la fenêtre main. Puis inversement lors de la fermeture de la fenêtre secondaire.

Si vous avez bien appréhendé toutes les notions d'objet, vous devriez être capables de le faire vous même.

Eh bien pour manipuler un contrôle d'une autre fenêtre, il suffit d'inscrire le nom de la fenêtre souhaitée à la place du préfixe "Me."

Soit pour les deux évènements présents sur les deux fenêtres.

Fenêtre Main
Code : VB.NET
1
2
3
4
5
6
7
8
Public Class Main

    Private Sub BT_OUVRIR_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_OUVRIR.Click
        Secondaire.Show()
        Secondaire.LBL_SECOND.Text = "J'ai réussi !"
    End Sub

End Class


Fenêtre Secondaire
Code : VB.NET
1
2
3
4
5
6
7
8
Public Class Secondaire

    Private Sub BT_FERMER_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_FERMER.Click
        Main.LBL_MAIN.Text = "De ce côté également"
        Me.Close()
    End Sub

End Class


Image utilisateur

Image utilisateur


Nous avons réussi à manipuler des contrôles distants !

Manipulation des variables



Attaquons nous donc tout de suite aux variables.

Une petite précision supplémentaire va être requise pour cette partie.

Pour le moment nous déclarions nos variables avec un Dim à l'intérieur d'une fonction ou alors directement déclarées dans les arguments de la fonction. Nos variables avaient donc une "durée de vie" limitée. Une fois la fonction terminée, toutes les variables déclarées à l'intérieur cessaient d'exister.

Nous allons donc créer des variables globales de manière à ce qu'elles soient accessibles de partout.

Pour déclarer une variable globale il faut placer son instruction de déclaration juste après l'ouverture du module.

Si elles sont crées comme je vous l'ai appris (Dim X as Integer), ces variables sont accessibles uniquement à partir de la fenêtre les ayant crées. Pour pouvoir y accéder d'ailleurs il va falloir les rendre publiques. Je vais donc vous apprendre un nouveau mot (programmatique) : Public

Donc, si vous voulez des variables accessibles de "l'extérieur" il va falloir les déclarer ainsi.

On reprend donc le code de notre fenêtre secondaire en ajoutant cette variable globale et en assignant au label sa valeur lors du chargement de la fenêtre.

Code : VB.NET
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
Public Class Secondaire

    Public MonString As String = ""

    Private Sub Secondaire_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.LBL_SECOND.Text = MonString
    End Sub

    Private Sub BT_FERMER_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_FERMER.Click
        Main.LBL_MAIN.Text = "De ce côté également"
        Me.Close()
    End Sub

End Class


Et le code de la fenêtre Main dans lequel j'accède à la variable MonString. J'ai volontairement retiré la ligne où je modifiais directement le label.
Code : VB.NET
1
2
3
4
5
6
7
8
Public Class Main

    Private Sub BT_OUVRIR_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_OUVRIR.Click
        Secondaire.MonString = "Je crois que ça marche"
        Secondaire.Show()
    End Sub

End Class


Image utilisateur


Et voilà, votre première variable Globale Publique et vous y avez déjà accédé à partir d'un autre objet !

Q.C.M.

Quelle fonction permet la fermeture d'une fenêtre unique ?
Que fera le code :

Me.Show()


S'il est lancé à partir de la fenêtre1 qui est visible et que j'ai une fenêtre2 qui est invisible ?

Statistiques de réponses au QCM

Chapitre précédent Sommaire Chapitre suivant

Partager

5 commentaires pour "Fenêtres supplémentaires"
Note moyenne : 3.60 / 4 (543 votes)
Pseudo Commentaire
Hors ligne bluestorm # Posté le 09/08/2010 à 12:39:18
dont ask to ask
Avatar
Groupe : Anciens
Flux RSS

Je ne comprends pas bien ton traitement de l'héritage ici.

Citation
Eh bien, vous voyez que si je détruis l'objet Instrument les objets qui en héritent (autrement dit Guitare et Piano) seront également détruits. Dans ce cas Instrument est le parent et Guitare et Piano sont les enfants.


Dans les langages POO à classes, l'héritage est en général une relation entre les classes, et pas entre les instances. Dire qu'un objet (une instance) hérite d'un autre objet (une autre instance) est déjà assez curieux.

De plus, il n'y a pas en général de lien dynamique lié à la relation d'héritage : ce n'est pas parce qu'une classe hérite d'une classe mère que la destruction d'un objet de la classe mère implique la destructions des instances enfants !

Il y a donc quelque chose de faux, ou du moins mal formulé ici, que je ne comprends pas. Je ne pense pas que les objets de l'interface graphique héritent (en quelque sens que ce soit) de la fenêtre Main. En même temps, je ne connais pas VB.NET donc je ne suis pas du tout sûr de moi.

Je pense que ce n'est pas lié à l'héritage, c'est juste une conséquence de la composition : quand on crée une sous-fenêtre, elle est mise dans les données de la fenêtre main, et quand on ferme main son destructeur lance en cascade la fermeture des sous-fenêtre : il n'y a pas du tout d'héritage.

Bref, je ne suis pas sûr de comment c'est en pratique, mais ton explication n'est pas très bonne, porte à confusion et n'éclaire pas beaucoup les lecteurs.

PS : c'est une remarque sur la forme plutôt que sur le fond, mais ce n'est pas la peine d'utiliser des formules comme « vous voyez que ... » si les lecteurs ne voient pas effectivement. Tu peux utiliser cette tournure si c'est pour rappeler une information que les lecteurs devraient avoir déduit par eux-mêmes. Ici ce n'est pas ce cas, tu apportes une information nouvelle qu'on n'a aucun moyen de savoir. Ta tournure donne l'impression que ça devrait être évident au lecteur, alors que ça ne l'est pas du tout; c'est un peu maladroit.
 
Hors ligne Hankerspace # Posté le 09/08/2010 à 14:32:18
A nul sacrifice,nulle victoire
Avatar

Avis : Très bon Groupe : Auteurs

Ville : Belfort
Pays : France métropolitaine
Études : UTBM

Je suis désolé, il faut sans cesse que je jongle entre apporter les connaissances nécessaires pour quand même apprendre des choses aux zeros et à la fois trouver les bon mots, les bon concepts, les bonnes approches pour ne pas les embrouiller ...

Je me suis apparemment moi même fourvoyé, j'avais exposé la notion d'héritage dans ce chapitre parceque je ne pensais pas faire de partie dédiée à la POO mais il en a été autrement, je penserai à revoir cette partie.

Merci.
Cordialement, HankerspacE.

"He sets the sails one last time Saying farewell to the world" ( Nightwish - The Islander )
"Say a prayer on the book of the Dead" ( Iron Maiden - Blood Brothers )
"Kiss while your lips are still red" ( Nightwish - While Your Lips Are Still Red )
"Don't you cry tonight, Baby maybe someday, Don't you cry" ( Guns N' Roses - Don't Cry )
 
Hors ligne bluestorm # Posté le 09/08/2010 à 22:50:25
dont ask to ask
Avatar
Groupe : Anciens
Flux RSS

Je comprends bien, il faut parfois faire de petits sacrifices pour présenter un sujet.

Je pense que tu as bien raison de faire une partie sur la POO. C'est important si on veut accéder à la puissance du framework .NET depuis le langage, et ça reste la chose principale qui distingue VB.NET de ses crasseux prédécesseurs.
 
Hors ligne Sh4dows # Posté le 28/08/2010 à 10:49:40
Avatar

Avis : Très bon

Ville : Bordeaux
Pays : France métropolitaine
Études : Epitech Bordeaux

Citation : Créateur
Une fenêtre vous proposant qual type d'élément vous v


Je ne sais pas ce que tu as voulus dire mais en tous cas "qual" n'existe pas :p
Sinon très bon TuTo, dans cette partie j'ai tous compris aisément !
Hors ligne Elzakaria # Posté le 13/03/2012 à 11:24:29
Avatar

Avis : Bon

Trés bien, Façile et constituant la base Du VB :)

Voir tous les commentaires