Quando si lavora con menu o menu a comparsa nelle applicazioni Delphi, nella maggior parte degli scenari, si creano le voci di menu in fase di progettazione. Ogni voce di menu è rappresentata da una classe Delphi TMenuItem. Quando un utente seleziona (fa clic) un elemento, l'evento OnClick viene generato per te (come sviluppatore) per afferrare l'evento e rispondere ad esso.
Potrebbero verificarsi situazioni in cui gli elementi del menu non sono noti in fase di progettazione, ma devono essere aggiunti in fase di esecuzione (istanziati dinamicamente).
Supponiamo che esista un componente TPopupMenu chiamato "PopupMenu1" in un modulo Delphi, per aggiungere un elemento al menu popup è possibile scrivere un codice come:
var
menuItem: TMenuItem;
inizio
menuItem: = TMenuItem.Create (PopupMenu1);
menuItem.Caption: = 'Articolo aggiunto in' + TimeToStr (ora);
menuItem.OnClick: = PopupItemClick;
// assegnagli un valore intero personalizzato ...
menuItem.Tag: = GetTickCount;
PopupMenu1.Items.Add (menuItem);
fine;
procedura TMenuTestForm.PopupItemClick (Sender: TObject);
var
menuItem: TMenuItem;
inizio
altrimenti (Mittente è TMENUITEM) poi
inizio
ShowMessage ('Hm, se questo non è stato chiamato da Menu Click, chi l'ha chiamato ?!');
ShowMessage (Sender.ClassName);
Uscita;
fine;
menuItem: = TMenuItem (mittente);
ShowMessage (Format ('Cliccato su "% s", valore TAG:% d', [menuItem.Name, menuItem.Tag]));
fine;
Il metodo "PopupItemClick" controlla innanzitutto se il mittente è effettivamente un oggetto TMenuItem. Se il metodo viene eseguito come risultato di un gestore di eventi OnClick di una voce di menu, mostriamo semplicemente un messaggio di dialogo con il valore Tag assegnato quando la voce di menu è stata aggiunta al menu.
Nelle applicazioni del mondo reale, potresti / avresti bisogno di maggiore flessibilità. Supponiamo che ogni elemento "rappresenti" una pagina Web: per contenere l'URL della pagina Web sarebbe necessario un valore di stringa. Quando l'utente seleziona questa voce, è possibile aprire il browser Web predefinito e accedere all'URL assegnato con la voce di menu.
Ecco una classe TMenuItemExtended personalizzata dotata di una proprietà "Valore" stringa personalizzata:
genere
TMenuItemExtended = classe(TMENUITEM)
privato
fValue: corda;
pubblicato
proprietà Valore: stringa letta fValue Scrivi fValue;
fine;
Ecco come aggiungere questa voce di menu "estesa" a un PoupMenu1:
var
menuItemEx: TMenuItemExtended;
inizio
menuItemEx: = TMenuItemExtended.Create (PopupMenu1);
menuItemEx.Caption: = 'Esteso aggiunto a' + TimeToStr (ora);
menuItemEx.OnClick: = PopupItemClick;
// assegnagli un valore intero personalizzato ...
menuItemEx.Tag: = GetTickCount;
// questo può persino contenere un valore di stringa
menuItemEx.Value: = 'http://delphi.about.com';
PopupMenu1.Items.Add (menuItemEx);
fine;
Ora, "PopupItemClick" deve essere modificato per elaborare correttamente questa voce di menu:
procedura TMenuTestForm.PopupItemClick (Sender: TObject);
var
menuItem: TMenuItem;
inizio
//… come sopra
Se mittente è TMenuItemExtended poi
inizio
ShowMessage (Format ('Ohoho Extended item ... here "è il valore di stringa:% s', [TMenuItemExtended (Sender) .Value]));
fine;
fine;
È tutto. Sta a te estendere TMenuItemExtended secondo le tue esigenze. La creazione di componenti personalizzati di Delphi è dove cercare aiuto per la creazione di proprie classi / componenti.
Per aprire effettivamente il browser Web predefinito, è possibile utilizzare la proprietà Value come parametro per una funzione API ShellExecuteEx.