![]() |
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:
Nein, nicht prima:
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 ??? 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.) |
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; |
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 |
AW: Verständnisfrage zu ScaleBy
Zitat:
* 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 14:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz