Wanneer u in de meeste scenario's met menu's of PopUp-menu's in Delphi-toepassingen werkt, maakt u de menu-items tijdens het ontwerp. Elk menu-item wordt vertegenwoordigd door een TMenuItem Delphi-klasse. Wanneer een gebruiker een item selecteert (klikt), wordt het OnClick-evenement voor u (als ontwikkelaar) geactiveerd om het evenement te pakken en erop te reageren.
Er kunnen situaties zijn waarin de items van het menu niet bekend zijn tijdens het ontwerp, maar tijdens runtime moeten worden toegevoegd (dynamisch geïnstantieerd).
Stel dat er een TPopupMenu-component wordt genoemd "PopupMenu1" op een Delphi-formulier, om een item aan het pop-upmenu toe te voegen, kunt u een stukje code schrijven als:
var
menuItem: TMenuItem;
beginnen
menuItem: = TMenuItem.Create (PopupMenu1);
menuItem.Caption: = 'Item toegevoegd om' + TimeToStr (nu);
menuItem.OnClick: = PopupItemClick;
// wijs een aangepaste integerwaarde toe ...
menuItem.Tag: = GetTickCount;
PopupMenu1.Items.Add (menuItem);
einde;
procedure TMenuTestForm.PopupItemClick (Sender: TObject);
var
menuItem: TMenuItem;
beginnen
als niet (Afzender is TMenuItem) vervolgens
beginnen
ShowMessage ('Hm, als dit niet werd aangeroepen door Menu Click, wie noemde dit ?!');
ShowMessage (Sender.ClassName);
Uitgang;
einde;
menuItem: = TMenuItem (afzender);
ShowMessage (Formaat ('Geklikt op "% s", TAG-waarde:% d', [menuItem.Name, menuItem.Tag]));
einde;
De methode "PopupItemClick" controleert eerst of de afzender daadwerkelijk een TMenuItem-object is. Als de methode wordt uitgevoerd als gevolg van een OnClick-gebeurtenishandler van het menu-item, tonen we eenvoudig een dialoogvensterbericht met de Tag-waarde die wordt toegewezen toen het menu-item aan het menu werd toegevoegd.
In praktijktoepassingen heeft u wellicht meer flexibiliteit nodig. Laten we zeggen dat elk item een webpagina zal "vertegenwoordigen" - een stringwaarde zou vereist zijn om de URL van de webpagina te bevatten. Wanneer de gebruiker dit item selecteert, kunt u de standaardwebbrowser openen en naar de URL navigeren die aan het menu-item is toegewezen.
Hier is een aangepaste klasse TMenuItemExtended uitgerust met een aangepaste tekenreeks "Waarde":
type
TMenuItemExtended = klasse(TMenuItem)
privaat
fValue: draad;
gepubliceerd
eigendom Waarde : tekenreeks lezen fValue schrijven fValue;
einde;
Zo voegt u dit "uitgebreide" menu-item toe aan een PoupMenu1:
var
menuItemEx: TMenuItemExtended;
beginnen
menuItemEx: = TMenuItemExtended.Create (PopupMenu1);
menuItemEx.Caption: = 'Extended toegevoegd om' + TimeToStr (nu);
menuItemEx.OnClick: = PopupItemClick;
// wijs een aangepaste integerwaarde toe ...
menuItemEx.Tag: = GetTickCount;
// deze kan zelfs een stringwaarde bevatten
menuItemEx.Value: = 'http://delphi.about.com';
PopupMenu1.Items.Add (menuItemEx);
einde;
Nu moet de "PopupItemClick" worden aangepast om dit menu-item correct te kunnen verwerken:
procedure TMenuTestForm.PopupItemClick (Sender: TObject);
var
menuItem: TMenuItem;
beginnen
//… hetzelfde als hierboven
als afzender is TMenuItemExtended vervolgens
beginnen
ShowMessage (Format ('Ohoho Extended-item ... hier is de stringwaarde:% s', [TMenuItemExtended (Sender) .Value]));
einde;
einde;
Dat is alles. Het is aan u om het TMenuItemExtended uit te breiden volgens uw behoeften. Het maken van aangepaste Delphi-componenten is waar u hulp kunt zoeken bij het maken van uw eigen klassen / componenten.
Om de standaardwebbrowser daadwerkelijk te openen, kunt u de eigenschap Value gebruiken als parameter voor een ShellExecuteEx API-functie.