I. Introduction

Dans cet article nous allons aborder les bases de la construction d'une application MDI avec C# Builder. Je pense que la procédure est peu différente sur les autres EDI RAD. Le résultat devrait donner une application semblable à la copie d'écran ci-dessous.

Image non disponible

II. Création de l'application

Tout d'abord, créons une nouvelle application. (Menu : 'Fichier' -> 'Nouveau' -> 'Application C#') Nommez-la d'un nom explicite. La fiche principale nommée "WinForm" est créée automatiquement. Nous reviendrons plus tard sur cette fiche. Nous allons aborder en premier lieu la construction de la fiche enfant.

III. Construction de la fiche enfant MDI

Nous créons donc la fiche comme n'importe quelle autre fiche. (Menu : 'Fichier' -> 'Nouveau' -> 'Autre', puis dans l'arborescence de la fenêtre : 'Projet C#' -> 'Nouveaux fichiers' choisir 'Windows Form'.) La nouvelle fiche nommée "WinForm1" étant créée, afin de l'agrémenter nous poserons dessus une TextBox "textBox1" multiligne (propriété Multiline à True) et remplissant la zone client de la fiche (propriété Dock à Fill).
Ensuite, posons sur la fiche un MainMenu avec un menu principal nommé "Enfant" (nommé ainsi afin de le repérer quand il va se fusionner avec les menus de la fiche parent). Ajoutons-lui deux options de menu nommées "Écrire" et "Fermer".
Sur l'événement Click de Fermer nous fermerons la fiche :

 
Sélectionnez
    private void Fermer_Click(object sender, System.EventArgs e)

    {

      Close();

    }

Sur l'événement Click de Écrire, nous insérerons une ligne de texte dans sa TextBox "textBox1" :

    private void Ecrire_Click(object sender, System.EventArgs e)

    {

      textBox1.Text =

             textBox1.Text.Insert(0,"Texte ajouté depuis le menu enfant.\r\n");

    }

Pour différencier visuellement chaque fiche enfant, nous ajouterons un numéro à son titre correspondant à son ordre de création :

 
Sélectionnez
     //.......

     private static int count = 0 ;

     //.......

     public WinForm1() // Constructeur

     {

       InitializeComponent();



       count++;

       Text = "Fenetre  " + count;

     }

Nous déclarons pour cela une variable membre static (count), c'est-à-dire unique dans la classe, que nous incrémentons à chaque création d'une nouvelle fenêtre enfant et que nous ajoutons au titre de la fenêtre ceci dans le constructeur de la classe.

Ce que nous avons fait jusqu'ici est tout à fait semblable au traitement d'une fiche ordinaire et n'a rien d'exceptionnel, mais va nous servir pour la suite.

IV. Construction de la fiche parent MDI

Revenons à la fiche principale "WinForm" qui avait été créée au début. Première chose à faire, lui donner la capacité d'être une fiche parent MDI, pour cela il suffit de passer sa propriété IsMdiContainer à True.
Maintenant, ajoutons-lui un MainMenu avec un Menu principal nommé "Parent" (on peut voir les options Menu que nous allons ajouter ultérieurement sur la copie d'écran au début de cet article).


Création d'une instance de la fiche enfant :

La première option de menu que nous ajoutons est "Nouveau", sur son événement Click, nous créons une fiche enfant selon le modèle de notre fiche précédente "WinForm1" :

 
Sélectionnez
    private System.Windows.Forms.Form form1;



    //.......



    private void Nouveau_Click(object sender, System.EventArgs e)

    {

      form1 = new WinForm1();

      form1.MdiParent = this;

      form1.Show();

    }

À la différence d'une fiche ordinaire, il faut lui donner une fiche parent MDI en affectant sa propriété MdiParent à this avant de la rendre visible. (this représentant bien sûr la fiche principale.)


Accès à la fiche enfant depuis la fiche parent :

Ajoutons une 2e option de menu dans le menu "Parent" nommé "Fermer" sur son événement Click nous fermerons la fiche enfant active :

 
Sélectionnez
    private void Fermer_Click(object sender, System.EventArgs e)

    {

      // Fermer la fiche enfant active.

      if(ActiveMdiChild!=null) ActiveMdiChild.Close();

    }

Comme vous pouvez le remarquer dans ce morceau de code, on accède à la fiche enfant active par l'intermédiaire de la propriété ActiveMdiChild de la fiche parent. Avant de faire toute intervention sur la fiche enfant depuis la fiche parent, il faut tester qu'elle existe bien d'où le test if dans ce code.


Fermer toutes les fiches enfant :

Sur l'événement Click d'une autre option de menu nommé "Tout Fermer" mettre :

 
Sélectionnez
    private void ToutFermer_Click(object sender, System.EventArgs e)

    {

      //Fermer toutes les fiches enfants.

      while (MdiChildren.Length > 0)  MdiChildren[0].Close();

    }

Comme vous pouvez le voir dans ce morceau de code, on peut aussi accéder aux fiches enfants par un tableau indicé nommé MdiChildren.


Accès à un composant de la fiche enfant depuis la fiche parent :

Sur l'événement Click d'une autre option de menu nommé "Écrire" nous ajoutons une ligne de texte sur la TextBox de la fiche enfant active :

 
Sélectionnez
    private void Ecrire_Click(object sender, System.EventArgs e)

    {

      int n = 0;



      while(ActiveMdiChild!=null && n < ActiveMdiChild.Controls.Count)

      {

         if( ActiveMdiChild.Controls[n].Name == "textBox1" )

                 ((TextBox)ActiveMdiChild.Controls[n]).Text =

                         ((TextBox)ActiveMdiChild.Controls[n]).Text.Insert(0,

                                   "Texte ajouté depuis le menu parent.\r\n");

         n++;

      }

    }

Nous n'avons pas d'accès direct aux contrôles des fiches enfants, nous sommes donc obligés de passer par une propriété tableau indicée Controls pour retrouver notre contrôle. Tester ici aussi qu'il existe bien une fiche enfant avant d'exécuter une quelconque action dessus.


Arrangement des fiches enfants dans la fiche parent :

Pour l'exemple nous allons créer un menu principal nommé "Fenêtres" contenant trois options de menu nommées "Cascade", "Horizontale" et "Verticale" dont voici le code de leur événement Click respectif :

 
Sélectionnez
    private void Cascade_Click(object sender, System.EventArgs e)

    {

      LayoutMdi(MdiLayout.Cascade);

    }

    

    private void Horizontal_Click(object sender, System.EventArgs e)

    {

      LayoutMdi(MdiLayout.TileHorizontal);

    }

    

    private void Vertical_Click(object sender, System.EventArgs e)

    {

      LayoutMdi(MdiLayout.TileVertical);

    }


Liste des fenêtres enfants dans le menu :

Pour obtenir cette liste dans un menu, il suffit de passer la propriété MdiList du menu en question à True par exemple celle du menu "Fenêtre" précédemment créé.


Arrangement des menus :

Chaque Menu possède une propriété MergeOrder que vous pouvez initialiser à la conception pour organiser l'ordre de fusion des menus. Dans l'exemple je l'ai laissé à 0 pour le menu "Parent" mis à 2 pour le menu "Fenêtre" et je l'ai mis à 1 pour le menu "Enfant" de la fiche enfant.



À vos EDI.

CGi

Avec la contribution d'Alacazam pour la relecture.