35 votes

Rendre les boîtes de dialogue compatibles avec les "grandes polices"

Selon vous, quelles sont les meilleures pratiques pour rendre une boîte de dialogue Windows compatible avec les polices standard (96 ppp) et le paramètre "grandes polices" (120 ppp) afin que les objets ne se chevauchent pas ou ne soient pas coupés?

BTW: Juste au cas où cela serait pertinent, cela m'intéresserait de faire cela pour les dialogues Delphi.

Merci d'avance!

8voto

merula Points 253

En général il faut utiliser des gestionnaires de disposition à cet effet. Que ce qu'ils sont conçus pour.

Delphi (ne fonctionne pas avec elle pour une longue période) n'a pas de gestionnaires, mais est capable de gérer différents dpi depuis. Vous devez utiliser la propriété autosize propery des composants pour s'assurer qu'ils ont la bonne taille pour le texte affiché. Pour éviter le chevauchement des composants de disposer sur le formulaire à l'aide de l'alignement et de propriétés de l'ancre. Finalement, vous devez regrouper des composants dans des conteneurs afin d'obtenir une mise en page correcte.

7voto

Ken White Points 73213

Il y a un très bon article dans le D2007 fichier d'aide, sous la rubrique "Considérations Lors de l'Dynamiquement le Redimensionnement des Formulaires et des Contrôles" (notez que l'URL pour le fichier d'aide lui-même, et non pas une page web en tant que tel).

Le même sujet, sous le même nom, peut être trouvé dans la D2010 fichier d'aide (même mise en garde à propos de l'URL comme ci-dessus), ou sur le docwiki.

Il est également intéressant (au moins un peu) à examiner TForm.Mise à l'échelle et TForm.ScaleBy.

2voto

Chau Chee Yang Points 3515

C’est ainsi que j’essaie de gérer les pixels de Delphi VCL, quel que soit le paramètre de taille de police 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.
 

Essayez ce qui suit pour tester les effets de différentes valeurs de pixels:

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

Vous devez changer PixelsPerInch avant d'instancier le descendant de TForm, y compris les boîtes de dialogue VCL de Delphi.

0voto

dummzeuch Points 4579
  • Ne mettez jamais côte à côte un contrôle et son étiquette descriptive, mettez toujours l'étiquette dessus.

Mais à part ça? Peut être:

  • Laissez suffisamment d'espace à droite et en bas des étiquettes pour qu'elles ne se chevauchent pas avec d'autres contrôles lorsque des polices de grande taille sont utilisées.

Je n'ai jamais essayé d'utiliser TLabeledEdit dans ce scénario, peut-être qu'ils le font automatiquement?

0voto

Warren P Points 23750

Il y a des prétendues solutions commerciales (Developer Express VCL Layout Manager). Mais je ne fais confiance à aucun d'entre eux. Je soupçonne que Embarcadero devrait traiter cela comme une critique de la faiblesse dans le courant de l'INTERFACE utilisateur de la composante (VCL).

Je pense que le tiers de la composante est peut-être la solution la plus rapide maintenant. C'est commercial, mais pas énormément cher.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X