Autor Beitrag
Peter18
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: 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



BeitragVerfasst: Di 30.01.18 22:33 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: 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:

ausblenden volle Höhe 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:
// ScaleObj ############################################################# TLabel

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;

// ScaleObj ############################################################# TLabel
// ScaleObj ############################################################## TEdit

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;

// ScaleObj ############################################################## TEdit
// ScaleObj ########################################################## TGroupBox

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;

// ScaleObj ########################################################## TGroupBox

Und So weiter.

Der Aufruf erfolgt dann mit den Einstellungen zur Entwicklungszeit:

ausblenden Delphi-Quelltext
1:
2:
ScaleObj( GroupBox3,  0440256166, 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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:
ausblenden 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
uses
  System.TypInfo; // für die Prop-Methoden
...
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: 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



BeitragVerfasst: Fr 02.02.18 02:46 
- Nachträglich durch die Entwickler-Ecke gelöscht -