Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros temas > Trucos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Los mejores trucos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-12-2008
Avatar de casacham
casacham casacham is offline
Miembro
 
Registrado: abr 2006
Ubicación: Cordoba->Argentina. Arboleas->Almeria->España
Posts: 181
Poder: 12
casacham Va por buen camino
Modificar tipo, estilo, tamaño de letra en TMenu y TPopUpMenu

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; //<-- 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
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.
Responder Con Cita
  #2  
Antiguo 10-12-2009
ledesmarc ledesmarc is offline
Miembro
 
Registrado: jun 2008
Posts: 24
Poder: 0
ledesmarc Va por buen camino
Dr Chamale: En Delphi 2007 probe el ejemplo con un TMenuItem pero no funciona, los cambios no se aplican a los items del menu, o acaso hay que modificar algo para el caso de los TMEnuItem porque en el ejemplo de uso veo que es un PopupMenu

Gracias
Saludos
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 16:26:23.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi