full - embarcadero delphi
Consistencia de fuentes en todo el proyecto? (3)
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 configura ParentFont
para que sea True
para todos los componentes de la cadena, puede cambiar las fuentes para toda la aplicación simplemente modificando
Application.DefaultFont
Por defecto, la mayoría de los componentes configuran ParentFont
en True
y, por lo tanto, no tiene nada que hacer. El extraño es TForm
. Una nueva forma predeterminada 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 de su aplicación deben derivarse de una clase base común que usted controle. Si eso es así, simplemente puede hacer el cambio allí, configurar 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á satisfecho. 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.
¿Existe una forma rápida y efectiva de aplicar una fuente global para usar en un proyecto?
Con esto quiero decir que me gustaría establecer un nombre de fuente específico que usarán todos los controles de mi proyecto, como TButton, TEdit, TLabel, etc.
Normalmente, establecer la Fuente para el Formulario en lugar de un control específico cambiará todos los controles de ese Formulario a la Fuente especificada.
Sin embargo, hay un ligero problema con esto, si ha cambiado manualmente una fuente en un control específico, entonces la configuración de la fuente por el formulario ya no actualizará los controles que se han cambiado previamente manualmente.
Idea 1
Estaba pensando en utilizar un bucle For e iterar a través de cada componente en mis formularios y configurar 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 hacer 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 el momento del diseño, una por una para cada control, pero con varias formas de pasar esto podría llevar tiempo e incluso entonces podría perder un control.
Idea 3
Similar a la Idea 2, otra forma podría ser 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 momento es lo que buscaba lograr.
¿Me estoy perdiendo algo completamente obvio aquí, es lo que estoy tratando de hacer demasiado para tal tarea?
La clave real, como se mencionó, es garantizar que todos sus formularios descienden de su propia base de solicitud.
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.
Si quieres hacer este tiempo de ejecución, como lo describes en Idea 1, deberías considerar hacer una función recursiva, como esta:
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 de todos los controles dentro de un formulario utilizándolo así:
SetFontProperties(Self, ''Courier'', 14, []);
La función establecerá las propiedades de fuente del formulario y las propiedades de fuente de todos los controles secundarios en el formulario, incluidos los controles anidados dentro de TPanels u otros controles de contenedor.
Sin embargo, estoy de acuerdo con usted en que es una manera medio desordenada de hacerlo.