delphi dialog font-size pixel-fonts

delphi - Haga que los diálogos sean compatibles con "fuentes grandes".



dialog font-size (5)

¿Cuáles crees que son las mejores prácticas para hacer que un diálogo de Windows sea compatible con las fuentes estándar (96 ppp) y la configuración de "fuentes grandes" (120 ppp) para que los objetos no se superpongan ni se corten?

Por cierto: en caso de que sea relevante, me interesa hacer esto para los diálogos de Delphi.

¡Gracias por adelantado!


Así es como trato de lidiar con los píxeles de Delphi VCL independientemente de la configuración de tamaño de fuente de Windows.

unit App.Screen; interface uses Controls; type TAppScreen = class(TObject) private FDefaultPixelsPerInch: integer; FPixelsPerInch: integer; function GetPixelsPerInch: integer; procedure SetPixelsPerInch(const Value: integer); public procedure AfterConstruction; override; function DefaultPixelsPerInch: integer; function InAcceptableRange(const aPPI: integer): boolean; procedure ScaleControl(const aControl: TWinControl); property PixelsPerInch: integer read GetPixelsPerInch write SetPixelsPerInch; end; TAppScreenHelper = class helper for TAppScreen private class var FInstance: TAppScreen; class function GetInstance: TAppScreen; static; public class procedure Setup; class procedure TearDown; class property Instance: TAppScreen read GetInstance; end; implementation uses TypInfo, Windows, SysUtils, Forms, Graphics; type TScreenEx = class(TScreen) published property PixelsPerInch; end; TScreenHelper = class helper for TScreen public procedure SetPixelsPerInch(Value: integer); end; procedure TScreenHelper.SetPixelsPerInch(Value: integer); begin PInteger(Integer(Self) + (Integer(GetPropInfo(TScreenEx, ''PixelsPerInch'').GetProc) and $00FFFFFF))^ := Value; end; procedure TAppScreen.AfterConstruction; begin inherited; FDefaultPixelsPerInch := Screen.PixelsPerInch; FPixelsPerInch := FDefaultPixelsPerInch; end; function TAppScreen.DefaultPixelsPerInch: integer; begin Result := FDefaultPixelsPerInch; end; function TAppScreen.GetPixelsPerInch: integer; begin Result := FPixelsPerInch; end; function TAppScreen.InAcceptableRange(const aPPI: integer): boolean; begin if DefaultPixelsPerInch > aPPI then Result := DefaultPixelsPerInch * 0.55 < aPPI else if DefaultPixelsPerInch < aPPI then Result := DefaultPixelsPerInch * 1.55 > aPPI else Result := True; end; procedure TAppScreen.ScaleControl(const aControl: TWinControl); begin aControl.ScaleBy(PixelsPerInch, DefaultPixelsPerInch); end; procedure TAppScreen.SetPixelsPerInch(const Value: integer); begin FPixelsPerInch := Value; Screen.SetPixelsPerInch(FPixelsPerInch); end; class function TAppScreenHelper.GetInstance: TAppScreen; begin if FInstance = nil then FInstance := TAppScreen.Create; Result := FInstance; end; class procedure TAppScreenHelper.Setup; begin TAppScreen.Instance; end; class procedure TAppScreenHelper.TearDown; begin FInstance.Free; FInstance := nil; end; initialization TAppScreen.Setup; finalization TAppScreen.TearDown; end.

Pruebe lo siguiente para probar los efectos de diferentes valores de píxeles:

TAppScreen.Instance.PixelsPerInch := 120; TAppScreen.Instance.PixelsPerInch := 96; TAppScreen.Instance.PixelsPerInch := 150;

Debería cambiar PixelsPerInch antes de instanciar el descendiente de TForm, incluidos los cuadros de diálogo VCL de Delphi.


En general, uno debe usar administradores de disposición para este propósito. Para lo que están diseñados.

Delphi (no trabajó durante mucho tiempo) no tiene tales administradores, pero es capaz de manejar diferentes ppp desde entonces. Debe usar la propiedad autosize de los componentes para asegurarse de que tengan el tamaño correcto para el texto que muestran. Para evitar la superposición de componentes, organícelos en el formulario utilizando las propiedades de alineación y anclaje. Finalmente, debe agrupar los componentes en contenedores para lograr un diseño adecuado.


Existen supuestas soluciones comerciales (Developer Express VCL Layout Manager). Pero no confío en ninguno de ellos. Sospecho que Embarcadero debería abordar esto como una debilidad crítica en el conjunto de componentes de interfaz de usuario (VCL) actual.

Creo que el conjunto de componentes de terceros podría ser la solución más rápida en este momento. Es comercial, pero no muy costoso.

http://www.devexpress.com/products/VCL/ExLayoutControl/


Hay un artículo bastante bueno en el archivo de ayuda de D2007, en " Consideraciones al cambiar el tamaño de formularios y controles " (tenga en cuenta que la URL es para el archivo de ayuda en sí, y no para una página web como tal).

El mismo tema, con el mismo nombre, se puede encontrar en el archivo de ayuda D2010 (misma advertencia sobre la URL anterior) o en el documento docwiki .

También vale la pena (al menos un poco) examinar TForm.Scaled y TForm.ScaleBy.


  • Nunca ponga un control y su etiqueta descriptiva una al lado de la otra, siempre coloque la etiqueta encima.

¿Pero aparte de eso? Tal vez:

  • Deje suficiente espacio a la derecha y a la parte inferior de las etiquetas para que no se superpongan con otros controles cuando se usan fuentes grandes.

Nunca he intentado utilizar TLabeledEdit en ese escenario, ¿quizás lo hacen automáticamente?