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).
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;
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;
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..
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.
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.