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, quelles soient normales, réduites, agrandies...
Une fenêtre MDI possède une interface pour accéder à nimporte lequel de ces enfants, ou tout simplement à celui qui est actif.
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, quon appelle fenêtres filles MDI, ou Clients MDI.
La fenêtre MDI possède un menu, mais ses enfants nen ont pas.
Une fiche MDI possède les méthodes suivantes pour gérer ses enfants :
Les propriétés " MDI " dune fenêtre sont les suivantes :
Appelons la fenêtre principale de notre application FMereMDI.
Cette fenêtre ne contiendra quun 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 lattribut 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 dappeler 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.