Einzelnen Beitrag anzeigen

KPBecker

Registriert seit: 1. Mär 2004
Ort: Mannheim
120 Beiträge
 
Delphi 2010 Architect
 
#1

Verständnisfrage zu ScaleBy

  Alt 11. Jun 2012, 22:23
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.)
  Mit Zitat antworten Zitat