Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

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

  • 0 Respuestas
  • 2434 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Conectado ANTRAX

  • *
  • Administrator
  • Mensajes: 5499
  • Actividad:
    18.33%
  • Reputación 36
  • ANTRAX
    • Ver Perfil
    • Underc0de
    • Email
  • Skype: underc0de.org
  • Twitter: @Underc0de
« en: Febrero 24, 2010, 04:59:29 pm »
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
  1. unit Unit2;
  2.  
  3. interface
  4.  
  5. implementation
  6.  
  7. end.
  8.  

(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
  1. unit GlobalFunction;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, SysUtils, Classes, Forms, Math, Dialogs,
  7.   Controls, Menus, Graphics;
  8.  
  9. Type
  10.     TCambiarLetraMenu = class (TObject)
  11.     private
  12.       {.......}
  13.     protected
  14.       {.......}
  15.       procedure CambiarFontMenus(vMenu :TMenuItem; Indice :Integer = 0);
  16.       procedure CambiarFuenteTMenu(Sender: TObject; ACanvas: TCanvas;
  17.                                    ARect: TRect; Selected: Boolean);
  18.     public
  19.       {.......}
  20.       constructor Create(ItemMenu: TMenuItem; Letra:TFont);
  21.       procedure   Cambiar;
  22. end;
  23.   Var
  24.      PVMenu : TMenuItem;
  25.      PVLetra: TFont;
  26.  
  27. implementation
  28.  
  29. constructor TCambiarLetraMenu.Create(ItemMenu: TMenuItem; Letra:TFont);
  30. begin
  31.    PVLetra:= TFont.Create;
  32.    PVMenu := ItemMenu;
  33.    PVLetra.Assign(Letra);
  34. end;
  35.  
  36. procedure TCambiarLetraMenu.Cambiar;
  37. begin
  38.    CambiarFontMenus(PVMenu);
  39. end;
  40.  
  41. procedure TCambiarLetraMenu.CambiarFontMenus(vMenu :TMenuItem; Indice :Integer = 0);
  42. var
  43.   i :Integer;
  44. begin
  45.   if vMenu.MenuIndex <> -1 then
  46.      vMenu.OnDrawItem := CambiarFuenteTMenu; //<-- Aqui lo asignamos
  47.  
  48.   if vMenu.Count > 0 then
  49.      for i := 0 to vMenu.Count -1 do
  50.      CambiarFontMenus(vMenu.Items[i]); //<- Aplicamos una retroalimentación
  51. end;
  52.  
  53. procedure TCambiarLetraMenu.CambiarFuenteTMenu(Sender: TObject; ACanvas: TCanvas;
  54.                                                ARect: TRect; Selected: Boolean);
  55. begin
  56.   ACanvas.Font.Assign(PVLetra);
  57.   ACanvas.TextRect(ARect, ARect.Left, ARect.Top, StringReplace(TMenuItem(Sender).Caption,'&', '', []));
  58. end;
  59.  
  60. end.
  61.  

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
  1. {......
  2.    .....}
  3. uses  GlobalFunction;
  4.  
  5. {$R *.dfm}
  6.  
  7. procedure TForm1.FormCreate(Sender: TObject);
  8. Var
  9.    CHFontMenu : TCambiarLetraMenu;
  10.    EstiloLetra: TFont;
  11. begin
  12.   EstiloLetra:= TFont.Create;
  13.     EstiloLetra.Name :='Tahoma';
  14.     EstiloLetra.Size :=10;
  15.     EstiloLetra.Style:=[fsBold];
  16.   CHFontMenu:= TCambiarLetraMenu.Create(Self.PopupMenu1.Items, EstiloLetra);
  17.     CHFontMenu.Cambiar;
  18.   CHFontMenu.Free;
  19.   EstiloLetra.Free;
  20. end;
  21.  

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



« Última modificación: Abril 15, 2013, 11:26:09 pm por Expermicid »


 

¿Te gustó el post? COMPARTILO!