jeudi 1 janvier 2009

Applications multifenêtres avec Builder, Part I


Introduction


Une application Windows est généralement structurée autour d'une fenêtre principale qui appelle d'autres fenêtres via des commandes de menus. Par exemple, voilà à quoi ressemble l'application Word qui me sert présentement pour écrire ce document, lorsque je sélectionne l'item "Enregister sous..." du sous-menu "Fichier":

La fenêtre "Enregistrer sous..." est de type modal, ce qui veut dire que l'on pourra revenir à la fenêtre initiale seulement après avoir fermé la fenêtre courante. Par opposition, une fenêtre non-modale va permettre à l'utilisateur de se promener d'une fenêtre à l'autre. La plupart des applications utilisent le principe des fenêtres modales, sauf peut-être les environnements de programmation comme Builder. Généralement, une application avec fenêtres modales est plus simple d'utilisation puisqu'on demande à l'utilisateur de se concentrer sur une fenêtre à la fois.


Notre première application multifenêtres

On y va avec une application toute simple, soit une fenêtre principale qui contient un seul bouton permettant de faire apparaître une autre fenêtre modale, du genre:



Pour y arriver, il s'agira d'abord d'ajouter une nouvelle fiche à notre projet. Nous savons que lorsqu'on part une nouvelle application Builder, celui-ci se charge de créer une fiche "Unit1.cpp" qui est en fait composé de trois fichiers, soit "Unit1.cpp", "Unit1.h" et "Unit1.dfm", comme le montre le gestionnaire de projet:

Les fichiers "Unit1.h" et "Unit2.cpp" correspondent au module de programmation associé a la fenêtre dont la description est contenu dans le fichier "Unit1.dfm".

Pour ajouter une seconde fiche au projet, on clique sur le bouton de droite en sélectionnant "Projet1.exe" dans la fenêtre "Gestionnaire de projet" de Builder (qui en passant, fait un usage immodéré de fenêtres non-modales!), on sélectionne "Ajouter nouveau...|Fiche" et on devrait se retrouver avec ceci dans le gestionnaire de projet:


Avant de continuer plus loin, peut-être serait-il opportun de donner des noms significatifs à nos fiches. J'ai l'habitude de renommer la fiche principale "Unit1.cpp" qui contient la fenêtre principale pour le nom de "main.cpp" (en sélectionnant "Unit" avec le bouton de droite de la souris) .On renommera "Unit2" de la même façon, avec un nom qui lui convient. Pour l'instant, seul le nom de "Test" me vient en tête. On se retrouve donc avec les fiches:

Pendant qu'on y est, on renommera via l'Inspecteur d'Objets le nom des fenêtres (ou formes) associées aux fiches (Par défaut Form1, Form2...). Pour m'y retrouver, j'ai l'habitude de donner à la propriété "Name" de la fenêtre associée le même nom que la fiche avec le préfixe "frm". Par exemple, pour la forme associée à "main", le nom de la forme sera "frmMain". De la même façon, la forme de la fiche "Test" aura pour nom "frmTest".

Reste plus qu'à appeler la forme "frmTest" à partir d'un bouton nommé "btFrmTest" contenu dans la fenêtre principale. Voici le code de "main.cpp":


#include <vcl.h>
#pragma hdrstop

#include "main.h"
#include "test.h"

#pragma package(smart_init)
#pragma resource "*.dfm"

TfrmMain *frmMain;

__fastcall TfrmMain::TfrmMain(TComponent* Owner)
: TForm(Owner)
{
}

void __fastcall TfrmMain::btFrmTestClick(TObject *Sender)
{
  frmTest-ShowModal() ;
}



La fenêtre "frmTest" va apparaître grâce à l'appel de la méthode "ShowModal" hérité de la classe "TForm". Pour que ça fonctionne , il ne faudra pas oublier d'inclure le fichier "test.h" qui contient la définition de "frmTest". Sinon, vous allez vous ramasser avec un message d'erreur à la compilation du genre:
[BCC32 Erreur] main.cpp(19): E2451 Symbole 'frmTest' non défini
Pour obtenir une fenêtre modale, on ira avec la méthode suivante:
frmTest->Show() ;
On verra dans la deuxième partie portant sur les applications fenêtrées une façon plus rusée d'appeler une fenêtre.