Autor |
Beitrag |
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Di 30.01.18 15:58
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
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 30.01.18 22:33
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Mi 31.01.18 12: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:
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
Beiträge: 6386
Erhaltene Danke: 146
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 31.01.18 14: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
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Do 01.02.18 12: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
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 02.02.18 02:46
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
|