![]() |
... und wieder mal High-DPI Dual-Monitor - TStringgrid
Liste der Anhänge anzeigen (Anzahl: 7)
Hi,
bin absolut ratlos und nach etlichen Stunden Arbeit gebe ich es auf, alleine eine Lösung zu suchen. Verwende Delphi 10.4 und das Projekt hat High-DPI über Monitor V2 und Laufzeit Themes aktiviert. Habe ein kleines Beispielprogramm beigelegt (in der ersten Antwort, da ich max. 7 Anhänge hochladen kann). Es geht darum, bei einem Stringgrid die richtige Fontgröße einzustellen. Der Stringgrid passt sich nicht automatisch an High DPI an, so wie es aussieht. Ich möchte dass der Anwender sich die Fontgröße des Grids über eine Trackbar einstellt. Das Beispiel hat zwei grid. Bei dem rechtem Grid gebe ich die eingesellte Fontgröße direkt an das Grid weiter. Beim linken Grid errechne ich, abhängig von der DPI des Monitors, wo die Anwendung gerade läuft, eine neue Fontsize nach folgender Formel:
Code:
Nun habe ich verschiedene Varianten probiert. Ein Bildschirm kann 4K und einer Full HD. Interessant und sehr verwunderlich ist, dass sich die Anzeige des Grids auf dem selben Monitor mit der exakt gleichen Konfiguration anders verhält, abhängig davon, welcher Monitor als Default-Monitor eingestellt ist. Allgemein kann man sagen: Es ist immer schlecht, wenn der Defaultmonitor die Höhere DPI hat.
Function TForm8.AdaptToDPI(Value:Integer):Integer;
begin Result:=Round(Value* (Monitor.PixelsPerInch / 96)); end; Hier meine Beobachtungen 1) Beide Monitor Full HD 100% = 96 DPI Alles OK Anhang 52766 2) Monitor 1 4K 225% = 216 DPI. Monitor 2 Full HD 100% = 96 DPI. Monitor 2 Default Sieht mit DPI Fontanpassung ok aus auf beiden Bildschirmen. Anhang 52766 3) Gleiche Konfiguration wie 2), jedoch ist nun Monitor 1 Default: Jetzt sieht die Anzeige ohne DPI anpassung gut aus auf Monitor 1, mit Fontanpassung zu groß. Schiebe ich es auf Monitor 2, sind beide Anzeigen überdimensioniert. Anhang 52768 Anhang 52769 4)Monitor 1 Full HD 100% Default, Monitor 2 Full HD 150% Sieht ok aus auf beiden Monitoren mit angepasster DPI Anhang 52770 5) Gleiche Konfiguration wie 4), jedoch ist nun Monitor 2 Default: Jetzt sieht die Anzeige auf Monitor 2 ohne DPI Anpassung gut aus, mit Fontanpassung zu groß. Schiebe ich es auf Monitor 1, sind beide Anzeigen ok. Anhang 52771 Anhang 52772 ------ Im Übrigen, die Ergebniss von 3 und 5 sind genauso schlecht, wenn ich nur ein Monitor alleine mit High-DPI habe. Mein Resumé: Keine Ahnung! Probiert es bitte bei euch aus und gebt mir bitte Feedback! Hier mein Code:
Code:
procedure TForm8.FormAfterMonitorDpiChanged(Sender: TObject; OldDPI, NewDPI: Integer);
begin lblDPI.Caption:='Monitor.PixelsPerInch: '+Monitor.PixelsPerInch.ToString; TrackBarFontSizeTabChange(sender); end; procedure TForm8.FormCreate(Sender: TObject); begin for var Temp := 0 to 10 do begin LayoutBspGrid.Cells[0,Temp]:='Beispiel der Schriftgröße + Zeilenabstand in Tabellen'; StringGrid1.Cells[0,Temp]:='Beispiel der Schriftgröße + Zeilenabstand in Tabellen'; end; TrackBarFontSizeTabChange(sender); FormAfterMonitorDpiChanged(sender,0,0); end; Function TForm8.AdaptToDPI(Value:Integer):Integer; begin Result:=Round(Value* (Monitor.PixelsPerInch / 96)); end; procedure TForm8.TrackBarFontSizeTabChange(Sender: TObject); var FontsizeTbl,i:Integer; begin FontsizeTbl:=TrackBarFontSizeTab.Position; StringGrid1.Font.Size:=FontsizeTbl; LayoutBspGrid.Font.Size:= AdaptToDPI(TrackBarFontSizeTab.Position); lblTrack.Caption:='TrackBar: '+TrackBarFontSizeTab.Position.ToString; lblFont.Caption:='Font ohne DPI Anpassung: '+FontSizeTbl.ToString; lblFontDPI.Caption:='Font mit DPI Anpassung: '+AdaptToDPI(FontSizeTbl).ToString; Application.processMessages; end; |
AW: ... und wieder mal High-DPI Dual-Monitor - TStringgrid
Liste der Anhänge anzeigen (Anzahl: 1)
|
AW: ... und wieder mal High-DPI Dual-Monitor - TStringgrid
Ich habe es jetzt nicht ausprobiert, aber ich skaliere in solchen Fällen immer Font.Height statt Font.Size.
|
AW: ... und wieder mal High-DPI Dual-Monitor - TStringgrid
Zitat:
|
AW: ... und wieder mal High-DPI Dual-Monitor - TStringgrid
Das heißt, über die Trackbars setze ich nicht die Size ein, sondern die Height ein?
|
AW: ... und wieder mal High-DPI Dual-Monitor - TStringgrid
@bcvs und @Uwe: Danke und nochmals danke.:thumb:
Genau das war die Lösung. Man darf nicht mit Font.Size arbeiten sondern mit Font.Heigth! Dann tut alles wunderbar. Mich ärgert jetzt nur das verlorene Wochenende :wall: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:09 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