AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Verständnisfrage zu ScaleBy

Offene Frage von "sx2008"
Ein Thema von KPBecker · begonnen am 11. Jun 2012 · letzter Beitrag vom 13. Jun 2012
Antwort Antwort
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
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: Verständnisfrage zu ScaleBy

  Alt 11. Jun 2012, 22:59
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;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.736 Beiträge
 
Delphi 6 Enterprise
 
#3

AW: Verständnisfrage zu ScaleBy

  Alt 12. Jun 2012, 09:20
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
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Verständnisfrage zu ScaleBy

  Alt 13. Jun 2012, 01:39
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

Geändert von sx2008 (13. Jun 2012 um 01:44 Uhr)
  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 12:30 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