2012-05-14 16 views
20

¿Existe alguna manera rápida y efectiva de aplicar una fuente global para usar en un proyecto?Consistencia de fuentes en todo el proyecto?

Con esto quiero decir me gustaría establecer un nombre de fuente específica que todos los controles en mi proyecto utilizarán como TButton, TEdit, etc. TLabel

Normalmente Ajuste de la fuente para el formulario en lugar de una específica control cambiará todos los controles de ese formulario a la fuente especificada.

Hay un ligero problema con esto, sin embargo, si ha cambiado manualmente una fuente en un control específico, entonces al configurar la fuente mediante el formulario ya no se actualizarán los controles que se han cambiado previamente manualmente.

Idea 1

Yo estaba pensando en usar un bucle y la iteración a través de cada componente en mis formularios y ajuste de la fuente de esta manera, como por ejemplo:

procedure TForm1.FormCreate(Sender: TObject); 
var 
    i: Integer; 
begin 
    with TForm(Self) do 
    begin 
    for i := 0 to ComponentCount - 1 do 
    begin 
     if Components[i] is TButton then 
     begin 
     TButton(Components[i]).Font.Name := 'MS Sans Serif'; 
     TButton(Components[i]).Font.Size := 8; 
     TButton(Components[i]).Font.Style := [fsBold]; 
     end; 

     if Components[i] is TLabel then 
     begin 
     TLabel(Components[i]).Font.Name := 'MS Sans Serif'; 
     TLabel(Components[i]).Font.Size := 8; 
     TLabel(Components[i]).Font.Style := [fsBold]; 
     end; 
    end; 
    end; 
end; 

Pero haciendo esto parece muy desordenado, también será una cantidad considerable de código para una tarea simple.

Idea 2

Sé que podría cambiar manualmente las fuentes en tiempo de diseño, uno por uno para cada control, pero con varias formas de pasar a través de esto podría llevar tiempo e incluso entonces puede ser de las llamadas perdidas de un control .

Idea 3

similares a Idea 2, otra forma podría ser para ver el formulario como texto (DFM) y Buscar y reemplazar la fuente de esa manera.


Básicamente voy por la coherencia dentro de mi aplicación, y tener una fuente utilizada en todo es lo que estaba buscando lograr.

¿Me falta algo completamente obvio aquí, es lo que estoy tratando de hacer demasiado para una tarea así?

+6

Si cambia manualmente la fuente del control, también establece su propiedad 'ParentFont' en' False'; configurarlo 'True' para devolver la fuente predeterminada (principal) – kludg

+1

Sneaky, ¡no me di cuenta de que esta propiedad se había cambiado! –

+9

Antes de crear cualquier formulario, establezca 'Application.DefaultFont.Name: = 'MS Sans Serif';' Con el ParentFont configurado en verdadero en sus formularios como señala Serg. Para establecer la fuente en los cuadros de diálogo del mensaje, configure 'Screen.MessageFont.Name'property. –

Respuesta

22

Como se discutió en los comentarios, la clave para esto es la propiedad ParentFont. Esta propiedad se define en varios puntos en la jerarquía de VCL. Si establece ParentFont ser True para todos los componentes de la cadena, a continuación, puede cambiar los tipos de letra para toda la aplicación simplemente modificando

Application.DefaultFont 

Por defecto mayoría de los componentes establecer ParentFont a True y por lo que no tienen nada que hacer. El uno sin embargo es TForm. Un nuevo formulario predeterminado tiene ParentFont establecido en False. Esto es algo decepcionante, pero sospecho que refleja el hecho de que los diseñadores originales de la VCL no anticiparon esto y que ParentFont fue injertado relativamente tarde en el desarrollo de la VCL.

No importa, en un mundo ideal, todas las formas en su aplicación deben derivarse de una clase base común que usted controle.Si es así, simplemente puede hacer el cambio allí, configure ParentFont para que sea True, asegúrese de que no se aplique ninguna configuración de fuente explícita a ningún componente en sus formularios, y está dorado. Controle todas las fuentes de la aplicación a través de una sola propiedad. Si no tiene una clase base común para sus formularios, este es un momento ideal para agregarla. Si no desea hacerlo, debe configurar ParentFont para cada formulario.

Otras propiedades relacionadas son Screen.MessageFont y Screen.MenuFont. Estos proporcionan control global sobre las fuentes utilizadas en los cuadros de mensaje y menús. Sin embargo, las versiones recientes de Delphi le han devuelto al control de Windows la pintura de los cuadros de mensaje y los menús, por lo que estas propiedades no tienen ningún efecto.

+0

No hay nada realmente que agregar a lo que usted y otros ya han comentado. ¿No sería genial si hubiera una opción en las Opciones del proyecto para establecer un estilo de fuente y aplicarlo al proyecto, de la misma manera que 'Application.DefaultFont' funciona, si como yo no estuviéramos al tanto de este built-in función, tener la configuración visual para cambiar la fuente global lo haría mucho más fácil. De todos modos, acepto su respuesta porque la información está bien escrita y +1 para resaltar los mensajes y los menús. –

+10

Recuerde que los formularios VCL no son "administrados por diseño" como Swing (java) o WPF (C# /. Net) y que el cambio de fuentes en el tiempo de ejecución conduce a un perfecto corte de fuentes y hace que su UI sea un desastre ilegible. Buena suerte. No hay una forma práctica de cambiar las fuentes de una aplicación sin revisar los resultados a mano, formulario por formulario, para poder leerlos. –

+3

@ Warren, ese es un buen punto y tenía la intención de mencionarlo en mi respuesta, pero lo olvidé. En mi aplicación, muestro fuentes en Tahoma 8 para XP o en Segoe UI 9 para Vista +. Esto necesita llamadas a ChangeScale para cambiar el diseño del formulario. Pero sí, debes verificar los formularios en ambas variantes. Siempre y cuando no aprietes tus etiquetas una contra la otra, nunca hay un problema. ParentFont funciona de maravilla en todo esto. –

1

Si usted quiere hacer esto en tiempo de ejecución, como lo describes en Idea 1, se debe considerar lo que es una función recursiva, como esto:

procedure SetFontProperties(Control: TControl; Name: TFontName; Size: Integer; Styles: TFontStyles); 
// Set font properties 
var 
    Index: Integer; 
    Font: TFont; 
    AnObject: TObject; 
    ChildControl: TControl; 
begin 
    // Set font properties 
    AnObject := GetObjectProp(Control, 'Font', nil); 
    if AnObject is TFont then 
    begin 
    // Set properties 
    Font := TFont(AnObject); 
    Font.Name := Name; 
    Font.Size := Size; 
    Font.Style := Styles; 
    end; 

    // Set child font properties 
    if Control is TWinControl then 
    begin 
    // Set 
    for Index := 0 to TWinControl(Control).ControlCount - 1 do 
    begin 
     // Child control 
     ChildControl := TWinControl(Control).Controls[Index]; 

     // Set font properties 
     SetFontProperties(ChildControl, Name, Size, Styles); 
    end; 
    end; 
end; 

A continuación, puede cambiar las fuentes para todos los controles dentro de un formulario mediante el uso de esta manera:

SetFontProperties(Self, 'Courier', 14, []); 

la función será a continuación, establecer las propiedades de la fuente de la forma, y ​​las propiedades de la fuente de todos los controles secundarios en el formulario, incluyendo los controles anidados dentro TPanels u otros controles de contenedores.

Sin embargo, estoy de acuerdo con usted en que es una manera medio desordenada de hacerlo.

+0

No es la codificación ideal tal cosa, pero su respuesta es útil no obstante :) –

+3

Lamentablemente no todas las propiedades de la fuente se llaman 'Fuente' ... –

+0

@MarjanVenema Su intención fue solo una ilustración. Si tiene componentes que no son de VCL que implementan otros nombres de propiedades de fuentes, tendrá que expandir la función con esos nombres de propiedad, por supuesto. Sin embargo, el punto principal de esta discusión es el punto mencionado por Warren P en el comentario anterior: por lo general, no es posible alterar el tiempo de ejecución de las propiedades de fuentes, ya que altera las alineaciones, introduce el recorte de fuentes, etc. – Elling

2

La clave real, como se mencionó, es asegurarse de que todos sus formularios descienden de su propia base de aplicación.

Luego, puede ver cada formulario y botón, etc., y revisar las propiedades, donde cualquier propiedad de fuente modificada se debe mostrar en negrita y se identifica fácilmente. La mayoría de las propiedades tienen una opción de menú "Volver a heredado". Esto esencialmente debería deshacer cualquier selección previa, sin tener que ir a la versión de texto para editar. (Aunque probablemente lo haga exactamente, eliminando cualquier entrada de texto resultante de la configuración de fuente anterior).

Definitivamente me gustaría corregir cada formulario una vez en lugar de dejarlo definido incorrectamente y agregar más código para solucionarlo en tiempo de ejecución. Ese cambio lo dejará con un problema peor si luego decide hacer algo diferente.

+0

Gracias por los consejos. –

Cuestiones relacionadas