51 - VCL - controles Standard: TMainMenu

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

TMainMenu VCL Delphi

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

TMainMenu TMenuItem VCL Delphi

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:

TMainMenu TMenuItem VCL Delphi

Luego el programa completo que cambia el color de fondo según la opción del menú seleccionada es:

Proyecto169

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.

Problema

Crear un menú desplegable que muestre dos opciones que desplieguen otros submenus similar a:

TMainMenu TMenuItem VCL Delphi

Para crear un submenú debemos presionar el botón derecho del mouse sobre un MenuItem y luego seleccionar lo opción "Create Submenu":

TMainMenu TMenuItem VCL Delphi

Proyecto170

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;

Clase TMenuItem

La clase TMenuItem tiene una serie de propiedades que nos permiten configurar cada opción.

  • La propiedad Caption define el texto que muestra la opción.
  • La propiedad ShortCut nos permite definir un juego de teclas para disparar la opción:
    TMainMenu TMenuItem VCL Delphi
  • La propiedad Bitmap nos permite definir un archivo *.bmp que se mostrará junto a la opción:
    TMainMenu TMenuItem VCL Delphi
  • Si en la propiedad Caption cargamos el caracter '-' (caracter menor) luego aparece una línea separadora entre opciones:
    TMainMenu TMenuItem VCL Delphi