Agregar elementos a un menú de TPopUp Delphi

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).

Agregar TMenuItem en tiempo de ejecución

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;

Notas

  • En el código anterior, se agrega un elemento al componente PopupMenu1. Tenga en cuenta que asignamos un valor entero al Etiqueta propiedad. La propiedad Tag (cada componente de Delphi la tiene) está diseñada para permitir que un desarrollador asigne un valor entero arbitrario almacenado como parte del componente.
  • los GetTickCount La función API recupera la cantidad de milisegundos que han transcurrido desde que se inició Windows.
  • Para el controlador de eventos OnClick, asignamos "PopupItemClick" - el nombre de la función con la firma * correcta *.
 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;

Importante

  • Cuando se hace clic en un elemento agregado dinámicamente, se ejecutará el "PopupItemClick". Para diferenciar entre uno o más elementos agregados en tiempo de ejecución (todos ejecutando el código en PopupItemClick) podemos usar el parámetro Remitente:

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ú.

TMenuItem de cadena personalizada

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.

Nota

Para abrir realmente el navegador web predeterminado, puede usar la propiedad Value como parámetro para una función de API ShellExecuteEx.