![]() |
Frames skalieren falsch unter HighDPI-Gesichtspunkten
Liste der Anhänge anzeigen (Anzahl: 2)
Ich bekomme es nicht hin, dass ein Frame unter HighDPI-Gesichtspunkten korrekt dargestellt wird.
Ausgangslage: - Win 11 und Delphi 11, das Projekt wird aus Delphi 7 portiert. - Hauptmonitor 4K mit 150% Darstellung, Zweitmonitor FullHD mit 100% Der Anhang zeigt ein kleines Testfenster, was links ein paar Eingabefelder direkt auf dem Form hat. Der große Bereich rechts ist ein Panel, das zur Laufzeit mit dem Frame belegt wird. Das erste Bild zeigt den Sollzustand, so sieht es aus, wenn man die Anwendung auf dem 4k-Monitor startet. Ziehe ich dann das Fenster auf den FullHD-Monitor, verwürfelt es den Frame, wie man im 2. Bild im Vergleich zu den Eingabefeldern links sieht, die korrekt verarbeitet werden. Ziehe ich es dann wieder zurück auf den 4k-Monitor, bleibt es falsch. Starte ich die Anwendung auf dem FullHD-Monitor, ist es von Anfang an falsch. Der dpi-Wert in der dfm-Datei des Panels steht auf 144 - was m.E. korrekt ist, da der 4k-Monitor mit 150% mein "Arbeitsmonitor" für Delphi ist. Da die Frames unter Delphi 7 ja auch etwas buggy waren, hatte ich auf dem Frame immer erstmal mit "clientalign" ein Panel gesetzt und darauf dann die eigentlichen Inhalte und außerdem alle Frames von einer eigenen Frame-Komponente abgleitet, die auf das OnScale-Ereignis reagiert und die Inhalte des Frames neu skaliert. Diese Eingriffe sind aber nicht schuld, hab das alles mal rausgenommen, dsa Verhalten wurde in keinem Fall wie erwartet. Carsten |
AW: Frames skalieren falsch unter HighDPI-Gesichtspunkten
Kannst du vielleicht ein kleines Testprojekt mit diesem Fenster erstellen, einfach nur das Design ohne Funktionalität?
Dann lässt sich dazu vermutlich mehr sagen. Zudem könntest du damit einen Supportfall aufmachen. |
AW: Frames skalieren falsch unter HighDPI-Gesichtspunkten
Liste der Anhänge anzeigen (Anzahl: 1)
Hier ein frisch in Delphi 11 erstelltes Projekt, es zeigt das gleiche Verhalten.
Carsten |
AW: Frames skalieren falsch unter HighDPI-Gesichtspunkten
Hat das Beispiel mal wer testen können - ob sich das nur bei mir falsch verhält?
Wer keine 2 unterschiedlichen Monitore hat, sollte auch den Vergrößerungswert in Windows umstellen können, während das Programm offen ist. (Nachtrag: Ja, produziert den Fehler genauso) Carsten |
AW: Frames skalieren falsch unter HighDPI-Gesichtspunkten
Ich habe leider aktuell kein Delphi 11 zur Verfügung. Ich habe es einmal mit Delphi 10.4.2 und Windows 11 getestet. Da klappt alles normal. Du könntest also vielleicht als Zwischenlösung erst einmal dorthin portieren. Der Schritt zu Delphi 11 ist dann ja sehr klein.
Die Ursache dürfte an den High-DPI Anpassungen in Delphi 11 liegen, mit denen es ja schon einige Probleme gab. Da wird es vermutlich bald noch Fixes geben. Ich bin aber nicht auf dem Laufenden, sprich habe nicht geschaut was sich in den entsprechenden Jira-Einträgen getan hat. Ich würde an deiner Stelle tatsächlich mit diesem Beispiel einen Supportfall aufmachen. |
AW: Frames skalieren falsch unter HighDPI-Gesichtspunkten
|
AW: Frames skalieren falsch unter HighDPI-Gesichtspunkten
Ich hab wohl jetzt eine Lösung für das Problem. Man baut sich eine eigene Frameklasse wie unten und leitet alle Frames von dieser ab, also TMyFrame = class(TFrameCH) statt TMyFrame = class(TFrame).
Damit verhalten sich alle meine Testfälle korrekt, wobei ich möglicherweise nicht alle erfast habe. Der Entwurfsmonitor steht wie schon geschrieben auf 150%, die DPI-Werte in der dfm-datei auf 144.
Delphi-Quellcode:
unit CHFrame;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TFrameCH = class(TFrame) private { Private-Deklarationen } FCreate:Boolean; FDPIStart:integer; protected public { Public-Deklarationen } constructor Create(AOwner: TComponent); override; procedure ScaleForPPI(NewPPI: Integer); override; end; implementation {$R *.dfm} constructor TFrameCH.Create(AOwner: TComponent); var m:TMonitor; begin FCreate:=true; m:=Screen.MonitorFromWindow(Application.MainForm.Handle, mdNearest); FDPIStart:=m.PixelsPerInch; inherited Create(AOwner); if Self.PixelsPerInch <> m.PixelsPerInch then begin ScaleControls(96, Self.PixelsPerInch); end; end; procedure TFrameCH.ScaleForPPI(NewPPI: Integer); var m:TMonitor; begin m:=Screen.MonitorFromWindow(Application.MainForm.Handle, mdNearest); if not FCreate then begin ScaleControls(m.PixelsPerInch, FDPIStart); FDPIStart:=m.PixelsPerInch; end else begin Inherited; FCreate:=false; end; end; end. |
AW: Frames skalieren falsch unter HighDPI-Gesichtspunkten
Liste der Anhänge anzeigen (Anzahl: 1)
hier noch das angepasste Testprojekt.
Carsten |
AW: Frames skalieren falsch unter HighDPI-Gesichtspunkten
Ich habe noch ein anderes Problem
Alexandria 11.2 Patch 1 IDE steht auf 96DPI Ein Frame erstellt. PixelsPerInch ist im DFM nicht vorhanden noch alles OK IDE auf eine andere DPI stellen. z.B 192 wenn man das Frame öffnet, wird alles in der IDE mit doppelt größe angezeigt PixelsPerInch im DFM steht auf 192 noch alles OK Öffnet man die IDE mit 96 DPI, wird nicht auf 96 DPI zurück Skaliert nach dem Speichern bleibt PixelsPerInch auf der alten größe z.B 192 Ein Wechsel von 192 auf 144 DPI klappt aber Bei Forms klappt der Wechsel zurück auf 96 DPI |
AW: Frames skalieren falsch unter HighDPI-Gesichtspunkten
Hallo Thomasl
meinst du mit IDE steht auf 96DPI die IDE Einstellung unter Tools > Optionen > Benutzeroberfläche > Formular Designer > High DPI oder die Skalierung unter Windows? Ich habe wohl falsch getestet. Ich habe ein neues Projekt erstellt mit einer Form und einem Frame. Ich habe sowohl mit der High DPI Einstellung der IDE wie auch mit der Skalierung unter Windows probiert; Form wie Frame wurden nach dem Laden immer wie erwartet angezeigt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz