Autor Beitrag
Peter18
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 463
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2274
Erhaltene Danke: 419

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Di 30.01.18 22:33 
Guten Abend Peter18,

kannst du uns den Code dazu zeigen? Ich kann es im Moment nicht reproduzieren:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
begin
  Panel1.Width := Math.Floor(Panel1.Width * 1.2);
  Panel1.Height := Math.Floor(Panel1.Height * 1.2);
  Button1.Width := Math.Floor(Button1.Width * 1.2);  // Button befindet sich auf dem Panel
  Button1.Height := Math.Floor(Button1.Height * 1.2);
end;

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 463
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: 6322
Erhaltene Danke: 127

Windows 7 + Windows 10
Tokyo 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: 463
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2274
Erhaltene Danke: 419

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Fr 02.02.18 02:46 
@ Peter18

Jedes Steuerelement, welches von TControl abstammt, wird Änderungen für die Eigenschaften:
- Top
- Left
- Width
- Height

vornehmen können. Du brauchst weder mit "if aControl is TLabel then" abzufragen, noch es andersweitig zu casten.
Somit brauchst du auch die zahlreichen überladenen Methoden nicht.

Einzig das var aControl: TControl; sollte man noch weg machen.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)