Flexible Schriftgroesse

Antworten
Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Flexible Schriftgroesse

Beitrag von Eclipticon »

Schoenen Abend!

Ich arbeite in einem Projekt mit Forms konstanter Groesse (bsDialog), moechte aber die unterschiedlichen Schriftgrade unterstuetzen, die man systemweit einstellen kann (normal, gross, sehr gross).

Wie kann ich diese Einstellung abfragen? Gibt es Standards, wie ich alle Komponenten skalieren sollte, um den Text noch unterzubringen?

Vielen Dank ..

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: Flexible Schriftgroesse

Beitrag von Bora4d »

Du kannst 3 Variablen für Schriftgröße legen. Und bei Form.OnCreate ändern:
Font.Height := NeueGroesse;
oder (eins von beiden)
Font.Size:= NeueGroesse;

Unterkomponenten müssen Parentfont:=true (ist Standard) sein, dann werden bei den auch Schrift automatisch größer.
Wenn du Font.Size oder Font.Height:=0 setzt, dann wird Standardgröße genommen.

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: Flexible Schriftgroesse

Beitrag von Eclipticon »

Hi,

das ist sicher die einfachste Variante die Schriftgroesse fuer alle Komponenten anzupassen, vielen Dank!

Ich habe mich aber jetzt dafuer entschieden, die Schriftgroesse auf 0 (default) zu lassen, und die Groesse der Komponenten in TForm.Create wie folgt anzupassen:

Code: Alles auswählen

ScaleFactor := Canvas.TextWidth('abcdfeghijklmnopqrstuvwxyz') / 205;
  // 205 ist die Breite des Texts zu design time ...
  if ( ScaleFactor <> 1.000 ) then
  begin
    Height := Round(Height * ScaleFactor);
    Width  := Round(Width * ScaleFactor);
    for i := 0 to (ComponentCount - 1) do
    begin
      (Components[i] as TControl).Height :=
        round((Components[i] as TControl).Height * ScaleFactor);
      (Components[i] as TControl).Width  :=
        round((Components[i] as TControl).Width * ScaleFactor);
      (Components[i] as TControl).Top    :=
        round((Components[i] as TControl).Top * ScaleFactor);
      (Components[i] as TControl).Left   :=
        round((Components[i] as TControl).Left * ScaleFactor);
      (Components[i] as TControl).Font.Size   :=
        round((Components[i] as TControl).Font.Size * ScaleFactor); // Fonts mit Groesse 0 veraendern sich nicht, fixe Groessen schon.
    end;
  end;


Bisher sieht das ganz gut aus ... aber macht diesen Vorgehen im Augen von erfahrenern Leuten Sinn? Fallen? Oder geht's einfacher?

Dankeschoen :-)

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: Flexible Schriftgroesse

Beitrag von Bora4d »

Für mich sieht deine Lösung sogar besser aus.
Ich würde anstatt alle Größen einzeln zu setzen alle auf einmal setzen mit:
procedure SetBounds(ALeft, ATop, AWidth, AHeight: integer);
Weil alle Controls nach jede Größen- und Positionänderung neu ausgerichtet und gezeichnet werden.

Und hier nicht:
for i := 0 to (ComponentCount - 1) do begin
(Components[i] as TControl).Height := ....

nehmen sondern:
for i := 0 to (ControlCount - 1) do begin
Controls[i].Height :=
Mit ComponentCount bekommst du auch TPopupMenu und ähnliches, die ja nicht von TContol abstammen. Das verursacht später Fehler falls du sie nutzt.
Mit (ControlCount bekommt man alle Controls die Nachfahre von TControl sind.

Allgemein kann man für Typkonvertierung für:
(Components[i] as TControl).Irgendeineigenschaft
das nehmen:
TControl(Components[i]).Irgendeineigenschaft.
Bei Delphi Tips hatte ich gelesen dass zweite Variante schneller sein soll und es sieht übersichtlich aus. Das erste erinnert mich immer an BASIC :)
Bei C/C++ ist es auch ähnlich wie 2. Variante nur dort wird nur Type in Klammern gesetzt anstatt Variable, C eben crazy&wild :D

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: Flexible Schriftgroesse

Beitrag von Eclipticon »

Looking good :-) Wobei man sich bei der Loesung mit .Controls natuerlich die Typkonvertierung sparen kann ... Dankeschoen!

Hinzuzufuegen ist natuerlich, dass diese Loesung noch um die Kinder jeder Control erweitert werden muss, sonst wird nur die erste Ebene von Controls skaliert.

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: Flexible Schriftgroesse

Beitrag von Eclipticon »

Daraus wurde:

Code: Alles auswählen

// Scale all child controls of AWinControl by recursive calls
procedure ScaleChildControls(AWinControl: TWinControl; ScaleFactor: double);
var
  i: integer;
begin
  if (ScaleFactor <> 1.000) then // Koennt man sicht natuerlich sparen, aber ...
  begin
    for i := 0 to (AWinControl.ControlCount - 1) do
    begin
      AWinControl.Controls[i].SetBounds(
        round(AWinControl.Controls[i].Left * ScaleFactor),
        round(AWinControl.Controls[i].Top * ScaleFactor),
        round(AWinControl.Controls[i].Width * ScaleFactor),
        round(AWinControl.Controls[i].Height * ScaleFactor)
        );
      AWinControl.Controls[i].Font.Size :=
        round(AWinControl.Controls[i].Font.Size * ScaleFactor);
      if (AWinControl.Controls[i] is TWinControl) then
        ScaleChildControls(TWinControl(AWinControl.Controls[i]), ScaleFactor);
    end;
  end;
end;


Und in TForm.Create:

Code: Alles auswählen

// Scale form and all child components
  // 205 is the width of the given text at design time
  ScaleFactor := Canvas.TextWidth('abcdfeghijklmnopqrstuvwxyz') / 205;
  if ( ScaleFactor <> 1.000 ) then
  begin
    Height := Round(Height * ScaleFactor);
    Width  := Round(Width * ScaleFactor);
    ScaleChildControls(TWinControl(Self), ScaleFactor);
  end;

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: Flexible Schriftgroesse

Beitrag von Eclipticon »

Auf Constraints sei dabei natuerlich nicht vergessen, wenn man die verwendet ...

Antworten