Delphipage - la reference en Delphi
Accueil - Astuces - Composants - Programmes - Tutoriaux - Livres - Liens
 Sources
- Astuces
- Composants
- Programmes
- Tutoriaux
 Rechercher
- Delphipage
- Ngscan
 Ressources
- Lexique Delphi
- Livres
- News
- Patchs Delphi
 Liens
- Borland France
- CodeGear
- Les meilleurs sites


Tutoriaux - Mdi

Qu'est-ce que le MDI ?

Une application MDI (Multiple Document Interface) est constitué d'une fenêtre principale appelé le parent et des fenêtres enfants. Cette interface permet à la fenêtre principale de contenir des fenêtre enfant.

La propriété FormStyle d'une Form permet de spécifier le style d'une fenêtre.

Style
Description
fsMDIChild Fenêtre enfant d'une application MDI.
fsMDIForm Fenêtre principale d'une application MDI.
fsNormal Fenêtre normale.
fsStayOnStop Fenêtre persistante.

Par défaut, la propriété FormStyle est à fsNormal.


Construire une application MDI

Pour commencer, il faut créer une nouvelle application. Insérez un composant TMainMenu, TOpendialog. Créez dans le menu une option Fichier et insérez dans celui-ci les options Ouvrir et Quitter. Mettez pour la première fiche qui sera la fenêtre principale du projet la propriété FormStyle de l'inspecteur d'objet à fsMDIForm.
Il faut ensuite créer une nouvelle fiche, pour cela allez dans le menu Fichier de delphi et cliquez sur Nouvelle fiche.
Votre projet comporte alors deux fiches appelées Form1 et Form2. Mettez pour la deuxième fiche qui sera la fenêtre enfant du projet la propriété FormStyle de l'inspecteur d'objet à fsMDIChild. Insérez un composant TImage dans la form2.Mettez la propriété AutoSize du compoant TImage à true.

Ouvrir une fenêtre enfant

Pour ouvrir la fenêtre enfant, il faut tout d'abord créer la fenêtre puis insérer ce que l'on veut dedans et enfin redimensionner la fenêtre.

Voici un exemple permettant d'ouvrir un fichier image dans une fenetre enfant.

procedure TForm1.Ouvrir1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin

//Créer la fenêtre enfant
Form2:=TForm2.Create(application);
//Insére le fichier dan le composant TImage
Form2.Image1.Picture.LoadFromFile(OpenDialog1.FileName);
//redimensionne la fenêtre enfant
Form2.ClientHeight:=Form2.Image1.Picture.Bitmap.Height; Form2.ClientWidth:= Form2.Image1.Picture.Bitmap.Width;
//Récupère le nom et l'extension du fichier ouvert
Form2.Caption:=ExtractFileName(OpenDialog1.FileName);
end;
end;

Fermer la fenêtre enfant

Pour fermer la fenêtre enfant, il faut cliquez deux fois sur l'évènement OnClose pour y insérer le source.
Il y a plusieurs possibilités pour fermer une fiche.

Valeur
Description
caNone La fiche n'est pas autorisée à se fermer, il ne se passe rien.
caHide La fiche n'est pas fermée, juste cachée. L'application peut toujours accéder à la fiche.
caFree La fiche est fermée et toute la mémoire allouée à la fiche est libérée.
caMinimize La fiche est réduite, pas fermée. C'est l'action par défaut pour les fiches enfant MDI.

Voici un exemple avec "caFree".

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
end;

Fermeture d'une mdi    [ 13-08-2001 ]
 Programme qui montre les possibilités de la fermeture d'une application mdi.
Télécharger :  [9 Ko] [Télécharger mdi.zip]

Auteur : Yoann
Site internet :
http://delphipage.free.fr/


Construire un menu fenêtre

On peut construire un menu fenêtre ce qui permettra d'offrir des options à la fiche.
Voici les différentes options que l'on utilisera.
- Suivante
- Précèdente
- Cascade
- Mosaique horizontal
- Mosaique vertical
- Fermer
- Tout fermer
Nous aurons également dans ce menu fenetre les noms des fenêtres enfant.


Suivante

Lorsque vous avez plusieurs fiches enfants dans votre application, vous pouvez cliquer sur Suivante pour passer à la fenetre enfant suivante.


procedure TForm1.Suivante1Click(Sender: TObject);
begin
Form1.Next;
end;

Précèdente

Quand vous avez plusieurs fiches enfants dans votre application, vous pouvez cliquer sur Précèdente pour revenir à la fenetre enfant précèdente
.

procedure TForm1.Prcdente1Click(Sender: TObject);
begin
Form1.Previous;
end;

Cascade

Organise les fenêtres enfant MDI afin qu'elles se recouvrent.

procedure TForm1.Cascade1Click(Sender: TObject);
begin
Cascade;
end;

Mosaique horizontal

Organise les fiches enfant MDI horizontalement de façon à ce qu'elles aient toutes la même taille.

procedure TForm1.Mosaiquehorizontal1Click(Sender: TObject);
begin
Form1.TileMode:=tbHorizontal;
Form1.Tile;
end;

Mosaique vertical

Organise les fiches enfant MDI verticalement de façon à ce qu'elles aient toutes la même taille.

procedure TForm1.Mosaiquevertical1Click(Sender: TObject);
begin
Form1.TileMode:=tbVertical;
Form1.Tile;
end;

Fermer

Active la fenêtre enfant et la ferme.

procedure TForm1.Fermer1Click(Sender: TObject);
begin
with ActiveMDIChild as TForm2 do
Close;
end;

Tout fermer

Compte le nombre de fenêtre enfant mdi et les ferme tous.

procedure TForm1.Toutfermer1Click(Sender: TObject);
var i: integer;
begin
for i:= 0 to MdiChildCount - 1 do
MDIChildren[i].Close;
end;

Obtenir les noms des fenetres enfants dans le menu Fenêtre

Pour les applications MDI (multifiche), Delphi integre une option pour réaliser l'effet suivant (avoir les mdi répertoriées dans un menu):

Pour obtenir cela, il suffit de mettre dans la propriété WindowMenu de la form principale (MDIForm) le nom du menu voulu.

Propriété

Exemple
 WindowMenu  Fenetre1

Menu fenêtre    [ 02-10-2001 ]
 Programme montrant l'ouverture d'un fiche mdi et ayant un menu fenêtre.
Télécharger :  [9 Ko] [Télécharger mdi2.zip]

Auteur : Yoann
Site internet :
http://delphipage.free.fr/


Pourquoi lors de l'exécution, la fenêtre enfant s'ouvre t-elle ?

Par défaut, lorsque vous créez une application mdi, la fenêtre enfant apparait lors de l'execution. Pour y remédier, il suffit de cliquer dans le menu Projet de delphi puis de cliquez sur Voir le source. Voici ce que vous voyez.

program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};

{$R *.RES}


begin
Application.Initialize; Application.CreateForm(TForm1, Form1);
Application.Initialize; Application.CreateForm(TForm2, Form2);
Application.Run;
end.

Il faut pour ne plus voir apparaitre à l'execution du projet la fenetre enfant, supprimer un ligne.

program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};

{$R *.RES}


begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

Tous droits réservés - Contacts
Haut de la page