Difference between revisions of "Anchor Sides/de"

From Free Pascal wiki
Jump to navigationJump to search
m
Line 94: Line 94:
 
   | A | | C |
 
   | A | | C |
 
   +---+ +---+
 
   +---+ +---+
 +
 +
[[Category:LCL]]

Revision as of 05:48, 1 September 2010

Deutsch (de) English (en) français (fr) 日本語 (ja) русский (ru)

Siehe auch LCL AutoSizing.

Es gibt einige neue Eigenschaften und Methoden für das automatische Layout von Bedienelementen. Sie können jetzt Bedienelemente so einstellen, daß sie einen bestimmten Abstand zu anderen Bedienelementen einhalten, oder relativ zu anderen Bedienelementen zentrieren. Siehe unten für Beispiele.

Jede der vier Seiten eines Bedienelements (Left, Top, Right, Bottom) kann jetzt verankert/angebunden werden an der Seite eines anderen Bedienelements. Zum Beispiel können sie jetzt die linke Seite eines TEdit an der rechten Seite eines TLabel verankern. Jedesmal wenn das Label bewegt wird oder in der Größe angepasst wird, dann wird die linke Seite des Edit's folgen, was normalerweise zu einer Bewegung des Edit parallel zum Label führt.

Beispiel 1

+--------+ +-------+
| Label1 | | Edit1 |
+--------+ |       |
           +-------+

Im Code

Edit1.AnchorSide[akLeft].Side:=asrRight;
Edit1.AnchorSide[akLeft].Control:=Label1;
Edit1.Anchors:=Edit1.Anchors+[akLeft];

Sie können den Abstand mit den BorderSpacing Eigenschaften definieren:

Edit1.BorderSpacing.Left:=10;

Das selbe kann mit der Methode gemacht werden:

Edit1.AnchorToNeighbour(akLeft,10,Label1);

Anmerkungen

Edit1.Left wird Label1.Left+Label1.Width folgen, nicht umgekehrt. Das bedeutet, daß eine Bewegung von Label1 auch Edit1 bewegen wird. Aber eine Bewegung von Edit1 wird von der LCL annulliert. Wenn sie auch die rechte Seite von Label1 an der linken Seite von Edit1 verankern, dann erzeugen sie einen Kreis, und dies kann zusammen mit einigen anderen autosize Eigenschaften eine Endlosschleife verursachen. This is ignored by the LCL or automagically repaired when the Parent.AutoSize is true.

Beispiel 2

Sie können die obere Seite von Edit1 so verankern, daß sie der oberen Seite von Label1 folgt:

+--------+ +-------+
| Label1 | | Edit1 |
+--------+ |       |
           +-------+
Edit1.AnchorSide[akTop].Side:=asrTop;
Edit1.AnchorSide[akTop].Control:=Label1;
Edit1.Anchors:=Edit1.Anchors+[akTop];

Das selbe kann mit der Methode gemacht werden:

Edit1.AnchorParallel(akTop,0,Label1);

Beispiel 3

Vertikale Zentrierung von Label1 an Edit1:

           +-------+
+--------+ |       |
| Label1 | | Edit1 |
+--------+ |       |
           +-------+
Edit1.AnchorSide[akTop].Side:=asrCenter;
Edit1.AnchorSide[akTop].Control:=Label1;
Edit1.Anchors:=Edit1.Anchors+[akTop]-[akBottom];

Das selbe kann mit der Methode gemacht werden:

Edit1.AnchorVerticalCenterTo(Label1);

Offensichtlich macht die Verankerung der unteren Seite von Edit1 keinen Sinn bei einer Zentrierung.

Neue Eigenschaft

property AnchorSide[Kind: TAnchorKind]: TAnchorSide read GetAnchorSide;

Dies wird nicht im Objektinspektor veröffentlicht. Sie können sie zur Entwicklungszeit bearbeiten mit dem Ankereditor (Menü: Ansicht -> Ankereditor anzeigen, oder auf den Button der 'Anchors' Eigenschaft klicken).

Neue Methoden zur einfachen Konfiguration eines gebräuchlichen Layouts

procedure AnchorToNeighbour(Side: TAnchorKind; Space: integer;
                            Sibling: TControl);
procedure AnchorParallel(Side: TAnchorKind; Space: integer;
                         Sibling: TControl);
procedure AnchorHorizontalCenterTo(Sibling: TControl);
procedure AnchorVerticalCenterTo(Sibling: TControl);
procedure AnchorAsAlign(TheAlign: TAlign; Space: Integer);

Anchoring to invisible controls

Since 0.9.25 rev 12800 anchoring to invisible controls has changed to work more intuitively. For example: The below controls A, B, C are anchored (C.Left to B.Right and B.Left to A.Right):

 +---+ +---+ +---+
 | A | | B | | C |
 +---+ +---+ +---+

If B is hidden (Visible:=false) then C.Left will skip B and use the right of A, resulting in

 +---+ +---+
 | A | | C |
 +---+ +---+