Ajouter des éléments à un menu Delphi TPopUp

Lorsque vous travaillez avec des menus ou des menus contextuels dans des applications Delphi, dans la plupart des scénarios, vous créez les éléments de menu au moment du design. Chaque élément de menu est représenté par une classe Delphi TMenuItem. Lorsqu'un utilisateur sélectionne (clique) sur un élément, l'événement OnClick est déclenché pour vous (en tant que développeur) pour saisir l'événement et y répondre.

Il peut y avoir des situations où les éléments du menu ne sont pas connus au moment de la conception, mais doivent être ajoutés au moment de l'exécution (instanciés dynamiquement).

Ajouter TMenuItem au moment de l'exécution

Supposons qu'il existe un composant TPopupMenu nommé "PopupMenu1" sur un formulaire Delphi, pour ajouter un élément au menu contextuel, vous pouvez écrire un morceau de code sous la forme:

 var
   menuItem: TMenuItem;
commencer
  menuItem: = TMenuItem.Create (PopupMenu1);
  menuItem.Caption: = 'Élément ajouté à' + TimeToStr (maintenant);
  menuItem.OnClick: = PopupItemClick;
  // lui attribuer une valeur entière personnalisée ...
  menuItem.Tag: = GetTickCount;
  PopupMenu1.Items.Add (menuItem);
fin;

Remarques

  • Dans le code ci-dessus, un élément est ajouté au composant PopupMenu1. Notez que nous avons attribué une valeur entière au Étiquette propriété. La propriété Tag (chaque composant Delphi en possède) est conçue pour permettre à un développeur d'attribuer une valeur entière arbitraire stockée dans le cadre du composant.
  • le GetTickCount La fonction API récupère le nombre de millisecondes qui se sont écoulées depuis le démarrage de Windows.
  • Pour le gestionnaire d'événements OnClick, nous avons attribué "PopupItemClick" - le nom de la fonction avec la signature * correcte *.
 procédure TMenuTestForm.PopupItemClick (Sender: TObject);
var
   menuItem: TMenuItem;
commencer
   si non (Expéditeur est TMenuItem) ensuite
   commencer
     ShowMessage ('Hm, si cela n'a pas été appelé par Menu Click, qui l'a appelé?!');
     ShowMessage (Sender.ClassName);
     sortie;
   fin;
   menuItem: = TMenuItem (expéditeur);
   ShowMessage (Format ('Cliquez sur "% s", valeur TAG:% d', [menuItem.Name, menuItem.Tag]));
fin;

Important

  • Lorsqu'un élément ajouté dynamiquement est cliqué, le "PopupItemClick" sera exécuté. Afin de différencier un ou plusieurs éléments ajoutés au moment de l'exécution (tous exécutant le code dans PopupItemClick), nous pouvons utiliser le paramètre Sender:

La méthode "PopupItemClick" vérifie d'abord si l'expéditeur est réellement un objet TMenuItem. Si la méthode est exécutée à la suite d'un élément de menu Gestionnaire d'événements OnClick, nous affichons simplement un message de dialogue avec la valeur de balise attribuée lorsque l'élément de menu a été ajouté au menu..

Stringenu personnalisé TMenuItem

Dans les applications du monde réel, vous pourriez / auriez besoin de plus de flexibilité. Disons que chaque élément "représentera" une page Web - une valeur de chaîne serait requise pour contenir l'URL de la page Web. Lorsque l'utilisateur sélectionne cet élément, vous pouvez ouvrir le navigateur Web par défaut et accéder à l'URL attribuée avec l'élément de menu.

Voici une classe TMenuItemExtended personnalisée équipée d'une propriété "Value" de chaîne personnalisée:

 type
  TMenuItemExtended = classe(TMenuItem)
  privé
    fValeur: chaîne;
  publié
    propriété Valeur : lecture de chaîne fValue écrire fValue;
  fin;

Voici comment ajouter cet élément de menu «étendu» à un PoupMenu1:

 var
   menuItemEx: TMenuItemExtended;
commencer
   menuItemEx: = TMenuItemExtended.Create (PopupMenu1);
   menuItemEx.Caption: = 'Extended ajouté à' + TimeToStr (maintenant);
   menuItemEx.OnClick: = PopupItemClick;
   // lui attribuer une valeur entière personnalisée ...
   menuItemEx.Tag: = GetTickCount;
   // celui-ci peut même contenir une valeur de chaîne
   menuItemEx.Value: = 'http://delphi.about.com';
   PopupMenu1.Items.Add (menuItemEx);
fin;

Maintenant, le "PopupItemClick" doit être modifié pour traiter correctement cet élément de menu:

 procédure TMenuTestForm.PopupItemClick (Sender: TObject);
var
   menuItem: TMenuItem;
commencer
   //… comme ci-dessus
   si expéditeur est TMenuItemExtended ensuite
   commencer
     ShowMessage (Format ('Ohoho Extended item… here "s la valeur de chaîne:% s', [TMenuItemExtended (Sender) .Value]));
   fin;
fin;

C'est tout. C'est à vous d'étendre le TMenuItemExtended selon vos besoins. La création de composants Delphi personnalisés est l'endroit où chercher de l'aide pour créer vos propres classes / composants.

Remarque

Pour ouvrir réellement le navigateur Web par défaut, vous pouvez utiliser la propriété Value comme paramètre d'une fonction API ShellExecuteEx.