delphi - Haga que los diálogos sean compatibles con "fuentes grandes".
dialog font-size (5)
Esta pregunta ya tiene una respuesta aquí:
¿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.
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?