AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Screen.PixelsPerInch <> Form.PixelsPerInch

Ein Thema von bcvs · begonnen am 7. Nov 2018 · letzter Beitrag vom 11. Dez 2019
Antwort Antwort
bcvs

Registriert seit: 16. Jun 2011
668 Beiträge
 
Delphi 12 Athens
 
#1

Screen.PixelsPerInch <> Form.PixelsPerInch

  Alt 7. Nov 2018, 08:12
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 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?
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.760 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Screen.PixelsPerInch <> Form.PixelsPerInch

  Alt 7. Nov 2018, 08:19
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
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.980 Beiträge
 
Delphi 12 Athens
 
#3

AW: Screen.PixelsPerInch <> Form.PixelsPerInch

  Alt 7. Nov 2018, 08:23
Diverse Anpassungen an Controls habe ich immer mit 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!
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
668 Beiträge
 
Delphi 12 Athens
 
#4

AW: Screen.PixelsPerInch <> Form.PixelsPerInch

  Alt 7. Nov 2018, 11:23
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.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Screen.PixelsPerInch <> Form.PixelsPerInch

  Alt 7. Nov 2018, 11:56
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.
Heiko
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
668 Beiträge
 
Delphi 12 Athens
 
#6

AW: Screen.PixelsPerInch <> Form.PixelsPerInch

  Alt 7. Nov 2018, 14:16
Dem wage ich zu widersprechen.

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.
Miniaturansicht angehängter Grafiken
scaling-d2007.png   scalingd10_2.png  
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.980 Beiträge
 
Delphi 12 Athens
 
#7

AW: Screen.PixelsPerInch <> Form.PixelsPerInch

  Alt 7. Nov 2018, 15:19
In Delphi 10.2 gibt TForm.PixelsPerInch immer den Designtime-Wert an. Das war in D2007 in der Tat anders.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
629 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Screen.PixelsPerInch <> Form.PixelsPerInch

  Alt 8. Nov 2018, 15:27
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.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Screen.PixelsPerInch <> Form.PixelsPerInch

  Alt 8. Nov 2018, 17:48
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.
Heiko
  Mit Zitat antworten Zitat
CodeX

Registriert seit: 30. Okt 2004
471 Beiträge
 
Delphi 12 Athens
 
#10

AW: Screen.PixelsPerInch <> Form.PixelsPerInch

  Alt 11. Dez 2019, 22:49
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).
Nur Delphi schafft es, einem ein Lächeln zu schenken, wenn man sich beim Schreiben von := vertippt und stattdessen ein :) erscheint.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 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