This site uses cookies own and third. If you continue to browse consider to accept the use of cookies. OK More Info.

Modificar tipo, estilo, tamaño de letra en TMenu y TPopUpMenu

  • 0 Replies
  • 3126 Views

0 Members and 1 Guest are viewing this topic.

Offline ANTRAX

  • *
  • Administrator
  • Posts: 5849
  • Actividad:
    66.67%
  • Country: ar
  • Reputación 43
  • ANTRAX
  • Twitter: @Underc0de
    • View Profile
    • Underc0de
    • Email
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

Code: (delphi) You are not allowed to view links. Register or Login
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

Code: (delphi) You are not allowed to view links. Register or Login
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; //<-- Aqui lo asignamos

  if vMenu.Count > 0 then
     for i := 0 to vMenu.Count -1 do
     CambiarFontMenus(vMenu.Items[i]); //<- Aplicamos una retroalimentación
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:

Code: (delphi) You are not allowed to view links. Register or Login
{......
   .....}
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.



« Last Edit: April 15, 2013, 11:26:09 pm by Expermicid »