Probleme mit TForm.ScaleBy und Windows-Skalierung > 100%

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
GLR
Beiträge: 9
Registriert: Di 1. Jul 2025, 15:48
OS, Lazarus, FPC: Windows 11 (L 4.0 FPC 3.2.2)
CPU-Target: x64
Wohnort: München

Probleme mit TForm.ScaleBy und Windows-Skalierung > 100%

Beitrag von GLR »

Hallo!

Win 11, Lazarus 4.0, IDE mit LCL-Skalierung=AN, Manifest=AN/DPI-Anpassung=AN
Alle Schriften in den Formularen mit Size=0

Solange die Win-Skalierung 100% ist, funktioniert Scaleby wunderbar, aber kaum ist die Win-Skalierung > 100%, also z.B. 125%, 150% usw., werden die Schriften viel zu groß und schieben sich über die Umrandungen hinaus (außer ohne Scaleby; da sieht alles gut aus). [Seltsamerweise gibt es das Problem nur bei Lazarus; bei Delphi kommt es nicht zu diesen Verzerrungen.]

Das Extremste habe ich nun mit einem Kunden erlebt, der einen neuen Laptop mit Win-Skalierung (empfohlen) 250% und gigantischer Pixel-Auflösung hat. Kann (angeblich) so gar nicht arbeiten. (Leider sehe ich nicht, was er sieht.)

Den anderen Kunden habe ich empfohlen, Scaleby abzuschalten [Scaleby(100,100)] und nur die Win-Skalierung zu benutzen. (Auf meinen PCs sieht das gut aus.) Es wird aber gemurrt, alles wäre nun "zu klein".

Ich habe alles, was ich finden konnte, im Web und in diesem und in dem englischen Forum abgegrast, aber keine passenden Infos gefunden. Jetzt bin ich völlig ratlos. Hat jemand eine Idee?

Gruß
Lothar

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 457
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Probleme mit TForm.ScaleBy und Windows-Skalierung > 100%

Beitrag von Jorg3000 »

Hi!
Ich habe dafür keine Lösung, aber ich fühle mit dir.
In Windows gibt es zwei unabhängige Mechanismen zur Skalierung: Die DPI-Skalierung und Textgrößen-Skalierung. Vielleicht spielt letzteres da auch mit rein?

Zumindest kam ich in älteren Lazarus-Versionen mit der Skalierung nicht klar. Als Workaround habe ich ein Projekt so umgestellt, dass ich die Skalierung wieder ausgeschaltet habe: Application.Scaled:=false;
aber im Manifest die DPI-Anpassung eingeschaltet gelassen habe. Das bedeutet, dass ich mich um die Skalierung nun komplett selbst kümmern muss.

Dazu gebe ich dem User die Möglichkeit, die Schriftgröße selber zu bestimmen. Solange der User noch keine Auswahl getroffen hat, wird die Schriftgröße dynamisch festgelegt, nämlich so, dass 250 Buchstaben auf die Bildschirmbreite passen. Damit sollte die Schriftgröße im nutzbaren Bereich sein, bis der User selber eine Auswahl trifft.

Ich habe mir dann auch die Mühe gemacht, alle Controls selber zu skalieren, d.h. die Breite/Höhe und Positionen errechne ich nun in einer virtuellen Einheit "Buchstabengröße" (vergleichbar "em" in HTML/CSS).
Z.B. ist dann ein Memo oder StringGrid nicht fest 500 Pixel breit, sondern 30 Buchstaben breit. Das rechne ich zur Laufzeit bei jedem Schriftwechsel in die tatsächlichen Pixel um.

Das war natürlich viel Arbeit, aber jetzt funktioniert es auf hunderten verschiedenen Windows-PCs und Laptops.
Aber ich bin offen: Wenn es eine einfache Lösung gibt, mache ich es zukünftig auch gerne wieder anders. :lol:
Grüße, Jörg

Benutzeravatar
GLR
Beiträge: 9
Registriert: Di 1. Jul 2025, 15:48
OS, Lazarus, FPC: Windows 11 (L 4.0 FPC 3.2.2)
CPU-Target: x64
Wohnort: München

Re: Probleme mit TForm.ScaleBy und Windows-Skalierung > 100%

Beitrag von GLR »

Danke für Deinen nachfühlenden Kommentar!

Ja, wenn man mit seinem Einkommen an solchen Dingen dranhängt, kann das oft ziemliche Belastung sein.

Den komplizierten Weg wie Du werde ich nicht gehen. Dafür habe ich jetzt etwas herausgefunden:

Wenn ich "DPI-Anpassung" abschalte (LCL-Skalierung und Manifest bleiben AN), klappt es (ist zwar etwas unscharf, aber das war die Delphi-Version auch). Dann kann der User selbst skalieren, so hoch er will.

Ich gehe jetzt soweit, zu behaupten, daß "DPI-Anpassung" nicht korrekt implementiert ist, denn sobald die AN ist und die Windows-Skalierung > 100%, kann man ScaleBy nicht mehr verwenden (das spielt dann regelrecht verrückt). Das sollte aber nicht sein, denn Scaleby muß unabhängig von solchen Optionen seine Arbeit tun können und nicht durch einzelne Vorgaben (hier auch noch als Default) kaputt gemacht werden.

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 457
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Probleme mit TForm.ScaleBy und Windows-Skalierung > 100%

Beitrag von Jorg3000 »

 
Bei einem neuen Projekt hatte ich Scale eingeschaltet gelassen und dachte mir: Aber jetzt mache ich von Anfang an alles richtig!

... um dann später bei einem Kunden erstaunt festzustellen, dass es auf seinem PC die Vollkatastrophe war (riesengroß, passte kaum auf seinen Bildschirm).

Entweder sitzt das Problem vor meinem Bildschirm (wie so oft) oder irgendwas in Laz funktioniert nicht für alle Situationen.
Wie auch immer, ich nutze nun meinem umständlichen Workaround - den ich verstehe (wichtig) und der für meine Zwecke funktioniert.

Ein Problem beim Scaling ist wohl, dass man die Situation auf fremden Laptops etc. nur mühsam zuhause simulieren kann. Man kann zwar die Prozentwerte der Darstellung in den Windows-Einstellungen ändern, aber man hat eben nicht die gleiche Hardware, auf deren Basis Windows seine virtuellen 100% ermittelt. Oder oder oder ...

Benutzeravatar
GLR
Beiträge: 9
Registriert: Di 1. Jul 2025, 15:48
OS, Lazarus, FPC: Windows 11 (L 4.0 FPC 3.2.2)
CPU-Target: x64
Wohnort: München

Re: Probleme mit TForm.ScaleBy und Windows-Skalierung > 100%

Beitrag von GLR »

Ich habe noch was Interessantes gefunden:

Ich kann in den IDE/Projekteinstellungen "DPI-Anpassung=AN" stehen lassen.
Im Win-Explorer gehe ich bei der EXE auf "Eigenschaften" > Kompatibilität > "Hohe DPI-Einstellung ändern" und setze den Haken auf "Verwenden Sie diese Eigenschaften, um Skalierungsprobleme .... zu beheben".

Die Wirkung ist dann dieselbe wie bei "DPI-Anpassung=AUS". Ich brauche dann nur eine EXE auszuliefern. Der User kann bei Bedarf die Eigenschaften-Einstellung im Win-Explorer vornehmen.

Da muß man auch erst mal drauf kommen...

Jetzt muß ich noch schauen, wie das bei den Kunden aussieht.

wp_xyz
Beiträge: 5478
Registriert: Fr 8. Apr 2011, 09:01

Re: Probleme mit TForm.ScaleBy und Windows-Skalierung > 100%

Beitrag von wp_xyz »

Wie schon erwähnt wurde, es gibt unter Windows zwei Arten, die Schriften größer zu machen: DPI-Einstellung ("System" > "Bildschirm" > "Skalierung" in den Windows-Einstellungen) oder Text-Skalierung ("Barriere-Freiheit" > "Textgröße").

Das LCL-Scaling von Lazarus behandelt nur den 1. Fall; wie man an der Lazarus-IDE sieht, funktioniert es einwandfrei (LCLScaling = true, DPI-Anpassung <> Aus), es sei denn, im Benutzerprogramm werden Fremd-Komponenten verwendet, die das LCL-Scaling nicht richtig berücksichtigen (wobei bei man gelegentlich auch bei den Lazarus-Komponenten noch kleinere Skalierungsfehler findet).

Beim zweiten Fall ... ist der Kunde selbst schuld, denn es gibt immer noch auch Microsoft-eigene Programme, die damit nicht richtig dargestellt werden. Überlappende Controls verhinderst du unter Lazarus, indem du diese nicht einfach so aufs Formular klatschst und mit der Maus an ihre Position verschiebst, sondern indem du sie per Anchoring mit den Nachbarn verankerst. Und die Container (Panels, Groupboxes, ...) müssen ihre Größe mit AutoSize=true) selbst ermitteln. Ich habe Anchoring schon mehrfach beschrieben, durchsuche das Forum.

Benutzeravatar
GLR
Beiträge: 9
Registriert: Di 1. Jul 2025, 15:48
OS, Lazarus, FPC: Windows 11 (L 4.0 FPC 3.2.2)
CPU-Target: x64
Wohnort: München

Re: Probleme mit TForm.ScaleBy und Windows-Skalierung > 100%

Beitrag von GLR »

Es ging hier um den Befehl Scaleby. Die Lazarus-IDE hat damit nichts zu tun; die verwendet den nicht.

wp_xyz
Beiträge: 5478
Registriert: Fr 8. Apr 2011, 09:01

Re: Probleme mit TForm.ScaleBy und Windows-Skalierung > 100%

Beitrag von wp_xyz »

Du hast zuletzt von LCLScaling gesprochen...

Dass bei ScaleBy und TextScaling die Controls nicht an der richtigen Stelle auftauchen, lässt sich durch dieselbe Maßnahme, Anchoring und Autosizing, lösen. Im beigefügten Projekt sind in der obersten Zeile drei Controls, ein Label, ein Edit und eine Combobox aneinander verankert. Darunter sind dieselben Controls an denselben Positionen, aber nicht verankert. Mit Klick auf dem "Scale" Button, der das Formular per ScaleBy um den Faktor 2 vergrößert, bleiben die verankerten Controls in der ersten Zeile an den "richtigen" Stellen, während in der nicht verankerten Zeile darunter Chaos ausbricht.

Mit Delphi allerdings tritt, wie du schon sagtest, das "Chaos" nicht auf, und die Controls bleiben an vernünftigen Positionen. Daher stimme ich mir dir überein, dass hier ein Bug vorliegt. Bitte schreibe einen Bug-Report mit einem kleinen Beispiel-Projekt.
Dateianhänge
ScaleBy.zip
(2.21 KiB) 2-mal heruntergeladen

Antworten