Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Screen.PixelsPerInch <> Form.PixelsPerInch (https://www.delphipraxis.net/198491-screen-pixelsperinch-form-pixelsperinch.html)

bcvs 7. Nov 2018 08:12

Screen.PixelsPerInch <> Form.PixelsPerInch
 
Hallo,

habe kürzlich mein Hauptprojekt von D2007 auf D10.2 umgestellt. Das ging eigentlich erstaunlich gut, bis ich jetzt auf dieses leidige HighDPI-Thema gestoßen bin.

Diverse Anpassungen an Controls habe ich immer mit
Delphi-Quellcode:
round(x * PixelsPerInch/96)
umgerechnet.

Wenn das so in einer Methode eines Forms aufgerufen wird, wird natürlich auf TForm.PixelsPerInch zugegriffen. Das war unter D2007 auch OK, denn da stand bei höheren Auflösungen immer der korrekte PixelsPerInch-Wert drin.

In D10.2 ist das anscheinend anders. Form.PixelsPerInch ist immer 96, in Screen.PixelsPerInch steht der aktuelle PixelsPerInch-Wert.

Es geht mir jetzt nur darum, dass ich verstehe, was da abläuft. Ist es richtig, das in Form.PixelsPerInch immer der Wert drinsteht, mit dem das Formular designed wurde und in Screen.PixelsPerInch der aktuelle Wert?

Sherlock 7. Nov 2018 08:19

AW: Screen.PixelsPerInch <> Form.PixelsPerInch
 
Ohne jetzt die Wahrheit hinter dieser Aussage überprüft zu haben, klingt folgendes dennoch plausibel: Die Form ppi werden zur Designzeit vorgegeben, die Screen ppi sind Laufzeit Informationen.
Daher die Abweichung.

Sherlock

Uwe Raabe 7. Nov 2018 08:23

AW: Screen.PixelsPerInch <> Form.PixelsPerInch
 
Zitat:

Zitat von bcvs (Beitrag 1417566)
Diverse Anpassungen an Controls habe ich immer mit
Delphi-Quellcode:
round(x * PixelsPerInch/96)
umgerechnet.

Je nach Einstellung macht Delphi 10.2 schon einiges selbst in Bezug auf solche Anpassungen. Wenn du die volle Kontrolle behalten willst, musst du in den Projektoptionen - Anwendung explizit das Hochauflösung aktivieren abschalten - in allen Ebenen der Build-Konfigurationen beginnend mit der höchsten!

bcvs 7. Nov 2018 11:23

AW: Screen.PixelsPerInch <> Form.PixelsPerInch
 
Zitat:

Zitat von Sherlock (Beitrag 1417568)
Die Form ppi werden zur Designzeit vorgegeben, die Screen ppi sind Laufzeit Informationen.

Ja, das klingt logisch. Diese Logik war aber in D2007 anscheinend noch nicht vorhanden, da stand in den beiden ppi-Werten das selbe drin.

Aber wie dem auch sei: die meisten dieser Pixel-Umrechnungen kann ich unter D10.2 sowieso rauswerfen, da hier von Haus aus schon viel richtig gemacht wird, wie Uwe schon gesagt hat.

hoika 7. Nov 2018 11:56

AW: Screen.PixelsPerInch <> Form.PixelsPerInch
 
Hallo,
Zitat:

Das war unter D2007 auch OK, denn da stand bei höheren Auflösungen immer der korrekte PixelsPerInch-Wert drin.
Nein, Form.PixelsPerInch war immer 96 (wenn man mit 100% das Formular designed hat).
Screen.PixelsPerInch enthielt immer die tatsächliche Auflösung.

Was jetzt anders ist, dass unter 10.X viel mehr unter der Haube passiert,
wenn man HighDPI in der IDE einstellt.

Viel Umsetz-Code, denn Du also in D2007 geschrieben hast, kannst Du jetzt weglassen.


Mach einfach ein einfaches neues Projekt mit 2 Label und schreibe dort die beiden PixelsPerInch rein,
das ganze unter D2007 und D10.

bcvs 7. Nov 2018 14:16

AW: Screen.PixelsPerInch <> Form.PixelsPerInch
 
Liste der Anhänge anzeigen (Anzahl: 2)
Dem wage ich zu widersprechen.

Zitat:

Zitat von hoika (Beitrag 1417589)
Mach einfach ein einfaches neues Projekt mit 2 Label und schreibe dort die beiden PixelsPerInch rein,
das ganze unter D2007 und D10.

Genau das habe ich ja gemacht. So bin ich ja erst darauf gekommen:

Beide Projekte wurden mit 100% entwickelt. Beide Screenshots sind in einer VM mit 150% aufgenommen worden. Im D2007-Projekt steht halt Form.PixelPerInch=144. Form.Scaled ist in beiden Fällen true.

Uwe Raabe 7. Nov 2018 15:19

AW: Screen.PixelsPerInch <> Form.PixelsPerInch
 
In Delphi 10.2 gibt TForm.PixelsPerInch immer den Designtime-Wert an. Das war in D2007 in der Tat anders.

Rolf Frei 8. Nov 2018 15:27

AW: Screen.PixelsPerInch <> Form.PixelsPerInch
 
Also unter D7 war das auch schon so, dass TForm.PixelsPerInch die Auflösung des Entwicklungs-PCs enthalten hat und nicht die aktuelle DPI zur Runtime. Die bekommt man durch Screen.PixelPerInch. Da hat wohl ein Entwickler in D2007 daran was geändert ohne zu Wissen, wie dieses Property genau funktioniert/beschrieben ist.

hoika 8. Nov 2018 17:48

AW: Screen.PixelsPerInch <> Form.PixelsPerInch
 
Hallo,
ich wollte gerade steif und fest sagen, alles falsch.

Aber:
Gerade ein D2007-Projekt erzeugt und tatsächlich ist es so,
Form- und Screen.PixelsPerInch entsprechen der Auflösung.

Das war mir nur nicht bewusst, weil ich immer nur mit Screen.PixelsPerInch arbeite
und davon ausgehe, dass unsere IDE bei 100% läuft.

CodeX 11. Dez 2019 22:49

AW: Screen.PixelsPerInch <> Form.PixelsPerInch
 
Da ich diesen Thread als erstes bei meiner Recherche gefunden hatte, hier aber kein Hinweis auf die aktuellste Lösung zu finden ist, wollte es der Vollständigkeit halber anmerken:
Um per-Monitor Skalierungen zu unterstützen, sollte man Monitor.PixelsPerInch verwenden, da dieser Wert dann auf jedem Monitor anders sein kann, während Screen.PixelsPerInch nur den Wert des Hauptmonitors angibt, egal wo sich die Anwendung gerade befindet).


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz