Sign in Join
Wiki copytemporary

Anchor Sides/de: what changed

Revision 4 to 5. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11Es gibt einige neue Eigenschaften und Methoden für das automatische Layout von Steuerelementen. Sie können jetzt Bedienelemente so einstellen, dass sie einen bestimmten Abstand zu anderen Bedienelementen einhalten, oder relativ zu anderen Bedienelementen zentrieren. Siehe unten für Beispiele.
22
33Jede 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. Jedes Mal, wenn das Label bewegt wird oder in der Größe angepasst wird, dann wird die linke Seite des Edit folgen, was normalerweise zu einer Bewegung des Edit parallel zum Label führt.
44
55# Beispiel 1
66
7-`+--------+ +-------+`\
8-`| Label1 | | Edit1 |`\
9-`+--------+ |       |`\
10-`           +-------+`
7+```
8++--------+ +-------+
9+| Label1 | | Edit1 |
10++--------+ | |
11+ +-------+
12+```
1113
1214## Im Code
1315
1416``` pascal
1517Edit1.AnchorSide[akLeft].Side:=asrRight;
1618Edit1.AnchorSide[akLeft].Control:=Label1;
1719Edit1.Anchors:=Edit1.Anchors+[akLeft];
1820```
1921
2022Sie können den Abstand mit den Eigenschaften von BorderSpacing definieren:
2123
2224``` pascal
2325Edit1.BorderSpacing.Left:=10;
2426```
2527
2628Das selbe kann mit der Methode gemacht werden:
2729
2830``` pascal
2931Edit1.AnchorToNeighbour(akLeft,10,Label1);
3032```
3133
3234## Anmerkungen
3335
3436Edit1.Left wird Label1.Left+Label1.Width folgen, nicht umgekehrt. Das bedeutet, dass 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. Dies kann zusammen mit einigen anderen Autosize-Eigenschaften eine Endlosschleife verursachen. Ist Parent.AutoSize auf true gesetzt, wird dies von der LCL ignoriert oder automatisch repariert.
3537
3638## Mittels des Ankereditors
3739
3840Der Ankereditor ist ein schwebendes Fenster, den Sie erreichen über das Menü **Ansicht / Ankereditor anzeigen** oder über die Schaltfläche in der Eigenschaft **Anchors** des Objektinspektors.
3941
4042![](/wiki-images/d/dd/Anchor_Editor_de.png)
4143
4244# Beispiel 2
4345
4446Sie können die obere Seite von Edit1 so verankern, dass sie der oberen Seite von Label1 folgt:
4547
4648 +--------+ +-------+
4749 | Label1 | | Edit1 |
4850 +--------+ | |
4951 +-------+
5052
5153``` pascal
5254Edit1.AnchorSide[akTop].Side:=asrTop;
5355Edit1.AnchorSide[akTop].Control:=Label1;
5456Edit1.Anchors:=Edit1.Anchors+[akTop];
5557```
5658
5759Das selbe kann mit der Methode gemacht werden:
5860
5961``` pascal
6062Edit1.AnchorParallel(akTop,0,Label1);
6163```
6264
6365# Beispiel 3
6466
6567Vertikale Zentrierung von Label1 an Edit1:
6668
6769 +-------+
6870 +--------+ | |
6971 | Label1 | | Edit1 |
7072 +--------+ | |
7173 +-------+
7274
7375``` pascal
7476Edit1.AnchorSide[akTop].Side:=asrCenter;
7577Edit1.AnchorSide[akTop].Control:=Label1;
7678Edit1.Anchors:=Edit1.Anchors+[akTop]-[akBottom];
7779```
7880
7981Das selbe kann mit der Methode gemacht werden:
8082
8183``` pascal
8284Edit1.AnchorVerticalCenterTo(Label1);
8385```
8486
8587Offensichtlich ist die Verankerung der unteren Seite von Edit1 bei einer Zentrierung nicht sinnvoll.
8688
8789# Neue Eigenschaft
8890
8991``` pascal
9092property AnchorSide[Kind: TAnchorKind]: TAnchorSide read GetAnchorSide;
9193```
9294
9395Dies wird nicht im Objektinspektor veröffentlicht. Sie können sie zur Entwicklungszeit mit dem Ankereditor bearbeiten (Menü: Ansicht -\> Ankereditor anzeigen, oder auf den Button der 'Anchors' Eigenschaft klicken).
9496
9597# Neue Methoden zur einfachen Konfiguration eines gebräuchlichen Layouts
9698
9799``` pascal
98100procedure AnchorToNeighbour(Side: TAnchorKind; Space: integer;
99101 Sibling: TControl);
100102procedure AnchorParallel(Side: TAnchorKind; Space: integer;
101103 Sibling: TControl);
102104procedure AnchorHorizontalCenterTo(Sibling: TControl);
103105procedure AnchorVerticalCenterTo(Sibling: TControl);
104106procedure AnchorAsAlign(TheAlign: TAlign; Space: Integer);
105107```
106108
107109AnchorVerticalCenterTo arbetet auch mit Eltern. Dann wird auf den Client-Bereich zentriert, das bedeutet die Mitte des Steuerelements ist bei *ClientHeight div 2*.
108110
109111Das zentrierte Verankern ist noch nicht vollständig unterstützt für die Berechnung der Größe der Eltern. Wenn Sie beispielsweise ein Label in einer Groupbox1 zentriert verankern und Groupbox1.AutoSize auf true setzen, dann schrumpft die Höhe der Groupbox1 und läßt keinen Platz für das Label. Die Lösung besteht darin, auf ein Steuerelement zu zentrieren, das selbst nicht zentriert ist. Zum Beispiel zentriere ein Label1 auf eine ComboBox und nimm für die ComboBox die vorgegebenen Anker (Anchors=\[akLeft,akTop\]).
110112
111113# Verankern an unsichtbaren Kontrollelementen
112114
113115Ab Version 0.9.25 rev 12800 wurde das Verankern an unsichtbaren Kontrollelemente geändert, damit es intuitiver arbeitet. Beispiel: Die Kontrollelemente A, B und C sind wie folgt verankert (C.Left an B.Right und B.Left an A.Right):
114116
115-` +---+ +---+ +---+`\
116-` | A | | B | | C |`\
117-` +---+ +---+ +---+`
117+```
118+ +---+ +---+ +---+
119+ | A | | B | | C |
120+ +---+ +---+ +---+
121+```
118122
119123Ist B unsichtbar (Visible:=false), wird C.Left B überspringen und sich an der rechten Seite von A verankern, womit das Ganze dann so aussieht:
120124
121-` +---+ +---+`\
122-` | A | | C |`\
123-` +---+ +---+`
125+```
126+ +---+ +---+
127+ | A | | C |
128+ +---+ +---+
129+```
124130
125131# Zirkuläre Bezüge
126132
127133Sie erhalten einen Zirkularbezug, wenn Sie zwei Seiten an der jeweils anderen verankern. Dies liefert eine unmögliche Verankerung. Die LCL bemerkt das, löst aber keine Exception aus, weil es sich um einen temporären Kreis handeln könnte. Zum Beispiel: Eine Reihe von Schaltflächen. Button1 ist links von Button2, Button2 ist links von Button3. Jetzt verändern wir die Reihenfolge zu: Button3, Button1, Button2. Wenn die Verankerung mit Button3 startet, entsteht ein temporärer Kreis der aufgelöst wird, wenn das Umordnen abgeschlossen ist. Die LCL entdeckt Kreise und wird den Button nicht verschieben. Kreise sind nicht die einzige Anomalie.
128134
129135Es gibt eine Ausnahme zu dieser Regel. Wenn Parent.AutoSize wahr ist, dann bricht die LCL beim Autosize Kreise automatisch auf und schreibt eine Warnung über debugln (Windows: --debug-log.txt, Linux, et al: stdout). Welcher Anker aufgebrochen wird hängt von der Reihenfolge der Steuerelemente und der Seiten ab. Deshalb sind temporäre Kreise erlaubt mit AutoSize:=true wenn Sie die Änderungen einschließen in
130136
131137``` pascal
132138Parent.DisableAutosizing;
133139try
134140 // change anchors, aligns, bounds...
135141finally
136142 Parent.EnableAutosizing;
137143end;
138144```
139145
140146Der AutoSize-Algorithmus bricht nicht nur Kreisbezüge auf, sondern beseitigt auch Inkonsistenzen mit Align/AnchorSide.
141147
142148Eventuell wäre es günstig, im Designer Hinweise darauf einzufügen oder ein Werkzeug zum Auflisten der Kreisbezüge und Inkonsistenzen.
143149
144150# Siehe auch
145151
146152- [[Autosize / Layout]]
147153- [[LCL AutoSizing]]
148154- [[Example: Anchors. How to reliably align dynamically created controls under changing visibility]]
149155
150156---
151157*From the Free Pascal wiki, page "Anchor Sides/de", as it stood on 2020-02-06 after a change by GAN, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
152158Category: Lazarus/de

Back to history