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.

1. 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 menu 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.

Image non disponible

1.1. Le concepteur de menus et options de menus

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

Image non disponible

Chaque fois qu'un item est ajouté, Dephi propose un emplacement vierge pour insérer une nouvelle option à droite dans le barre de menu 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 utiliser la touche INS.

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

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

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

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

1.1.1. Mettre à jour les propriétés des options

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

Image non disponible

Le libellé de l'option est contenu dans le propriété Caption. Il est possible de 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 atribut 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

1.1.2. Options et sous options de menus

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

Image non disponible

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

 
Sélectionnez
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'objet mais peuvent être utilisées dans le code.

1.1.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, positionner 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 ces items.

1.1.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.

1.1.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'objet est associée à une liste déroulante contenant l'ensemble des combinaisons de touches pouvant être utilisées. Une fois définie, cette combianison de touche 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ère (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 :

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

1.2. L'ajout, l'insertion et la suppression dynamique d'options de menus

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

exemple :

 
Sélectionnez
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 :

 
Sélectionnez
mnu_opt.Insert(0,mon_item);
				

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

exemple :

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

2. 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

 
Sélectionnez
mnu_option.Checked := not(mnu_option.Checked);
			

3. 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é à 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.

3.1. 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.

 
Sélectionnez
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 :

 
Sélectionnez
Unmerge(Menu : TMainMenu);
				

4. 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.

Image non disponible

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

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

Image non disponible

Pour que le menu surgissant apparaisse lorsque l'utilisateur clique sur le bouton droit de la souris sur la fiche ou le composant associé, positionner 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.

A la différence des menus principaux, les menus surgissant 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).