Les boites de dialogue sont des fenêtres permettant de choisir des objets complexes (fichiers, couleurs, polices, dates, etc...). Elles possèdent en général un bouton de confirmation du choix ainsi qu'un autre bouton permettant d'annuler le choix. Dès que l'utilisateur clique sur le bouton de confirmation ou d'annulation, la boite de dialogue disparait.
Dans Lazarus toutes les classes représentant des boites de dialogue sont des sous-classes de TCommonDialog. Cette dernière possède une méthode Execute permettant d'afficher une boite de dialogue à l'écran. De plus, cette méthode retourne la valeur false si l'utilisateur annule son choix et la valeur true s'il le confirme.
Vous trouverez les boites de dialogue sous l'onglet Dialog. Nous présenterons ici les boites de dialogues suivantes:
ainsi que l'utilisation de la fonction Confirmation permettant d'afficher une boite de dialogue pour confirmer un choix.
Cette partie du cours, se termine par un exemple: une nouvelle version de l'éditeur de texte utilisant des boites de dialogue.
Les boites de dialogues d'ouverture de fichiers évitent à l'utilisateur de taper le nom (et éventuellement le chemin) d'un fichier. Elles se présentent de la manière suivante:
Vous en avez certainement utilisé des centaines de fois, car ont les trouve dans tous les logiciels utilisant des fichiers. Pour sélectionner un fichier, vous vous déplacer dans l'arborescence des fichiers de l'ordinateur. Une fois le répertoire atteind, il vous suffit de cliquer sur le nom fichier.
Si l'utilisateur confirme le choix de fichier, l'attribut FileName de la boite de dialogue contiendra le nom complet du fichier (avec extension et chemin si nécessaire).
Les boites de dialogue d'ouverture de fichier permettent également de filtrer les fichiers par leur extension. Par exemple, dans la boite de dialogue de la figure précédente, seuls les fichiers d'extension '.txt' sont visibles. L'utilisateur ne pourra donc sélectionner qu'un fichier texte. Ceci permet d'éviter l'ouverture de fichier de format incompatible avec le programme qui les traite.
La boite de dialogue contient une zone de liste permettant à l'utilisateur de sélectionner un certain type de filtrage. La boite dialogue suivante, par exemple, présente deux choix de filtrage:
On peut également définir un filtrage autorisant plusieurs extensions. Voici par exemple le résultat du filtrage simultané des extensions '*.txt' et '*.pas':
Le filtrage des fichiers est défini par le contenu de la propriété Filter de la boite de dialogue. Pour définir son contenu, le plus simple est d'utiliser l'éditeur de filtre. On y accède en cliquant sur les '...' de la propriété Filter dans l'inspecteur d'objet.
Chaque ligne de l'éditeur de filtre représente un choix de filtrage dans la zone de liste. Voici par exemple comment définir séparemment deux modes de filtrage:
La colonne de gauche est un commentaire pour l'utilisateur. Il sert en principe à expliquer la signification de l'extension. La colonne de droite défini le filtre sous la forme *.??? où les trois caractères ??? sont ceux de l'extension.
Poir autoriser tous les formats, on utilise la notation *.* :
Pour définir un filtrage autorisant simultanément plusieurs extensions, il faut séparer les filtres par des points virgules:
Les boites de dialogue d'enregistrement de fichier fonctionnent selon le même principe que les boites de dialogue d'ouverture de fichier, mis à part que le bouton Ouvrir est remplacé par un bouton Enregistrer:
La classe TOpenPictureDialog est une variante de TOpenFileDialog qui permet de visualiser des fichiers images. L'intérêt principal de cette boite de dialogue est que les fichiers images sont visualisés sous forme d'icone. Comme ceci par exemple:
Comme pour la classe TOpenPictureDialog, le fichier sélectionné se retrouve dans l'attribut FileName.
Une couleur est représentée sous Lazarus par le type TColor. La boite de dialogue de sélection de couleur, permet à l'utilisateur de sélectionner visuellement une couleur, sans se préoccuper de la manière dont elle est codée en mémoire:
Le programmeur quand à lui, récupère la couleur dans l'attribut Color. Il pourra ensuite utiliser cette valeur pour affecter cette couleur à n'importe quel composant graphique, sans se préoccuper lui aussi du codage des couleurs.
La police de caractères, c'est à dire la manière dont s'affiche une chaine de caractère à l'écran est représentée sous Lazarus par la classe TFont, qui possède de très nombreux attributs. La boite de dialogue de sélection de police permet à l'utilisateur de sélectionner visuellement les propriétés d'une police de caractère:
Le programmeur, récupère la police de caractère sélectionnée dans l'attibut Font, sous la forme d'un objet de la classe TFont.
Cette section ne présente pas une boite de dialogue Lazarus, mais une fonction que j'ai écrite moi-même permettant d'afficher une boite de dialogue de ce type:
Cette fonction nommée Confirmation, est intégrée à la librairie entrees_sorties.pas. Si vous regarder son code, vous constaterez qu'elle utilise la fonction QuestionDlg. Il s'agit d'une fonction standard de Lararus, plus complexe et plus générale, permettant d'afficher une boite de dialogue posant une question à l'utilisateur avec éventuellement plus de deux boutons.
La fonction Confirmation affiche une boite de dialogue permettant de confirmer l'exécution d'une action potentiellement dangereuse. Elle retourne un booléen: True si l'utilisateur confirme son choix, False sinon.
Dans l'exemple présentée dans la figure ci-dessus, l'appel de la fonction serait:
Confirmation ('Mise en garde', 'Voulez-vous réellement quitter l''application ?', 'Non','Oui');
De manière générale, vous pouvez utiliser cette fonction pour confirmer des choix potentiellement dangereux de l'utilisateur. Voici son entête:
function Confirmation (t,m,td,ta:string):boolean;
Elle possède donc quatre paramètres de type String:
Le résultat retourné est True si l'utilisateur ne clique pas sur le bouton par défaut, c'est à dire, s'il confirme vouloir exécuter l'action potentiellement dangereuse.
L'exemple suivant se trouve dans le dossier Exemple-ProgObjet1/BoiteDeDialogue. Il s'agit d'une version améliorée de l'éditeur de texte que nous avons utilisé pour expliquer le principe des menus. Cette nouvelle version intègre (entre autres) des boites de dialogue pour l'ouverture et l'enregistrement des fichiers.
Le menu Fichier est le même que dans la version précédente:
Le menu Affichage par contre a été remplacé par le menu Texte qui permet de modifier la police de caractère ou la couleur du mémo.
Cette nouvelle version utilise quatre boites de dialogue:
Notez que ces boites de dialogue ne seront pas immédiatement visibles au démarrage du programme. Pour les afficher, il est nécessaire de leur appliquer la méthode Execute.
L'entrée Ouvrir du menu Fichier provoque l'exécution de la procédure suivante:
procedure TForm1.MN_OuvrirClick(Sender: TObject); begin if (OpenDialog1.Execute()) then MM_Editeur.Lines.LoadFromFile(OpenDialog1.FileName); end;
Si la méthode Execute retourne True, l'utilisateur a confirmé le choix de fichier. Son nom se trouve donc dans l'attribut Filename. Ce fichier est chargé dans le mémo MM_Editeur via la méthode LoadFromFile.
L'entrée Enregistrer du menu Fichier provoque l'exécution de la procédure suivante:
procedure TForm1.MN_EnregistrerClick(Sender: TObject); begin if (SaveDialog1.Execute()) then if not FileExists (SaveDialog1.FileName) then MM_Editeur.Lines.SaveToFile(SaveDialog1.FileName) else if Confirmation('Mise en garde', 'Fichier existant.'+ ' Voulez vous écraser l''ancienne version ?', 'Ne rien faire','Ecraser') then MM_Editeur.Lines.SaveToFile(SaveDialog1.FileName); end;
Ici, nous testons l'existence du fichier pour éviter d'écraser par mégarde une version ultérieure. Si le fichier existe, la fonction Confirmation est utilisée pour confirmer le choix de l'utilisateur.
L'entrée Police du menu Texte provoque l'exécution de la procédure suivante:
procedure TForm1.MN_PoliceClick(Sender: TObject); begin if (FontDialog1.Execute) then MM_Editeur.Font:= FontDialog1.Font; end;
La police sélectionnée est affectée à l'attribut Font du mémo, ce qui a pour effet de modifier la police de caractère du texte affiché dans le mémo.
L'entrée Couleur du menu Texte provoque l'exécution de la procédure suivante:
procedure TForm1.MN_CouleurClick(Sender: TObject); begin if (ColorDialog1.Execute()) then MM_Editeur.Color:=ColorDialog1.Color; end;
La couleur sélectionnée est affecté à l'attribut Color du mémo, ce qui a pour effet de modifier la couleur du fond du mémo.