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/)
-   -   Delphi ... und wieder mal High-DPI Dual-Monitor - TStringgrid (https://www.delphipraxis.net/204803-und-wieder-mal-high-dpi-dual-monitor-tstringgrid.html)

Alfonso 30. Jun 2020 19:28

... 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:
Function TForm8.AdaptToDPI(Value:Integer):Integer;
begin
  Result:=Round(Value* (Monitor.PixelsPerInch / 96));
end;
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.

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;

Alfonso 30. Jun 2020 19:30

AW: ... und wieder mal High-DPI Dual-Monitor - TStringgrid
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier das Beispielprojekt.

Anhang 52773

Danke für eure Hilfe :-)

bcvs 1. Jul 2020 13:23

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.

Uwe Raabe 1. Jul 2020 13:43

AW: ... und wieder mal High-DPI Dual-Monitor - TStringgrid
 
Zitat:

Zitat von bcvs (Beitrag 1468660)
Ich habe es jetzt nicht ausprobiert, aber ich skaliere in solchen Fällen immer Font.Height statt Font.Size.

Das ist auch korrekt so. Ein Setzen von Font.Size setzt intern zwar auch Font.Height, rechnet das aber noch mit dem aktuellen PixelsPerInch um.

Alfonso 1. Jul 2020 14:09

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?

Alfonso 1. Jul 2020 16:55

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 13:05 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