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).
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;
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;
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.
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.
För att faktiskt öppna standardwebbläsaren kan du använda egenskapen Value som en parameter för en ShellExecuteEx API-funktion.