Flexible Schriftgroesse
-
- 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
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 ..
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 ..
-
- 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
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.
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.
-
- 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
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:
Bisher sieht das ganz gut aus ... aber macht diesen Vorgehen im Augen von erfahrenern Leuten Sinn? Fallen? Oder geht's einfacher?
Dankeschoen
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
-
- 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
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
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
-
- 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
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.
Hinzuzufuegen ist natuerlich, dass diese Loesung noch um die Kinder jeder Control erweitert werden muss, sonst wird nur die erste Ebene von Controls skaliert.
-
- 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
Daraus wurde:
Und in TForm.Create:
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;
-
- 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
Auf Constraints sei dabei natuerlich nicht vergessen, wenn man die verwendet ...