Applications MDI


Une fenêtre MDI (Multiple Document Interface) est une fenêtre (dite mère) qui peut contenir plusieurs fenêtres (dites enfants), qui sont toutes contenues dans leur mère, qu’elles soient normales, réduites, agrandies...

Une fenêtre MDI possède une interface pour accéder à n’importe lequel de ces enfants, ou tout simplement à celui qui est actif.

  • VII.1 : Caractéristiques d’une fenêtre MDI
  • Une fenêtre MDI dérive évidemment de TForm, mais avec la propriété FormStyle réglée à fsMDIForm.

    Seule, la fenêtre MDI ne sert pas à grand-chose. Elle doit travailler avec ses fenêtres enfants, qu’on appelle fenêtres filles MDI, ou Clients MDI.

    La fenêtre MDI possède un menu, mais ses enfants n’en ont pas.

    Une fiche MDI possède les méthodes suivantes pour gérer ses enfants :

    Les propriétés " MDI " d’une fenêtre sont les suivantes :

    VII.2 : Programme d’exemple

    Appelons la fenêtre principale de notre application FMereMDI.

    Cette fenêtre ne contiendra qu’un menu, contenant :

    Cette fiche possède bien sur l’ attribut fsMDIForm.

    Il faut maintenant créer le type de fenêtre enfant. Pour cela, il suffit de créer une nouvelle fiche possédant l’attribut fsMDIChild. Appelons-là FFilleMDI.

    Mettons un TEdit dans cette fenêtre enfant. Cette zone pourra être effacée grâce au menu de la fenêtre mère.

    Ecrivons maintenant les fonctions de la fenêtre mère de réponse aux éléments de menu.

    void __fastcall TFMereMDI::Nouveau1Click(TObject *Sender)

    {

    TFFilleMDI *Fen;

    Fen=new TFFilleMDI(this);

    Fen->Caption="Fille n°"+IntToStr(n++);

    }

    void __fastcall TFMereMDI::Fermer1Click(TObject *Sender)

    {

    // ferme la fille active

    if(ActiveMDIChild)

    ActiveMDIChild->Close();

    }

    void __fastcall TFMereMDI::ToutFermer2Click(TObject *Sender)

    {

    // ferme toutes le fenêtres filles

    int i;

    for(i=0;i<MDIChildCount;i++)

    MDIChildren[i]->Close();

    }

    void __fastcall TFMereMDI::EffacerZone1Click(TObject *Sender)

    {

    // efface la zone texte de la fille active

    if(ActiveMDIChild)

    ((TFFilleMDI*)ActiveMDIChild)->Edit1->Text="";

    }

    Pour les items du menu fenêtre, il suffit juste d’appeler une des méthodes Cascade, Tile, ArrangeIcons...

    Il faut également écrire quelques fonctions de la fenêtre fille, notamment se réponse à l’évènement OnClose :

    void __fastcall TFFilleMDI::FormClose(TObject *Sender,

    TCloseAction &Action)

    {

    Action=caFree;

    }

    Mettre la variable Action à caFree indique de détruire complètement la fenêtre (la fermer ET libérer sa mémoire). Il est donc inutile (et ce serait même une erreur) de faire un delete sur le pointeur de cette fenêtre.