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 Verständnisfrage zu ScaleBy (https://www.delphipraxis.net/168794-verstaendnisfrage-zu-scaleby.html)

KPBecker 11. Jun 2012 21:23

Verständnisfrage zu ScaleBy
 
Hallo, Delphi-Praktiker !

Mehrfach in der Delphi-Praxis behandeltes Thema:
- Anpassung der Formulare und Komponenten einer Anwendung an unterschiedliche Bildschirmauflösungen
Ziel:
- Alle Komponenten sollen unter Erhaltung der Seitenverhältnisse des Entwicklungssystems auf dem Zielsystem nach Bedarf vergrößert bzw. verkleinert werden.
Weg:
- Verwendung von Scaled:= true und ScaleBy(M,D)

Nach der Hilfefunktion beschreiben M und D den Proportionalitätsfaktor (= M/D), um den Längen in x- bzw. y-Richtung zu modifizieren sind.

Berücksichtigt werden muß, daß für die Berechnungen nicht die Maße des Schirms genommen werden dürfen, sondern die des Clients (= abzüglich eventueller Ränder für die Taskleiste und Ähnliches).

Meine Überlegung:
Der Clientbereich des Entwicklungssystems muß so in den Clientbereich des Zielsystems gelegt werden (umskaliert werden), daß je nach den Bildschirm-Seitenverhältnissen entweder die Clientbreite oder die Clienthöhe des Zielsystems voll ausgenutzt wird. Die andere Seite ist so anzupassen, daß das ursprüngliche Seitenverhältnis wieder eingehalten wird. (Für das Mappen werden also direkt die Bereiche genommen, die für den Client (z.B. form1) im Entwicklungs- und Zielsystem jeweils zur Verfügung stehen.)

Beispiel:
............Screen..-Breite..-Höhe....Client..-Breite..-Höhe
Entw.-System.....1440...900..................1440....870
Zielsystem..........1366...768..................13 66...728

Bei dieser Konstellation kann die Höhe im Zielsystem (728) ausgenutzt werden. Der Proportionalitätsfaktor, um von der Client-Höhe im Entw.-System auf die Client-Höhe im Zielsystem zu kommen, ist daher 0,837 (728/870). Der gleiche Faktor gilt wegen der geforderten Proportionalität natürlich auch für die Breite. Die Clientbreite im Zielsystem muß daher 1205 sein.

Versuchter ganz einfacher Code daher:
Delphi-Quellcode:
  Scaled:= true;
  Width:= 1440; // die Clientgröße
  Height:= 870; // des Entwicklungssystems
  ScaleBy(728,870); // wird entsprechend der verfügbaren Höhe im Zielsystem umskaliert
// und alles ist prima ???
Nein, nicht prima:
Nach dem Ausführen ergibt sich in der Praxis im Zielsystem eine Clientbreite von 1159 und eine Höhe von 662.
(1) Die Höhe wird nicht entsprechend dem Proportionalitätsfaktor berechnet, 728 sollten es sein.
(2) Die Höhe im Zielsystem wird mit einem anderen Faktor als die Breite berechnet, das geht gar nicht !
(tatsächlicher Faktor für die Höhe: 662/870 = 0,761, für die Breite: 1159/1440 = 0,805 --> von Proportionalität keine Spur mehr)

Die Unterschiede in den Zahlen sehen vielleicht nicht groß aus, am Bildschirm wird ganz klar, daß die Sache nicht stimmt. Rundungsfehler kann man in dieser Größe ausschließen.

Fragen also:
- Wo liegt das Mißverständnis ? (Mit geht es nicht darum, ob es mit Anchor oder Ähnlichem auch ginge.)
- Warum werden die Seiten nicht mit dem Faktor umgerechnet, der sich aus ScaleBy ergibt ?
- Ganz unabhängig davon: Wie kann es sein, daß für die Skalierung in x- und y-Richtung deutlich unterschiedliche Faktoren genommen werden, die Umrechnung also gar nicht proportional sein kann ?

Wer weiß ?

Vielen Dank für's Durchdenken,
mit besten Grüßen
Klaus-Peter (verwirrt und hoffend)

(kurze Zusatzfrage:
Wie kann man solch kleine Tabellen wie oben einfach schreiben? Der Übergang zu einer Proportionalschrift und das Entfernen mehrfacher Leerzeichen machen eine ziemliche Bastelei notwendig.)

Bummi 11. Jun 2012 21:59

AW: Verständnisfrage zu ScaleBy
 
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
begin
Clientwidth := 400;
Clientheight := 300;
Memo1.Lines.Add(Format('CW: %d, CH: %d, W: %d, H: %d',[Clientwidth,Clientheight,Width,Height]));
Scaleby(2,1);
Memo1.Lines.Add(Format('CW: %d, CH: %d, W: %d, H: %d',[Clientwidth,Clientheight,Width,Height]));
end;

Jumpy 12. Jun 2012 08:20

AW: Verständnisfrage zu ScaleBy
 
Zur Zusatzfrage:
Ich meine mit [ code][ /Code] Tags hat man doch automatisch proportionalschrift und mehrere Leerzeichen sind OK, oder?

Code:
Kleiner Test

Feld 1 | Feld 2 | Feld 3
------------------------
   X   |        |geht so

sx2008 13. Jun 2012 00:39

AW: Verständnisfrage zu ScaleBy
 
Zitat:

Zitat von KPBecker (Beitrag 1170365)
Ziel:
- Alle Komponenten sollen unter Erhaltung der Seitenverhältnisse des Entwicklungssystems auf dem Zielsystem nach Bedarf vergrößert bzw. verkleinert werden.

Die Idee hinter ScaleBy; man kann ein Formular nach belieben skalieren; funktioniert in der Praxis so leider nicht.
* Schriften lassen sich nur in festgelegten Schrittweiten verändern
* Bitmaps, Icons, usw. lassen sich überhaupt nicht skalieren
* viele Werte (z.B. BorderSize) sind in Pixel angegeben und daher nicht wirklich skalierbar
Es klemmt einfach immer irgendwo.
Die komplette Grafikausgabe müsste schon vektorbasiert sein, das ist unter Windows GDI aber nicht der Fall.

Dazu kann man nur folgende Ratschläge geben:
* auf jedem Formular sollte mindestens ein Control mit Align=alClient vorhanden sein
Vergrössert man ein Fenster wächst zumindest ein Teil der angezeigten Info austomatisch mit.
* TSplitter verwenden! Mit einem Splitter kann der Benutzer die Flächen der Controls selbst einstellen
Breite des Splitter auf 4 Pixel stellen und Farbe ändern (z.B. clBlue) damit der Benutzer sieht, dass da ein Splitter ist
* das Property Ancor verstehen und benützen
* Beim Design darauf achten, dass auch noch mit der Auflösung 800*600 sinnvoll gearbeitet werden kann
* Property Position vom Defaultwert poDesigned auf poDefaultPosOnly ändern. Das ist meist die bessere Einstellung für das Formular; insbesondere wenn der Bildschirm am Entwicklungsrechner eine sehr hohe Auflösung hat.
* Anwendung mit vmWare & Co. im Fenster testen. So kann man leicht eine 800*600 Auflösung simulieren


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:39 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