Lägg till objekt i en TPopUp Delphi-meny

När du arbetar med menyer eller PopUp-menyer i Delphi-applikationer skapar du i de flesta scenarier menyalternativen vid designtid. Varje menyalternativ representeras av en TMenuItem Delphi-klass. När en användare väljer (klickar) ett objekt avfyras OnClick-händelsen för dig (som utvecklare) för att ta tag i händelsen och svara på den.

Det kan finnas situationer när artiklarna i menyn inte är kända vid designtid, men måste läggas till vid körning (dynamiskt instanserad).

Lägg till TMenuItem vid körning

Anta att det finns en TPopupMenu-komponent som heter "PopupMenu1" på ett Delphi-formulär, för att lägga till ett objekt i popup-menyn kan du skriva en kod som:

 var
   menuItem: TMenuItem;
Börja
  menuItem: = TMenuItem.Create (PopupMenu1);
  menuItem.Caption: = 'Objekt tillagd på' + TimeToStr (nu);
  menuItem.OnClick: = PopupItemClick;
  // tilldela det ett anpassat heltalvärde ...
  menuItem.Tag: = GetTickCount;
  PopupMenu1.Items.Add (menuItem);
slutet;

anteckningar

  • I ovanstående kod läggs ett objekt till i PopupMenu1-komponenten. Observera att vi tilldelade ett heltal till Märka fast egendom. Egenskapen Tag (varje Delphi-komponent har den) är utformad så att en utvecklare kan tilldela ett godtyckligt heltal som är lagrat som en del av komponenten.
  • De GetTickCount API-funktionen hämtar antalet millisekunder som har gått sedan Windows startades.
  • För händelseshanteraren OnClick tilldelade vi "PopupItemClick" - namnet på funktionen med * rätt * signatur.
 procedur TMenuTestForm.PopupItemClick (avsändare: TObject);
var
   menuItem: TMenuItem;
Börja
   om inte (Avsändare är TMenuItem) sedan
   Börja
     ShowMessage ('Hm, om detta inte kallades av Meny Klicka, vem kallade detta ?!');
     ShowMessage (Avsändare.Klassnamn);
     utgång;
   slutet;
   menuItem: = TMenuItem (avsändare);
   ShowMessage (Format ('Klicka på "% s", TAG-värde:% d', [menuItem.Name, menuItem.Tag]));
slutet;

Viktig

  • När du klickar på ett dynamiskt tillagd objekt kommer "PopupItemClick" att köras. För att skilja mellan en eller flera tillagda objekt med körtid (alla som kör koden i PopupItemClick) kan vi använda avsändarparametern:

Metoden "PopupItemClick" kontrollerar först om avsändaren faktiskt är ett TMenuItem-objekt. Om metoden körs som ett resultat av ett menyalternativ OnClick-händelseshanterare visar vi helt enkelt ett dialogmeddelande med taggvärdet tilldelat när menyalternativet lades till menyn.

Anpassad string-in TMenuItem

I verkliga applikationer kanske behöver du mer flexibilitet. Låt oss säga att varje objekt "representerar" en webbsida - ett strängvärde skulle krävas för att hålla webbsidans URL. När användaren väljer detta objekt kan du öppna standardwebbläsaren och navigera till den URL som tilldelats med menyalternativet.

Här är en anpassad TMenuItemExtended-klass utrustad med en anpassad sträng "Value" -egenskap:

 typ
  TMenuItemExtended = klass(TMenuItem)
  privat
    fValue: sträng;
  publicerat
    fast egendom Värde: sträng läst fValue skriva fValue;
  slutet;

Så här lägger du till detta "utökade" menyalternativ till en PoupMenu1:

 var
   menuItemEx: TMenuItemExtended;
Börja
   menuItemEx: = TMenuItemExtended.Create (PopupMenu1);
   menuItemEx.Caption: = 'Utökad tillagd på' + TimeToStr (nu);
   menuItemEx.OnClick: = PopupItemClick;
   // tilldela det ett anpassat heltalvärde ...
   menuItemEx.Tag: = GetTickCount;
   // den här kan till och med innehålla ett strängvärde
   menuItemEx.Value: = 'http://delphi.about.com';
   PopupMenu1.Items.Add (menuItemEx);
slutet;

Nu måste "PopupItemClick" ändras för att behandla detta menyalternativ på rätt sätt:

 procedur TMenuTestForm.PopupItemClick (avsändare: TObject);
var
   menuItem: TMenuItem;
Börja
   //… samma som ovan
   om avsändare är TMenuItemExtended sedan
   Börja
     ShowMessage (Format ('Ohoho Utökat objekt ... här' s strängvärdet:% s ', [TMenuItemExtended (avsändare) .värde]));
   slutet;
slutet;

Det är allt. Det är upp till dig att utöka TMenuItemExtended enligt dina behov. Att skapa anpassade Delphi-komponenter är där man kan leta efter hjälp med att skapa egna klasser / komponenter.

Notera

För att faktiskt öppna standardwebbläsaren kan du använda egenskapen Value som en parameter för en ShellExecuteEx API-funktion.