Al trabajar con menús o menús emergentes en aplicaciones Delphi, en la mayoría de los escenarios, crea los elementos del menú en tiempo de diseño. Cada elemento del menú está representado por una clase TMenuItem Delphi. Cuando un usuario selecciona (hace clic) un elemento, se activa el evento OnClick para que usted (como desarrollador) tome el evento y responda a él..
Puede haber situaciones en las que los elementos del menú no se conocen en tiempo de diseño, pero deben agregarse en tiempo de ejecución (instanciados dinámicamente).
Supongamos que hay un componente TPopupMenu llamado "PopupMenu1" en un formulario de Delphi, para agregar un elemento al menú emergente, podría escribir un fragmento de código como:
var
menuItem: TMenuItem;
empezar
menuItem: = TMenuItem.Create (PopupMenu1);
menuItem.Caption: = 'Elemento agregado en' + TimeToStr (ahora);
menuItem.OnClick: = PopupItemClick;
// asignarle un valor entero personalizado ...
menuItem.Tag: = GetTickCount;
PopupMenu1.Items.Add (menuItem);
final;
procedimiento TMenuTestForm.PopupItemClick (Remitente: TObject);
var
menuItem: TMenuItem;
empezar
si no (Remitente es TMenuItem) luego
empezar
ShowMessage ('Hm, si esto no fue llamado por Menu Click, ¿quién lo llamó ?!');
ShowMessage (Sender.ClassName);
salida;
final;
menuItem: = TMenuItem (remitente);
ShowMessage (Formato ('Ha hecho clic en "% s", valor de TAG:% d', [menuItem.Name, menuItem.Tag]));
final;
El método "PopupItemClick" primero comprueba si el remitente es realmente un objeto TMenuItem. Si el método se ejecuta como resultado de un controlador de eventos OnClick del elemento de menú, simplemente mostramos un mensaje de diálogo con el valor de etiqueta asignado cuando el elemento de menú se agregó al menú.
En aplicaciones del mundo real, es posible que necesite / necesite más flexibilidad. Digamos que cada elemento "representará" una página web; se requeriría un valor de cadena para contener la URL de la página web. Cuando el usuario selecciona este elemento, puede abrir el navegador web predeterminado y navegar a la URL asignada con el elemento del menú.
Aquí hay una clase personalizada TMenuItemExtended equipada con una propiedad personalizada de "Valor" de cadena:
tipo
TMenuItemExtended = clase(TMenuItem)
privado
Valor: cuerda;
publicado
propiedad Valor: cadena de lectura fValor escribir Valor;
final;
Aquí le mostramos cómo agregar este elemento de menú "extendido" a un PoupMenu1:
var
menuItemEx: TMenuItemExtended;
empezar
menuItemEx: = TMenuItemExtended.Create (PopupMenu1);
menuItemEx.Caption: = 'Extendido agregado en' + TimeToStr (ahora);
menuItemEx.OnClick: = PopupItemClick;
// asignarle un valor entero personalizado ...
menuItemEx.Tag: = GetTickCount;
// este incluso puede contener un valor de cadena
menuItemEx.Value: = 'http://delphi.about.com';
PopupMenu1.Items.Add (menuItemEx);
final;
Ahora, el "PopupItemClick" debe modificarse para procesar correctamente este elemento del menú:
procedimiento TMenuTestForm.PopupItemClick (Remitente: TObject);
var
menuItem: TMenuItem;
empezar
//… lo mismo que arriba
Si remitente es TMenuItemExtended luego
empezar
ShowMessage (Format ('Ohoho Extended item ... here "s el valor de la cadena:% s', [TMenuItemExtended (Sender) .Value]));
final;
final;
Eso es todo. Depende de usted extender TMenuItemExtended según sus necesidades. Crear componentes personalizados de Delphi es donde buscar ayuda para crear sus propias clases / componentes.
Para abrir realmente el navegador web predeterminado, puede usar la propiedad Value como parámetro para una función de API ShellExecuteEx.