Nous voilà armés pour faire sauter une nouvelle limite dans VB : celle de la form unique.
En effet, jusqu'à présent, nos applications ne comportaient qu'une Form et une seule à la fois. Même si nous disposions de plusieurs Form, celles-ci n'étaient disponibles pour l'utilisateur que successivement : le code cachait une Form, en rendait une autre visible, et c'était tout ce que l'on pouvait faire.
Or, dans Windows, la plupart des applications utilisent plusieurs Form en même temps, ou tout au moins laissent cette possibilité ouverte. Qu'on pense à Word : il y a la fenêtre principale, celle de Word lui-même. Mais ensuite, au sein de cette fenêtre, l'utilisateur peut ouvrir autant de documents qu'il le souhaite, et chacun de ces documents apparaîtra dans une nouvelle fenêtre.
Il est donc grand temps que nous apprenions à utiliser cette possibilité avec VB.
Une application VB gérant des fenêtres multiples est dite application M.D.I. (pour Multiple Document Interface). Dans une telle application, il y a obligatoirement une Form mère (et une seule) et un certain nombre de Form filles, contenues dans la Form mère.
Tout ceci peut être créé à la main, ou par du code... et vous comprenez pourquoi nous abordons ceci après avoir vu les instructions Load, Unload et la notion de Collection.
4.1 Création de la Form MDI
Commençons par la création à la main de la Form mère. On choisira dans le menu adéquat une nouvelle Form, mais d'un type particulier : la Form MDI. Celle-ci apparaît avec un fond spécial, plus sombre qu'une Form classique :
Une Form MDI ne servant que de conteneur aux Form filles, on ne peut pas poser dessus n'importe quels contrôles. En fait, une telle Form ne peut contenir qu'un nombre très limité de choses :
un Timer
une ImageBox (qui sera alors automatiquement de la largeur de la Form elle-même)
quelques autres contrôles exotiques que nous ne connaissons pas encore...
des barres d'outils
des menus
Si ce site n'explique pas comment créer des barres d'outils, on vient en revanche de voir comment créer des menus. Donc, pas de problèmes.
Pour finir sur les Form mères, remarquons qu'il ne peut y en avoir qu'une et une seule par projet VB. Si vous essayez d'en créer une deuxième, VB vous l'interdira aussi sec. Logique.
Passons maintenant aux Form filles. Une Form fille est une Form tout ce qu'il y a de plus normal. Elle a simplement une caractéristique, c'est que sa propriété MDIChild vaut True. C'est cela qui indique à l'application que cette Form doit apparaître au sein de la Form mère de l'application. Il peut bien entendu y avoir autant de Form filles que l'on souhaite.
Cette histoire de mère et de filles, c'est donc vraiment... un jeu d'enfant (celle-là, je ne pouvais décemment pas passer à côté).
Pour qu'à l'exécution, une Form fille apparaisse dans la Form mère, il suffit que la Form fille soit l'objet d'une instruction Load. Pour la faire disparaître, évidemment, l'instruction Unload s'impose.
4.2 Créer les Form filles par du code
Une Form étant un objet comme n'importe quel autre, on peut lui appliquer les méthodes de création dynamiques vues au début de ce chapitre. Malheureusement, il n'est pas possible de créer un groupe de Form, comme nous le faisions pour les autres contrôles. Alors, serions-nous coincés ?
Que nenni. Si la première Form de notre application s'appelle FormIntérieure (propriété Name), on pourra taper le code suivant pour créer une nouvelle Form (par exemple, lorsque l'utilisateur clique sur un éventuel menu intitulé Nouveau) :
Dim Toto As New FormIntérieure
Toto.Visible = True
La première ligne crée une copie de l'objet FormIntérieure (on parle en jargon objet de nouvelle instance), qui possède en tout point les mêmes propriétés, les mêmes contrôles, etc. Ce nouvel objet, copie conforme de FormIntérieure, est stocké dans une variable objet qui permet de le désigner, en l'occurrence Toto.
Petit souci : toutes les nouvelles Form ainsi créés vont être successivement désignées par la variable Toto. Et comme elles ne forment pas un groupe, on est a priori bien en peine de les différencier.
A cela, il existe deux parades simples, efficaces et de bon goût.
Lorsqu'il s'agit de traiter toutes les Form d'une application, on pourra utiliser la notion de collection vue plus haut, et écrire une boucle adéquate :
For Each truc In Forms
truc.BackColor = vbWhite
Next truc
...La collection Forms nous permettant de balayer toutes les Forms de l'application une par une.
Enfin, dernier problème abordé ici, lorsque nous avons besoin de localiser un contrôle d'une application MDI, nous ne savons pas forcément de quelle Form est issu ce contrôle. Imaginons que nous voulions, à un moment donné, changer ce qu'il y a écrit sur le bouton de commande Bouton1. On va alors être obligé, faute de provoquer une erreur, de préciser qu'il s'agit du contrôle Bouton1 de la Form fille active, par opposition aux autres boutons Bouton1 des Form filles non actives). Car à ce moment là de l'application, il y a autant de Bouton1 que de Form filles dans l'application ! Pour parler du Bouton1 de la Form active, rien de plus simple :
ActiveForm.Bouton1.Caption = "coucou"
Vous voyez, pour conclure, que VB nous ouvre assez facilement les portes de la réalisation d'applications au look vraiment professionnel. Après, plus ça grossit, plus il faut être méthodique pour ne pas s'y perdre...