Items toevoegen aan een TPopUp Delphi-menu

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

TMenuItem toevoegen tijdens runtime

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;

Notes

  • In de bovenstaande code wordt één item toegevoegd aan de component PopupMenu1. Merk op dat we een geheel getal hebben toegewezen aan de Label eigendom. De eigenschap Tag (elke component van Delphi heeft deze) is ontworpen om een ​​ontwikkelaar in staat te stellen een willekeurige gehele waarde toe te wijzen die is opgeslagen als onderdeel van de component.
  • De GetTickCount API-functie haalt het aantal milliseconden op dat is verstreken sinds Windows is gestart.
  • Voor de OnClick-gebeurtenishandler hebben we "PopupItemClick" toegewezen - de naam van de functie met de * correcte * handtekening.
 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;

Belangrijk

  • Wanneer op een dynamisch toegevoegd item wordt geklikt, wordt de "PopupItemClick" uitgevoerd. Om onderscheid te kunnen maken tussen een of meer items die tijdens runtime zijn toegevoegd (alle code in PopupItemClick uitvoeren), kunnen we de parameter Sender gebruiken:

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.

Aangepast String-In TMenuItem

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.

Notitie

Om de standaardwebbrowser daadwerkelijk te openen, kunt u de eigenschap Value gebruiken als parameter voor een ShellExecuteEx API-functie.