Para implementar un menú de opciones en la barra superior del formulario Delphi nos provee una clase llamada TMainMenu.
Este control tiene una filosofía distinta en el manejo a los otros controles que hemos visto hasta ahora (TButton, TLabel etc.)
Cuando uno arrastra un objeto de la clase TMainMenu en el formulario aparece un cuadrado y no se despliega por ejemplo el menú:
Este tipo de controles generalmente tienen un diálogo para configurar sus propiedades, podemos acceder a dicho diálogo seleccionando la opción Items o haciendo doble clic sobre el objeto MainMenu1 en el mismo formulario. Vemos que aparece un formulario donde podemos ir ingresando cada una de las opciones de nuestro menú:
Cada opción que agregamos al objeto MainMenu1 se trata de un objeto de la clase TMenuItem.
El código fuente de la Unit1.pas refleja cada una de las opciones agregadas:
type TForm1 = class(TForm) MainMenu1: TMainMenu; Colores1: TMenuItem; Rojo1: TMenuItem; Verde1: TMenuItem; Azul1: TMenuItem; private { Private declarations } public { Public declarations } end;
La clase TMenuItem tiene el evento principal OnClick que se dispara cuando el operador selecciona dicha opción en tiempo de ejecución. Modificaremos el programa propuesto para que pinte el fondo del formulario de color rojo, verde o azul según a opción seleccionada.
Debemos abrir nuevamente el editor de menú del MainMenu1 e ir seleccionando cada MenuItem y asociar el evento OnClick:
Luego el programa completo que cambia el color de fondo según la opción del menú seleccionada es:
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus; type TForm1 = class(TForm) MainMenu1: TMainMenu; Colores1: TMenuItem; Rojo1: TMenuItem; Verde1: TMenuItem; Azul1: TMenuItem; procedure Rojo1Click(Sender: TObject); procedure Verde1Click(Sender: TObject); procedure Azul1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Azul1Click(Sender: TObject); begin Color := ClBlue; end; procedure TForm1.Rojo1Click(Sender: TObject); begin Color := ClRed; end; procedure TForm1.Verde1Click(Sender: TObject); begin Color := ClGreen; end; end.
Crear un menú desplegable que muestre dos opciones que desplieguen otros submenus similar a:
Para crear un submenú debemos presionar el botón derecho del mouse sobre un MenuItem y luego seleccionar lo opción "Create Submenu":
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus; type TForm1 = class(TForm) MainMenu1: TMainMenu; Opciones1: TMenuItem; Colores1: TMenuItem; amao1: TMenuItem; Rojo1: TMenuItem; Verde1: TMenuItem; Azul1: TMenuItem; procedure Rojo1Click(Sender: TObject); procedure Verde1Click(Sender: TObject); procedure Azul1Click(Sender: TObject); procedure amao1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.amao1Click(Sender: TObject); begin Close; end; procedure TForm1.Azul1Click(Sender: TObject); begin Color := ClBlue; end; procedure TForm1.Rojo1Click(Sender: TObject); begin Color := ClRed; end; procedure TForm1.Verde1Click(Sender: TObject); begin Color := ClGreen; end; end.
Cuando se llama el método Close se cierra el programa ya que tenemos un único formulario:
procedure TForm1.amao1Click(Sender: TObject); begin Close; end;
La clase TMenuItem tiene una serie de propiedades que nos permiten configurar cada opción.