Adăugați elemente într-un meniu TPopUp Delphi

Când lucrați cu meniuri sau meniuri PopUp în aplicațiile Delphi, în majoritatea scenariilor, creați elementele de meniu la timpul de proiectare. Fiecare element de meniu este reprezentat de o clasă TMenuItem Delphi. Când un utilizator selectează (face clic) pe un element, evenimentul OnClick este tras pentru ca dvs. (ca dezvoltator) să preiați evenimentul și să răspundă la acesta.

Pot exista situații în care elementele din meniu nu sunt cunoscute la momentul proiectării, dar trebuie adăugate la timpul de execuție (instantaneu dinamic).

Adăugați TMenuItem la timpul de execuție

Să presupunem că există o componentă TPopupMenu numită "PopupMenu1" pe un formular Delphi, pentru a adăuga un element în meniul pop-up, puteți scrie o bucată de cod ca:

 var
   menuItem: TMenuItem;
începe
  menuItem: = TMenuItem.Create (PopupMenu1);
  menuItem.Caption: = 'Element adăugat la' + TimeToStr (acum);
  menuItem.OnClick: = PopupItemClick;
  // atribuiți-i o valoare integrală personalizată ...
  menuItem.Tag: = GetTickCount;
  PopupMenu1.Items.Add (meniul Item);
Sfârșit;

notițe

  • În codul de mai sus, un element este adăugat la componenta PopupMenu1. Rețineți că am atribuit o valoare întreagă la Etichetă proprietate. Proprietatea Tag (fiecare componentă Delphi o are) este proiectată pentru a permite dezvoltatorului să atribuie o valoare integră arbitrară stocată ca parte a componentei.
  • GetTickCount Funcția API preia numărul de milisecunde care s-au scurs de la lansarea Windows.
  • Pentru gestionarea evenimentelor OnClick, am atribuit „PopupItemClick” - numele funcției cu semnătura * corect *.
 procedură TMenuTestForm.PopupItemClick (Expeditor: TObject);
var
   menuItem: TMenuItem;
începe
   dacă nu (Expeditor este TMenuItem) apoi
   începe
     ShowMessage ('Hm, dacă acest lucru nu a fost apelat de Menu Click, cine a sunat asta ?!');
     ShowMessage (Sender.ClassName);
     Ieșire;
   Sfârșit;
   menuItem: = TMenuItem (expeditor);
   ShowMessage (Format ('Faceți clic pe "% s", valoarea TAG:% d', [menuItem.Name, menuItem.Tag]));
Sfârșit;

Important

  • Când faceți clic pe un element adăugat dinamic, „PopupItemClick” va fi executat. Pentru a diferenția între unul sau mai multe articole adăugate în timp de rulare (toate care execută codul în PopupItemClick), putem utiliza parametrul Sender:

Metoda „PopupItemClick” verifică mai întâi dacă Expeditorul este de fapt un obiect TMenuItem. Dacă metoda este executată ca urmare a unui element de meniu Manipulator de eveniment OnClick, arătăm pur și simplu un mesaj de dialog cu valoarea Tag care este atribuită atunci când elementul de meniu a fost adăugat în meniu.

String personalizat TMenuItem

În aplicațiile din lumea reală, este posibil / aveți nevoie de mai multă flexibilitate. Să spunem că fiecare articol va „reprezenta” o pagină web - o valoare de șir ar fi necesară pentru a deține adresa URL a paginii web. Când utilizatorul selectează acest element, puteți deschide browserul web implicit și puteți naviga la adresa URL atribuită cu elementul de meniu.

Iată o clasă personalizată TMenuItemExtended echipată cu un șir personalizat „Valoare” proprietate:

 tip
  TMenuItemExtended = clasă(TMenuItem)
  privat
    fValue: şir;
  publicat
    proprietate Valoare: șir citit fValue scrie fValue;
  Sfârșit;

Iată cum puteți adăuga acest element de meniu „extins” la un PoupMenu1:

 var
   menuItemEx: TMenuItemExtended;
începe
   menuItemEx: = TMenuItemExtended.Create (PopupMenu1);
   menuItemEx.Caption: = 'Extins adăugat la' + TimeToStr (acum);
   menuItemEx.OnClick: = PopupItemClick;
   // atribuiți-i o valoare integrală personalizată ...
   menuItemEx.Tag: = GetTickCount;
   // acesta poate păstra chiar și o valoare de șir
   menuItemEx.Value: = 'http://delphi.about.com';
   PopupMenu1.Items.Add (meniulItemEx);
Sfârșit;

Acum, „PopupItemClick” trebuie modificat pentru a procesa corect acest element de meniu:

 procedură TMenuTestForm.PopupItemClick (Expeditor: TObject);
var
   menuItem: TMenuItem;
începe
   //… la fel ca mai sus
   dacă expeditor este TMenuItemExtended apoi
   începe
     ShowMessage (Format ('Elogiu extins Ohoho ... aici este valoarea șirului:% s', [TMenuItemExtended (Expeditor). Valoare]));
   Sfârșit;
Sfârșit;

Asta e tot. Depinde de dvs. să extindeți TMenuItemExtended conform nevoilor dvs. Crearea de componente Delphi personalizate este locul de căutare a ajutorului pentru crearea propriilor clase / componente.

Notă

Pentru a deschide de fapt browserul Web implicit, puteți utiliza proprietatea Value ca parametru pentru o funcție API ShellExecuteEx.