Hinzufügen von Elementen zu einem TPopUp Delphi-Menü

Wenn Sie in Delphi-Anwendungen mit Menüs oder PopUp-Menüs arbeiten, erstellen Sie die Menüelemente in den meisten Szenarien zur Entwurfszeit. Jedes Menüelement wird durch eine TMenuItem Delphi-Klasse dargestellt. Wenn ein Benutzer ein Element auswählt (klickt), wird das OnClick-Ereignis für Sie (als Entwickler) ausgelöst, um das Ereignis zu erfassen und darauf zu reagieren.

Es kann vorkommen, dass die Menüelemente zur Entwurfszeit nicht bekannt sind, jedoch zur Laufzeit hinzugefügt werden müssen (dynamisch instanziiert)..

Fügen Sie TMenuItem zur Laufzeit hinzu

Angenommen, es gibt eine TPopupMenu-Komponente mit dem Namen "PopupMenu1" Wenn Sie in einem Delphi-Formular ein Element zum Popup-Menü hinzufügen möchten, können Sie einen Code wie folgt eingeben:

 var
   menuItem: TMenuItem;
Start
  menuItem: = TMenuItem.Create (PopupMenu1);
  menuItem.Caption: = 'Artikel hinzugefügt um' + TimeToStr (jetzt);
  menuItem.OnClick: = PopupItemClick;
  // Weisen Sie ihm einen benutzerdefinierten ganzzahligen Wert zu ...
  menuItem.Tag: = GetTickCount;
  PopupMenu1.Items.Add (menuItem);
Ende;

Anmerkungen

  • Im obigen Code wird der PopupMenu1-Komponente ein Element hinzugefügt. Beachten Sie, dass wir dem einen ganzzahligen Wert zugewiesen haben Etikett Eigentum. Die Tag-Eigenschaft (jede Delphi-Komponente hat sie) soll es einem Entwickler ermöglichen, einen beliebigen ganzzahligen Wert zuzuweisen, der als Teil der Komponente gespeichert ist.
  • Das GetTickCount Die API-Funktion ermittelt die Anzahl der Millisekunden, die seit dem Start von Windows vergangen sind.
  • Für den OnClick-Ereignishandler haben wir "PopupItemClick" zugewiesen - den Namen der Funktion mit der * richtigen * Signatur.
 Verfahren TMenuTestForm.PopupItemClick (Absender: TObject);
var
   menuItem: TMenuItem;
Start
   wenn nicht (Absender ist TMenuItem) dann
   Start
     ShowMessage ('Hm, wenn dies nicht von Menu Click aufgerufen wurde, wer hat das aufgerufen ?!');
     ShowMessage (Sender.ClassName);
     Ausfahrt;
   Ende;
   menuItem: = TMenuItem (Absender);
   ShowMessage (Format ('Auf "% s" geklickt, TAG-Wert:% d', [menuItem.Name, menuItem.Tag]));
Ende;

Wichtig

  • Wenn ein dynamisch hinzugefügtes Element angeklickt wird, wird der "PopupItemClick" ausgeführt. Um zwischen einem oder mehreren zur Laufzeit hinzugefügten Elementen zu unterscheiden (alle, die den Code in PopupItemClick ausführen), können Sie den Parameter Sender verwenden:

Die Methode "PopupItemClick" prüft zunächst, ob der Sender tatsächlich ein TMenuItem-Objekt ist. Wenn die Methode als Ergebnis eines OnClick-Ereignishandlers für ein Menüelement ausgeführt wird, wird einfach eine Dialogmeldung mit dem Tag-Wert angezeigt, der zugewiesen wurde, als das Menüelement zum Menü hinzugefügt wurde.

Benutzerdefiniertes String-In TMenuItem

In realen Anwendungen benötigen Sie möglicherweise mehr Flexibilität. Nehmen wir an, dass jedes Element eine Webseite "darstellt" - ein Zeichenfolgenwert ist erforderlich, um die URL der Webseite zu speichern. Wenn der Benutzer dieses Element auswählt, können Sie den Standardwebbrowser öffnen und zu der mit dem Menüelement zugewiesenen URL navigieren.

Hier ist eine benutzerdefinierte TMenuItemExtended-Klasse, die mit einer benutzerdefinierten Zeichenfolgeneigenschaft "Value" ausgestattet ist:

 Art
  TMenuItemExtended = Klasse(TMenuItem)
  Privat
    fWert: Zeichenfolge;
  veröffentlicht
    Eigentum Wert : Zeichenfolge gelesen fWert schreiben fValue;
  Ende;

So fügen Sie dieses "erweiterte" Menüelement einem PoupMenu1 hinzu:

 var
   menuItemEx: TMenuItemExtended;
Start
   menuItemEx: = TMenuItemExtended.Create (PopupMenu1);
   menuItemEx.Caption: = 'Erweitert hinzugefügt um' + TimeToStr (jetzt);
   menuItemEx.OnClick: = PopupItemClick;
   // Weisen Sie ihm einen benutzerdefinierten ganzzahligen Wert zu ...
   menuItemEx.Tag: = GetTickCount;
   // Dieser kann sogar einen String-Wert enthalten
   menuItemEx.Value: = 'http://delphi.about.com';
   PopupMenu1.Items.Add (menuItemEx);
Ende;

Jetzt muss der "PopupItemClick" geändert werden, um diesen Menüpunkt richtig zu verarbeiten:

 Verfahren TMenuTestForm.PopupItemClick (Absender: TObject);
var
   menuItem: TMenuItem;
Start
   //… das gleiche wie oben
   wenn Absender ist TMenuItemExtended dann
   Start
     ShowMessage (Format ('Ohoho Extended item ... hier ist der Zeichenfolgenwert:% s', [TMenuItemExtended (Sender) .Value]));
   Ende;
Ende;

Das ist alles. Es liegt an Ihnen, TMenuItemExtended nach Ihren Wünschen zu erweitern. Wenn Sie benutzerdefinierte Delphi-Komponenten erstellen, suchen Sie nach Hilfe beim Erstellen Ihrer eigenen Klassen / Komponenten.

Hinweis

Um den Standardwebbrowser tatsächlich zu öffnen, können Sie die Value-Eigenschaft als Parameter für eine ShellExecuteEx-API-Funktion verwenden.