Autor Beitrag
Peter18
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 463
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Di 02.01.18 14:31 
Ein freundliches Hallo an alle,

ein altes Problem war verdrängt, aber nun ist es wieder da! Die Skalierung!

Mein Formular sieht auf meinem Rechner immer gleich aus. Wenn es aber auf einem anderen Rechner dargestellt wird, kommt es manchmal zu Überraschungen. Ich habe versucht selbst zu skalieren, aber mit wenig Erfolg. Änderungen von "PixelsPerInch" haben teilweise zu guten Ergebnissen geführt, aber manche Objekte werden stark verzerrt dargestellt, je nach dem, ob sie zur Laufzeit oder zur Entwicklungszeit erzeugt werden. Bei manchen Objekten wird die Schrift stark verändert, je nach dem ob sie zum Objekt gehört (Caption) oder per Label eingefügt wird.

Hat jemand einen Tipp, wie man es schafft, dass die Controls immer gleich aussehen, unabhängig von der Bildschirmauflösung und der Windowseinstellung?

Grüße von der ausnahmsweise sonnigen Nordsee

Peter
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18686
Erhaltene Danke: 1619

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 03.01.18 07:08 
Wenn es um Delphi 4 geht:
Diese Probleme wurden leider erst in den aktuellsten Delphiversionen und Windows 10 richtig gut gelöst.

Damals zu Delphi 4 Zeiten war High-DPI und ähnliches noch sehr exotisch und wurde noch nicht wirklich unterstützt. Das wurde zwar ab Windows XP versucht mit einer automatischen Skalierung zu korrigieren, aber ohne Unterstützung durch das entsprechende Programm wird das immer komisch aussehen. Und die lässt sich mit Delphi 4 nicht machen, weil dazu jegliche Grundlagen fehlen.
Und auch die Unterstützung in Windows funktioniert erst ab Windows 8.1 wirklich gut und bei mehreren Bildschirmen mit unterschiedlicher Skalierung erst ab Windows 10.

Insofern kann ich bei Delphi vor Delphi 10.0 und/oder Windows 7 oder älter nur raten:
Versuche es besser nicht, wenn du nicht sehr viel Zeit hast, die du darauf verschwenden kannst...

_________________
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 463
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Mi 03.01.18 11:04 
Hallo Sebastian,

Dank Dir für die Antwort. Sie Bestätigt meine Versuche. Wann findet die Scalierung denn statt? Vielleicht kann ich etwas tun, damit die Anzeige einigermaßen in Form bleibt.

Grüße von der Nordsee

Peter
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18686
Erhaltene Danke: 1619

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 03.01.18 11:39 
Das Problem an der Geschichte ist doch, dass bei einer High-DPI Anzeige immer irgendwie skaliert werden muss. Entweder macht das die Anwendung selbst oder Windows macht es automatisch. Wenn man verhindern möchte, dass Windows dies tut, kann man ein Manifest hinzufügen, in dem man kundtut, dass die Anwendung für Windows 10 entwickelt wurde und High-DPI kennt. Das geht mit einem Manifest, in dem dpiAware gesetzt ist.

Allerdings sieht es dann ggf. eher noch schlimmer aus... denn die Angabe, dass das Programm für Windows 10 und High-DPI entwickelt wurde, stimmt ja nicht.

_________________
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 463
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Mi 03.01.18 13:04 
Hallo Sebastian,

nochmals Dank! Ich hatte auch schon "Scaled" auf false gesetzt, aber das Ergebnis war alles andere als überzeugend.

Es gibt also keine Ereignisroutine, in der ich die Scalierung korrigieren könnte?

Oder kann ich die "PixelsPerInch" vom System bekommen? Habe leider bisher nichts gefunden.

Zitat:
Wenn Scaled True ist und sich der Wert von PixelsPerInch von der aktuellen Systemeinstellung unterscheidet, wird die Größe des Formulars entsprechend geändert. Wird Scaled auf False gesetzt, findet keine Skalierung statt.


Grüße von der Nordsee

Peter
Symbroson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 381
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: Mi 03.01.18 14:41 
Eine weitere oft verwendete Variante ist, die Maße relativ zur Bildschirmgröße anzugeben, also mit floats zwischen einschließlich 0 und 1. Ich wüsste allerdings nicht, wie man das Delphi beibringen könnte, ohne alle Controls in Laufzeit erstellen zu müssen.

_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 463
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Mi 03.01.18 15:50 
hallo Symbroson,

Du meinst wie bei HTML? Dazu müßte man alle Objekte um entsprechende Propertys erweitern und zum richtigen Zeitpunkt erzeugen, wenn die Scalierung gelaufen ist.

Grüße von der regnerischen Nordsee

Peter
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 463
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Mi 10.01.18 11:18 
Ein freundliches Hallo an alle,

hier mein work around:

in "FormCreate" erstelle ich Scalierfaktoren:

ausblenden Delphi-Quelltext
1:
2:
  aScalH := Width  / 589;
  aScalV := Height / 720;

Die Zahlen sind die zur Entwurfzeit eingetragenen Werte.

Zur Laufzeit erstellte Objekte werden mit diesen Faktoren scaliert.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
  Top    := Trunc( Top    * aScalV );
  Height := Trunc( Height * aScalV );
  Left   := Trunc( Left   * aScalH );
  Width  := Trunc( Width  * aScalH );

Das hat bisher ganz gut funktioniert.

Grüße von der etwas wolkigen Nordsee

Peter