Sign in Join
Wiki copytemporary

Anchor Sides/de: what changed

Revision 5 to 6. 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-```
7+```text
88+--------+ +-------+
99| Label1 | | Edit1 |
1010+--------+ | |
1111 +-------+
1212```
1313
1414## Im Code
1515
1616``` pascal
1717Edit1.AnchorSide[akLeft].Side:=asrRight;
1818Edit1.AnchorSide[akLeft].Control:=Label1;
1919Edit1.Anchors:=Edit1.Anchors+[akLeft];
2020```
2121
2222Sie können den Abstand mit den Eigenschaften von BorderSpacing definieren:
2323
2424``` pascal
2525Edit1.BorderSpacing.Left:=10;
2626```
2727
2828Das selbe kann mit der Methode gemacht werden:
2929
3030``` pascal
3131Edit1.AnchorToNeighbour(akLeft,10,Label1);
3232```
3333
3434## Anmerkungen
3535
3636Edit1.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.
3737
3838## Mittels des Ankereditors
3939
4040Der 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.
4141
4242![](/wiki-images/d/dd/Anchor_Editor_de.png)
4343
4444# Beispiel 2
4545
4646Sie können die obere Seite von Edit1 so verankern, dass sie der oberen Seite von Label1 folgt:
4747
4848 +--------+ +-------+
4949 | Label1 | | Edit1 |
5050 +--------+ | |
5151 +-------+
5252
5353``` pascal
5454Edit1.AnchorSide[akTop].Side:=asrTop;
5555Edit1.AnchorSide[akTop].Control:=Label1;
5656Edit1.Anchors:=Edit1.Anchors+[akTop];
5757```
5858
5959Das selbe kann mit der Methode gemacht werden:
6060
6161``` pascal
6262Edit1.AnchorParallel(akTop,0,Label1);
6363```
6464
6565# Beispiel 3
6666
6767Vertikale Zentrierung von Label1 an Edit1:
6868
6969 +-------+
7070 +--------+ | |
7171 | Label1 | | Edit1 |
7272 +--------+ | |
7373 +-------+
7474
7575``` pascal
7676Edit1.AnchorSide[akTop].Side:=asrCenter;
7777Edit1.AnchorSide[akTop].Control:=Label1;
7878Edit1.Anchors:=Edit1.Anchors+[akTop]-[akBottom];
7979```
8080
8181Das selbe kann mit der Methode gemacht werden:
8282
8383``` pascal
8484Edit1.AnchorVerticalCenterTo(Label1);
8585```
8686
8787Offensichtlich ist die Verankerung der unteren Seite von Edit1 bei einer Zentrierung nicht sinnvoll.
8888
8989# Neue Eigenschaft
9090
9191``` pascal
9292property AnchorSide[Kind: TAnchorKind]: TAnchorSide read GetAnchorSide;
9393```
9494
9595Dies 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).
9696
9797# Neue Methoden zur einfachen Konfiguration eines gebräuchlichen Layouts
9898
9999``` pascal
100100procedure AnchorToNeighbour(Side: TAnchorKind; Space: integer;
101101 Sibling: TControl);
102102procedure AnchorParallel(Side: TAnchorKind; Space: integer;
103103 Sibling: TControl);
104104procedure AnchorHorizontalCenterTo(Sibling: TControl);
105105procedure AnchorVerticalCenterTo(Sibling: TControl);
106106procedure AnchorAsAlign(TheAlign: TAlign; Space: Integer);
107107```
108108
109109AnchorVerticalCenterTo arbetet auch mit Eltern. Dann wird auf den Client-Bereich zentriert, das bedeutet die Mitte des Steuerelements ist bei *ClientHeight div 2*.
110110
111111Das 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\]).
112112
113113# Verankern an unsichtbaren Kontrollelementen
114114
115115Ab 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):
116116
117-```
117+```text
118118 +---+ +---+ +---+
119119 | A | | B | | C |
120120 +---+ +---+ +---+
121121```
122122
123123Ist B unsichtbar (Visible:=false), wird C.Left B überspringen und sich an der rechten Seite von A verankern, womit das Ganze dann so aussieht:
124124
125-```
125+```text
126126 +---+ +---+
127127 | A | | C |
128128 +---+ +---+
129129```
130130
131131# Zirkuläre Bezüge
132132
133133Sie 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.
134134
135135Es 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
136136
137137``` pascal
138138Parent.DisableAutosizing;
139139try
140140 // change anchors, aligns, bounds...
141141finally
142142 Parent.EnableAutosizing;
143143end;
144144```
145145
146146Der AutoSize-Algorithmus bricht nicht nur Kreisbezüge auf, sondern beseitigt auch Inkonsistenzen mit Align/AnchorSide.
147147
148148Eventuell wäre es günstig, im Designer Hinweise darauf einzufügen oder ein Werkzeug zum Auflisten der Kreisbezüge und Inkonsistenzen.
149149
150150# Siehe auch
151151
152152- [[Autosize / Layout]]
153153- [[LCL AutoSizing]]
154154- [[Example: Anchors. How to reliably align dynamically created controls under changing visibility]]
155155
156156---
157157*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).*
158158Category: Lazarus/de

Back to history