Les menus

Jean-Michel Doudoux

- Titre : Les menus

- Auteur : Jean-Michel Doudoux

- Parution : 6 novembre 2003

- Mise à jour : 24 décembre 2019

- Licence : Copyright ® 2003 J.M.Doudoux. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- Avant-propos

- I. Les classes de gestion des menus

- I-A. Le concepteur de menus et options de menu

- I-A-1. Mettre à jour les propriétés des options

- I-A-2. Options et sous-options de menu

- I-A-3. La présentation des options

- I-A-4. Les barres de ruptures des menus déroulants

- I-A-5. Les raccourcis clavier

- I-B. L'ajout, l'insertion et la suppression dynamique d'options de menu

- II. L'événement OnClick

- III. La fusion des menus

- III-A. Les méthodes des barres de menus

- IV. Les menus surgissants (TPopupMenu)

Avant-propos

Tous les objets nécessaires à la gestion des menus se trouvent dans l'unité Menus, qui contient essentiellement les composants TMainMenu et TPopupMenu et les classes TMenu et TMenuItem.

I - Les classes de gestion des menus

TMenu et TMenuItem héritent directement de Tcomponent. TMainMenu et TPopupMenu héritent de la classe TMenu.

TMainMenu permet de créer la barre de menus d'une fiche, TPopupMenu permet d'afficher des menus flottants. La barre de menus n'est pas un contrôle, mais un composant dont la représentation graphique apparaît sous forme d'une icône dans la fiche.

I-A - Le concepteur de menus et options de menu

La définition interactive des options (ou items) de menu est assurée par un outil appelé concepteur de menus. Après avoir ajouté le composant Menu Principal dans la fiche, double-cliquez sur l'icône pour ouvrir le concepteur de menus.

Chaque fois qu'un item est ajouté, Dephi propose un emplacement vierge pour insérer une nouvelle option à droite dans la barre de menus ou en dernière position dans les menus déroulants. Ceux-ci sont désignés en pointillés.

Pour insérer une option entre deux options déjà existantes, placez le curseur sur l'option du bas, puis utilisez la touche INS.

Pour supprimer une option existante, sélectionnez l'item puis appuyer sur la touche SUPPR.

Le glisser-poser permet de déplacer les items à l'intérieur d'une liste d'options ou entre les différentes listes.

Le menu déroulant des options de menu permet d'insérer des menus prédéfinis à partir de modèles Delphi ou de ressources Windows.

On peut également définir ses propres modèles de menus et les enregistrer, ou supprimer un modèle de menu.

I-A-1 - Mettre à jour les propriétés des options

Lorsque le concepteur de menus est ouvert, l'inspecteur d'objets propose une liste des propriétés du menu sélectionné.

Le libellé de l'option est contenu dans la propriété Caption. Il est possible d'associer une combinaison de touche rapide en faisant précéder une lettre du libellé par le caractère &. La lettre associée apparaît en souligné dans le texte de l'option et il suffit d'appuyer sur (Alt+caractère) pour l'activer.

La propriété Name permet de préciser le nom de l'objet, c'est-à-dire le nom de l'instance de l'objet TMainMenu ou TMenuItem. Comme pour tous les composants, Delphi leur attribue un nom par défaut qu'il est préférable de renommer (en les préfixant par mnu_ par exemple pour les menus).

La propriété Hint contient le message inclus dans la bulle d'aide, Tag permet de stocker une variable de type LongInt.

I-A-2 - Options et sous-options de menu

Pour insérer une sous-option de menu, utilisez la commande Créer sous-menu du menu déroulant du concepteur de menus.

La propriété Count indique le nombre de sous-options d'une option de menu. Pour accéder aux différentes sous-options d'une option, utilisez la propriété Items qui représente un tableau contenant l'ensemble de ces sous-options de menu :

Items [Index : Integer] : TMenuItem;

Le paramètre Index varie de 0 à Count-1. Ces deux propriétés ne sont pas accessibles par l'inspecteur d'objets, mais peuvent être utilisées dans le code.

I-A-3 - La présentation des options

La propriété booléenne Checked permet de spécifier par True ou False si le libellé de l'option de menu apparaît précédé du caractère de sélection ou non.

Pour rendre une option de menu non sélectionnable par l'utilisateur, positionnez la propriété Enabled à False. L'item apparaît dans ce cas en grisé et elle ne peut plus être sélectionnée.

Enabled est différent de la propriété Visible, qui lorsqu'elle vaut False, efface entièrement l'option de la liste déroulante.

Attention : si une option dont la propriété Visible est positionnée à False contient des sous-options, cette liste devient elle-même invisible ainsi que tous ses items.

I-A-4 - Les barres de ruptures des menus déroulants

La propriété Break permet de créer des ruptures verticales dans les listes que forment les menus déroulants. Cette propriété peut être valorisée avec trois constantes :

- mbNone aucune rupture ;

- mbBarBreak la liste des menus apparaît coupée verticalement par une barre verticale ;

- mbBreak la liste de menus apparaît coupée verticalement par un espace.

Pour créer une rupture horizontale simple (une ligne de séparation), il suffit d'insérer un simple caractère - en guise de libellé de l'option du menu.

I-A-5 - Les raccourcis clavier

L'insertion du caractère & avant une lettre du libellé d'une option de menu permet de l'activer en utilisant la combinaison de touches Alt+caractère. Pour définir un raccourci clavier qui ne soit plus limité à l'association avec Alt, il suffit d'utiliser la propriété ShortCut des options de menus. La propriété ShortCut présente dans l'inspecteur d'objets est associée à une liste déroulante contenant l'ensemble des combinaisons de touches pouvant être utilisées. Une fois définie, cette combinaison de touches sera automatiquement affichée par Delphi dans le libellé de l'option du menu.

Astuce : pour augmenter l'écart entre le libellé de l'option et le code du raccourci clavier, il suffit d'ajouter quelques caractères d'espacement à la fin du libellé.

La définition interactive des raccourcis clavier lors de la conception de l'application est la solution la plus rapide et la plus simple. Delphi propose quatre procédures et fonctions pour créer un résultat équivalent lors de la création des menus dynamiques (dans le code) :

- ShortCut : crée un raccourci clavier TShortCut ;

- ShortCutToKey : décompose un raccourci clavier en un code touche de contrôle et un code de touche virtuelle ;

- ShortCutToText : retourne une chaîne de caractères (String) correspondant à un raccourci clavier, permettant de le faire apparaître dans le libellé d'une option de menu créée dynamiquement ;

- TextToShortCut : retourne sous forme d'une valeur de type ShortCut le raccourci clavier correspondant à un libellé passé en paramètre au format String.

Exemple :

mnu_aide.shotcut := ShortCut(VK_F1,[]);
mnu_copier.shortcut := ShortCut(Word('C'),[ssCtrl]);

I-B - L'ajout, l'insertion et la suppression dynamique d'options de menu

La méthode Add des options de menus permet d'ajouter une nouvelle option en fin d'une liste de sous-options.

Exemple :

var
mon_item : TMenuItem;
begin
mon_item := TMenuItem.Create(Self);
mon_item.Caption := 'ajout option';
mon_item.name := 'mnu_ajoute';
mnu_opt.add(mon_item);
end;

La méthode Insert insère une option de menu à une position spécifiée par une valeur d'index passée en paramètre.

Exemple :

mnu_opt.Insert(0,mon_item);

La méthode Delete permet de supprimer une option de menu.

Exemple :

if mnu_opt.Count > 0 then
begin
mon_item:=mnu_opt.Items[0];
mnu_opt.delete(0);
mon_item.Destroy:
end;

II - L'événement OnClick

Les options de menus ne génèrent qu'un type d'événement, OnClick, déclenché lorsque l'utilisateur valide l'option par la souris ou une action équivalente (touche rapide, raccourci clavier…).

Par exemple : inverser la position du drapeau Checked d'une option de menu

mnu_option.Checked := not(mnu_option.Checked);

III - La fusion des menus

La propriété booléenne Automerge, dont la valeur par défaut est False, indique si une fusion automatique des menus d'une ou plusieurs fiches de l'application doit avoir lieu. Les fiches dont les menus sont à fusionner doivent toutes avoir leur propriété AutoMerge à True. La barre des menus de la fiche principale doit par contre avoir sa propriété AutoMerge positionnée à False, sinon aucun menu n'apparaît.

Le mode de fusion des menus dépend de la valeur de la propriété GroupIndex de chacune des options de menus (TMenuItem). Le type de GroupIndex est Byte. Par défaut, toutes les options de menus possèdent la valeur 0. Lorsque les menus à fusionner avec les menus de la fiche principale possèdent la même valeur de GroupIndex, les seconds remplacent les premiers. Lorsque les valeurs de GroupIndex sont différentes, ils sont insérés, c'est-à-dire viennent s'ajouter aux premiers.

Les éléments fusionnés apparaissent disposés dans la barre des menus selon la valeur de GroupIndex. Les index des items d'une même barre de menu doivent donc avoir des valeurs croissantes selon leur position dans la barre, de la gauche vers la droite.

III-A - Les méthodes des barres de menus

Les deux méthodes spécifiques Merge et UnMerge de la classe TMainMenu concernent également la question de la fusion des menus.

Merge(Menu : TMainMenu);

L'argument de la méthode précise le menu qui doit être fusionné avec le menu de la fiche appelante (l'unité de la fiche contenant la barre de menu doit être déclarée dans la clause Uses).

La fusion des menus peut être supprimée en utilisant la méthode complémentaire Unmerge :

Unmerge(Menu : TMainMenu);

IV - Les menus surgissants (TPopupMenu)

Pour créer un menu surgissant (appelé également menu flottant ou menu popup), insérer un composant TPopupMenu dans la fiche.

La création du contenu du menu déroulant utilise aussi le concepteur de menus pour créer les options du menu.

Pour attacher un menu surgissant à une fiche ou à un composant d'une fiche, indiquez le nom du menu (le contenu de sa propriété Name) dans la propriété PopupMenu du composant.

Pour que le menu surgissant apparaisse lorsque l'utilisateur clique sur le bouton droit de la souris sur la fiche ou le composant associé, positionnez la propriété AutoPopup du menu flottant à True. Dans ce cas, la position d'affichage du menu dépend de la valeur de la propriété Alignment. Les valeurs possibles de cette propriété sont représentées par les constantes suivantes :

- paLeft l'angle supérieur gauche du menu surgissant est positionné sous le curseur de la souris. c'est la valeur par défaut ;

- paCenter le milieu du bord supérieur du menu surgissant est positionné sous le curseur de la souris ;

- paRight l'angle supérieur droit du menu surgissant est positionné sous le curseur de la souris.

L'autre possibilité pour faire apparaître ce menu est d'utiliser la méthode Popup des menus surgissants. Cette méthode affiche le menu aux coordonnées spécifiées en pixels par les arguments X et Y.

À la différence des menus principaux, les menus surgissants possèdent un événement OnPopup. Cet événement est généré juste avant l'affichage du menu surgissant et permet ainsi de définir des traitements permettant de configurer le menu en fonction de l'environnement et du contexte (ajout ou suppression dynamique d'option dans le menu).