Este truco sirve como dice el titulo para modificar las propiedades TFont de los items de un menu. Cuantas veces ocurre que la letra es muy chica o el tipo de letra no es el deseado y estos objetos no traen la propiedad Font visible en el Inspector de objetos. Antes de continuar debo aclarar que la autoria de este truco no es propia, pero tampoco recuerdo quien es el autor del codigo fuente. ¿Entonces que es lo nuevo?. Bien, lo interesante es que transforme el codigo en un objeto para que pueda ser utilizado sin tener que andar repitiendolo en cada nuevo proyecto en el que uno desee utilizar un Menu personalizado (customized). Por ultimo, antes de describir los pasos para realizarlo, debo decir que a los programadores avanzados esto pueda resultarle algo arcaico, pero a los novatos puede servirles inclusive como una introduccion para aprender a desarrollar objetos propios. La idea es reutilizar herramientas que vamos conociendo a medida que desarrollamos aplicaciones.
DESCRIPCION Paso a Paso
(1): Debes tener una aplicacion que posea un objeto TMenu o TPopUpMenu en algun TForm de la misma.
(2): Crea una nueva UNIT en tu aplicacion de la siguiente manera. En el menu de delphi elige: File -> New -> Unit - Delphi for Win32. Veras el siguiente encabezado:
El nombre "Unit2" puede cambiar dependiendo de las (n) units que posea tu aplicacion
Código Delphi
[-]
unit Unit2;
interface
implementation
end.
(3): Ahora debes guardar la Unit, y puedes colocarle en nombre que te sugiero aqui
"GlobalFunction" o el que desees, pero recuerda que el nombre que le coloques es el que va ser utilizado para la clausula
USES en los demas TForm de tu aplicacion.
(4): MANOS a la obra, vamos a ver como queda el codigo escrito en esta
UNIT
Código Delphi
[-]
unit GlobalFunction;
interface
uses
Windows, SysUtils, Classes, Forms, Math, Dialogs,
Controls, Menus, Graphics;
Type
TCambiarLetraMenu = class (TObject)
private
protected
procedure CambiarFontMenus(vMenu :TMenuItem; Indice :Integer = 0);
procedure CambiarFuenteTMenu(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Selected: Boolean);
public
constructor Create(ItemMenu: TMenuItem; Letra:TFont);
procedure Cambiar;
end;
Var
PVMenu : TMenuItem;
PVLetra: TFont;
implementation
constructor TCambiarLetraMenu.Create(ItemMenu: TMenuItem; Letra:TFont);
begin
PVLetra:= TFont.Create;
PVMenu := ItemMenu;
PVLetra.Assign(Letra);
end;
procedure TCambiarLetraMenu.Cambiar;
begin
CambiarFontMenus(PVMenu);
end;
procedure TCambiarLetraMenu.CambiarFontMenus(vMenu :TMenuItem; Indice :Integer = 0);
var
i :Integer;
begin
if vMenu.MenuIndex <> -1 then
vMenu.OnDrawItem := CambiarFuenteTMenu;
if vMenu.Count > 0 then
for i := 0 to vMenu.Count -1 do
CambiarFontMenus(vMenu.Items[i]); end;
procedure TCambiarLetraMenu.CambiarFuenteTMenu(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Selected: Boolean);
begin
ACanvas.Font.Assign(PVLetra);
ACanvas.TextRect(ARect, ARect.Left, ARect.Top, StringReplace(TMenuItem(Sender).Caption,'&', '', []));
end;
end.
Una vez creado o copiado el codigo que acabo de describir debemos guardar la unit. A continuacion como se utiliza este nuevo objeto. Aclaraciones: Este objeto no forma parte de la VCL, por lo tanto no vamos a intentar agregarlo a la paleta de objetos, es un derivado de TObject muy sencillo con una sola función especifica, que es cambiar el tipo de letra de los items de los menues de nuestra aplicacion. La idea es que esta unit la podamos importar en otro proyecto y esten disponibles sus funciones, objetos, procedimientos, etc... para no tener que escribirlos de nuevo, ademas permite ir mejorando el codigo a medida que lo utilizamos. Le di el nombre
GlobalFunction porque en mi proyecto original tiene otras funciones y procedimientos, etc.
COMO utilizar el objeto
(1): En el TForm que tengamos nuesto TMenu o TPopUpMenu colocamos en la clausula
Uses una referencia a nuestra unit, es decir colocamos el nombre de la unit, en mi caso
GlobalFunction;
(2): En el evento
OnCreate colocamos el siguiente codigo
Código Delphi
[-]
uses GlobalFunction;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
Var
CHFontMenu : TCambiarLetraMenu;
EstiloLetra: TFont;
begin
EstiloLetra:= TFont.Create;
EstiloLetra.Name :='Tahoma';
EstiloLetra.Size :=10;
EstiloLetra.Style:=[fsBold];
CHFontMenu:= TCambiarLetraMenu.Create(Self.PopupMenu1.Items, EstiloLetra);
CHFontMenu.Cambiar;
CHFontMenu.Free;
EstiloLetra.Free;
end;
¿Que es lo que hace este codigo?
El evento
OnCreate es utilizado para que el cambio de tipo de letra se produzca al iniciar nuestra aplicacion. Podriamos utilizar otro evento para ejecutar este codigo como por ejemplo un boton con
OnClick event.
Se crea una instancia de TFont y otra de de
TCambiarLetraMenu que es el nombre de nuestro objeto
Luego asignamos las caracteristicas que deseamos que se vean en los items de los menus en la instancia
EstiloLetra de TFont.
Cuando creamos la instancia de
TCambiarLetraMenu en su construccion le pasamos como variables el menu que deseamos modificar y porsupuesto con las caracteristicas de letras ya asignadas en
EstiloLetra
Luego ejecutamos el cambio en la linea
CHFontMenu.Cambiar;. Recordemos que
CHFontMenu es una instancia de
TCambiarLetraMenu.
Espero que esto le sea util a alguien, y si desean modificar, sugerir o simplemente comentar el truco deben hacerlo por esta via para que sea
publico y nos sirva a todos.