Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi MS-Office SQL & SGBD Oracle  4D  Business Intelligence
FORUMS .NET FAQs .NET TUTORIELS .NET SOURCES .NET LIVRES .NET OUTILS .NET BLOG .NET DOTNET TV


Création d'une application MDI avec C# Builder

Par CGi

Le 30 avril 2004



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.



Création de l'application :

Tout d'abord créons une nouvelle application. (Menu : 'Fichier' -> 'Nouveau' -> 'Application C#') Nommez là 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.



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" multilignes (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 "Ecrire" et "Fermer".
Sur l'événement Click de Fermer nous fermerons la fiche :

    private void Fermer_Click(object sender, System.EventArgs e)
    {
      Close();
    }

Sur l'événement Click de Ecrire 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 :

     //.......
     private static int count = 0 ;
     //.......
     public WinForm1() // Constructeur
     {
       InitializeComponent();

       count++;
       Text = "Fenetre N° " + 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 et tout à fait semblable au traitement d'une fiche ordinaire et n'a rien d'exceptionnel mais va nous servir pour la suite.



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 juste 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":

    private System.Windows.Forms.Form form1;

    //.......

    private void Nouveau_Click(object sender, System.EventArgs e)
    {
      form1 = new WinForm1();
      form1.MdiParent = this;
      form1.Show();
    }

A 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 2ème option de menu dans le menu "Parent" nommé "Fermer" sur son événement Click nous fermerons la fiche enfant active :

    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 :

    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 enfant 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é "Ecrire" nous ajoutons une ligne de texte sur la TextBox de la fiche enfant active :

    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 enfant, 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 enfant 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 leurs événements Click respectifs:

    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 enfant dans le menu :

Pour obtenir cette liste dans un menu, il suffit tout simplement 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.



A vos EDI.

CGi


Avec la contribution d'Alacazam pour la relecture.





C/C++

  Les pointeurs du C/C++.   Les listes chaînées.             Liste simple.             Liste triée.             Liste double.   Le C orienté objets ?

API Windows

  1 - La fenêtre principale.   2 - Contrôles et messages.   3 - Les commandes.   4 - Dialogue std.   5 - Contexte de périph.   6 - Dessiner.   7 - Les ressources.   8 - Dialogue perso.   9 - Dialogue comm.   10 - Les accélérateurs.

C++ BUILDER

  Trucs et astuces.   Composant.   TRichEdit.   TDrawGrid.   Application MDI.   TThread.   wxWidgets.   Style Win XP.

wxWidgets

  Première application.   Construire un menu.   Dessiner.   Sisers, Timers...   Dialogues standards.   Dialogues perso.

DotNet

  Composant C# Builder.   Contrôle WinForm.   Application MDI.

Java

  Applet java.





Copyright 2002-2007 CGi - Tous droits réservés CGi. Toutes reproduction, utilisation ou diffusion de ce document par quelque moyen que ce soit autre que pour un usage personnel doit faire l'objet d'une autorisation écrite de la part de l'auteur, propriétaire des droits intellectuels.
Les codes sources de ce document sont fournis en l'état. L'utilisateur les utilise à ses risques et périls, sans garantie d'aucune sorte de la part de l'auteur. L'auteur n'est responsable d'aucun dommage subi par l'utilisateur pouvant résulter de l'utilisation ou de la distribution des codes sources de ce document.
De la même façon, l'auteur n'est en aucun cas responsable d'une quelconque perte de revenus ou de profits, ou de données, ou de tous dommages directs ou indirects, susceptibles de survenir du fait de l'utilisation des codes sources de ce document, quand bien même l'auteur aurait été averti de la possibilité de tels dommages. L'utilisation des codes sources de ce document vaut acceptation par l'utilisateur des termes de la licence ci-dessus.

Responsable bénévole de la rubrique DotNET : Jérôme Lambert (Cardi) - Contacter par EMail :
Vos questions techniques : forum d'entraide DotNET - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright © 2000-2008 www.developpez.com - Legal informations.