AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi ... und wieder mal High-DPI Dual-Monitor - TStringgrid
Thema durchsuchen
Ansicht
Themen-Optionen

... und wieder mal High-DPI Dual-Monitor - TStringgrid

Ein Thema von Alfonso · begonnen am 30. Jun 2020 · letzter Beitrag vom 1. Jul 2020
Antwort Antwort
Alfonso

Registriert seit: 10. Jan 2006
242 Beiträge
 
Delphi 11 Alexandria
 
#1

... und wieder mal High-DPI Dual-Monitor - TStringgrid

  Alt 30. Jun 2020, 19:28
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
30-06-_2020_19-34-05.png

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.
Klicke auf die Grafik für eine größere Ansicht

Name:	30-06-_2020_19-34-05.png
Hits:	38
Größe:	26,3 KB
ID:	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.
30-06-_2020_20-02-36.png 30-06-_2020_20-03-55.png

4)Monitor 1 Full HD 100% Default, Monitor 2 Full HD 150%
Sieht ok aus auf beiden Monitoren mit angepasster DPI
30-06-_2020_20-06-36.png

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.
30-06-_2020_20-09-50.png 30-06-_2020_20-10-49.png

------
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;
Miniaturansicht angehängter Grafiken
30-06-_2020_19-38-09.png  
Alfonso
Seit Turbo Pascal 3.0 dabei!
Ewiger Pascal Fan!
  Mit Zitat antworten Zitat
Alfonso

Registriert seit: 10. Jan 2006
242 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 30. Jun 2020, 19:30
Hier das Beispielprojekt.

Projekte.zip

Danke für eure Hilfe
Alfonso
Seit Turbo Pascal 3.0 dabei!
Ewiger Pascal Fan!
  Mit Zitat antworten Zitat
bcvs

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

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

  Alt 1. Jul 2020, 13:23
Ich habe es jetzt nicht ausprobiert, aber ich skaliere in solchen Fällen immer Font.Height statt Font.Size.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

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

  Alt 1. Jul 2020, 13:43
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Alfonso

Registriert seit: 10. Jan 2006
242 Beiträge
 
Delphi 11 Alexandria
 
#5

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

  Alt 1. Jul 2020, 14:09
Das heißt, über die Trackbars setze ich nicht die Size ein, sondern die Height ein?
Alfonso
Seit Turbo Pascal 3.0 dabei!
Ewiger Pascal Fan!
  Mit Zitat antworten Zitat
Alfonso

Registriert seit: 10. Jan 2006
242 Beiträge
 
Delphi 11 Alexandria
 
#6

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

  Alt 1. Jul 2020, 16:55
@bcvs und @Uwe: Danke und nochmals danke.

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
Alfonso
Seit Turbo Pascal 3.0 dabei!
Ewiger Pascal Fan!
  Mit Zitat antworten Zitat
Antwort Antwort


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