Une remarque pertinente ?
Une critique impertinente ?
Un lynchage en règle ?
Une invitation sous les tropiques ?

Ecrivez-moi !
Conçu et enseigné tel qu'en lui même, avec pertes, fracas et humour de qualité supérieure            
 par Christophe Darmangeat dans le M2 PISE du Master MECI (Université Paris 7)            

 
 
 
  
 
 
 
Partie 17
Les applications MDI
 
Pour finir ce cours en beauté, venons-en à la réalisation des applications poétiquement dites "MDI", à savoir : Multiple Document Interface. De quoi s'agit-il donc ? Tout simplement du lot commun des applications Windows bien connues, du genre Word, Excel, et tutti quanti. Toutes ces applications, malgré leurs différences, possèdent en commun une interface gérée par Windows, dans laquelle :
  • il existe une fenêtre principale (celle de l'application proprement dite), appelée le plus souvent Form parente.
  • cette fenêtre parente peut contenir un nombre quelconque de fenêtres appelées enfant. Chacune de ces Form enfant peut représenter un document  différent, ou plusieurs vues différentes d'un même document.
  • les menus existent exclusivement sur la Form parente, mais ils dépendent de la Form enfant active.
  • les Form enfants peuvent être minimisées, agrandies, maximisées, disposées notamment en cascade ou en mosaïque
La réalisation d'une application MDI en VB.Net ne pose pas de difficultés exagérées, à condition, comme toujours, de procéder méthodiquement.
La première chose à faire sera bien sûr de définir la Form principale. Ceci s'effectue tout simplement en donnant la valeur True à sa propriété IsMdiContainer.
Passons à présent aux Form secondaires. Évidemment, dans la même application, et contrairement à la Form principale qui est par définition unique, il peut y avoir différents genres de Form secondaires, chaque genre étant adapté à un certain type de documents.
Mais même en faisant au plus simple, et en admettant que votre application n'en requiert qu'un seul genre, il subsiste tout de même un problème avec les Form secondaires : c'est que vous ne savez pas a priori combien il va y en avoir d'exemplaires à un moment donné de l'exécution. Si, par exemple, celle-ci est un traitement de texte simple, il y aura à l'intérieur de la Form principale autant de Form secondaires que de documents ouverts... c'est-à-dire de zéro à plusieurs dizaines.
Dès lors, la seule façon de procéder, pour les Form secondaires, sera de prévoir leur création dynamique, sur le modèle de ce nous avons déjà vu dans le chapitre 4 à propos de la création dynamique des contrôles. Il suffira donc de s'y prendre méthodiquement. Comme d'habitude, quoi.
Voici donc la marche à suivre :
1. Création de(s) Form(s) enfant(s)
On se contentera de créer une Form par type de Form enfant nécessaire. Cette étape ne nécessite aucune combine particulière : on crée la Form tout à fait normalement, en posant dessus les contrôles voulus, et en leur associant les procédures événementielles adéquates. Bref, jusque là, rien à signaler.
2. Instanciation des Form enfants
La chose à comprendre, c'est qu'au cours de l'application, les différentes Form enfants seront toutes des instanciations des Form enfants que vous venez de créer dans le paragraphe précédent. Dit d'une autre manière, jusque là, vous n'avez créé qu'un moule : il va maintenant falloir écrire le code nécessaire pour fabriquer les gâteaux.
Comme je l'ai déjà dit, ce code obéit aux règles déjà rencontrées lors de la création dynamique de contrôles. De plus, il faudra absolument signifier que la nouvelle Form ainsi créée est une Form enfant de la Form parent. Ceci s'effectue via la propriété MdiParent de la Form enfant ( à noter qu'il s'agit d'une propriété accessible seulement par le code).
Ainsi, en admettant que nous ayons baptisé Enfant la Form servant de modèle à nos Form enfants, le code permettant de créer une nouvelle instance de cette Form sera :
Dim frm As New Enfant()
frm.MdiParent = Me
frm.Visible = True
Ceci suppose naturellement que ce code soit écrit dans la Form parent.
3. Maniement des Form enfants
Évidemment, la question ne se pose que lorsqu'on doit manier les Form enfant à partir de la Form parent. Le maniement des Form enfants à partir d'elles-mêmes ne pose aucune espèce de difficulté : programmer une Form à partir d'elle-même, c'est très précisément ce que nous avons fait depuis le début de ce cours.
La première chose à dire, et ce ne sera pas une surprise, c'est que les Form enfant font toutes partie d'une collection : la collection MdiChildren. On pourra ainsi balayer l'ensemble des Form enfant par une boucle parcourant cette collection, ou rechercher une Form particulière au sein de cette collection en fonction de l'une ou l'autre de ses propriétés.
On notera pour terminer l'existence de la propriété de la Form parent ActiveMdiChild, qui renvoie la Form enfant actuellement active.
 
Exercice
Exécutable
Sources
Album Photo