Entwickler-Ecke
Sonstiges (Delphi) - Komponenten scalieren
Peter18 - Di 30.01.18 14:58
Titel: Komponenten scalieren
Ein freundliches Hallo an alle,
kann es sein, dass Komponenten in einer Groupbex oder einem Panel anders scaliert werden?
Ich habe für alle Komponenten die gleichen Scalierfaktoren verwendet. Die Komponenten auf einem Panel oder in einer Groupbox waren jedoch zu wiet rechts und vielleicht auch zu breit. Habe ich da einen Fehler gemacht, oder ist da etwas anders gelaufen?
Grüße von der sonnigen Nordsee
Peter
Delete - Di 30.01.18 21:33
- Nachträglich durch die Entwickler-Ecke gelöscht -
Peter18 - Mi 31.01.18 11:12
Halo Frühlingsrolle,
Dank Dir. Mit den Button hatte ich diese Probleme nicht. Ich habe auf einem Formular mehrere GroupBoxen, damit ich mehrere Objekte mit einer Anweisung ausschalten kann. In einer solchen GroupBox sind dann Labels und Editfelder.
für die Scalierung habe ich folgende Routinen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| procedure ScaleObj( var O : TLabel; T, L, H, W : Integer; Sh, Sv : Real ); overload; begin O.Top := Trunc( T * Sv ); O.Left := Trunc( L * Sh ); O.Height := Trunc( H * Sv ); if not O.AutoSize then O.Width := Trunc( W * Sh ); end;
procedure ScaleObj( var O : TEdit; T, L, H, W : Integer; Sh, Sv : Real ); overload; begin O.Top := Trunc( T * Sv ); O.Left := Trunc( L * Sh ); O.Height := Trunc( H * Sv ); O.Width := Trunc( W * Sh ); end;
procedure ScaleObj( var O : TGroupBox; T, L, H, W : Integer; Sh, Sv : Real ); overload; begin O.Top := Trunc( T * Sv ); O.Left := Trunc( L * Sh ); O.Height := Trunc( H * Sv ); O.Width := Trunc( W * Sh ); end;
|
Und So weiter.
Der Aufruf erfolgt dann mit den Einstellungen zur Entwicklungszeit:
Delphi-Quelltext
1: 2:
| ScaleObj( GroupBox3, 0, 440, 256, 166, Sh, Sv ); ScaleObj( Edit5, 15, 80, 21, 56, Sh, Sv ); |
Und so weiter. Die TEdit waren nicht immer an der richtigen Position. Je weiter die Box rechts war um so größer der Fehler und sie gingen über die Box hinaus.
Grüße von der wolkigen Nordsee
Peter
jasocul - Mi 31.01.18 13:42
Kann es sein, dass deine Form noch die Eigenschaft "Scaled" auf true hat?
Falls ja, skalierst du evtl. doppelt.
Und noch ein Tipp, damit du nicht für jede Komponente die selbe Procedure schreibst:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure ScaleObj( var aControl : TControl; T, L, H, W : Integer; Sh, Sv : Real ); begin aControl.Top := Trunc( T * Sv ); aControl.Left := Trunc( L * Sh ); aControl.Height := Trunc( H * Sv ); aControl.Width := Trunc( W * Sh ); end; |
Alles was von TControl abgeleitet ist, kannst du damit verarbeiten. Z.B. TEdit, TButton, ...
Für Controls, die AutoSize kennen, muss du vielleicht trotzdem etwas zusätzlich machen. Ich habe das bei mir (XE2) so gelöst:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| uses System.TypInfo; ... procedure ScaleObj( var aControl : TControl; T, L, H, W : Integer; Sh, Sv : Real ); begin aControl.Top := Trunc( T * Sv ); aControl.Left := Trunc( L * Sh ); aControl.Height := Trunc( H * Sv ); aControl.Width := Trunc( W * Sh );
if (IsPublishedProp(aControl, 'AutoSize')) then begin if Boolean(GetOrdProp(aControl, 'AutoSize')) then begin SetOrdProp(aControl, 'AutoSize', NativeInt(False)); SetOrdProp(aControl, 'AutoSize', NativeInt(True)); end; end; end; |
Peter18 - Do 01.02.18 11:34
hallo jasocul,
Dank Dir für Deine Antwort. Ich habe "TControl" nicht verwendet, um beim Aufruf die Umwandlung in TControl zu ersparen. Der Compiler sollte die Überladung optimieren können. Da viele Parameter übergeben werden, wird der Aufruf so besser lesbar und man findet Fehler leichter.
Normaler Weise bevorzuge ich Lösungen, wie Deine. Unter Delphi 4 müßte ich wohl "IF aControl is TLabel then" verwenden.
Die Eigenschaft "Scaled" habe ich bei meinen Experimenten auf False gesetzt und teilweise sehr seltsame Ergebnisse bekommen. Sie hatten nichts mehr mit dem Ursprünglichen Formular zu tun. Die Ursache konne ich nicht finden. Daher lasse ich sie meist auf "true".
Grüße von der etwas sonnigen Nordsee
Peter
Delete - Fr 02.02.18 01:46
- Nachträglich durch die Entwickler-Ecke gelöscht -
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!