Sign in Join
Wiki copytemporary

Anchor Sides/de: what changed

Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
1-Es 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.
1+Es 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
3-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. 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.
3+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. 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
5-# Beispiel 1
5+## Contents
66
7-`+--------+ +-------+`\
8-`| Label1 | | Edit1 |`\
9-`+--------+ |       |`\
10-`           +-------+`
7+ * 1 Beispiel 1
8+ * 1.1 Im Code
9+ * 1.2 Anmerkungen
10+ * 1.3 Mittels des Ankereditors
11+ * 2 Beispiel 2
12+ * 3 Beispiel 3
13+ * 4 Neue Eigenschaft
14+ * 5 Neue Methoden zur einfachen Konfiguration eines gebräuchlichen Layouts
15+ * 6 Verankern an unsichtbaren Kontrollelementen
16+ * 7 Zirkuläre Bezüge
17+ * 8 Siehe auch
1118
12-## Im Code
19+# Beispiel 1
20+```
21++--------+ +-------+
22+ | Label1 | | Edit1 |
23+ +--------+ | |
24+ +-------+
25+```
1326
14-``` pascal
27+## Im Code
28+```
1529Edit1.AnchorSide[akLeft].Side:=asrRight;
16-Edit1.AnchorSide[akLeft].Control:=Label1;
17-Edit1.Anchors:=Edit1.Anchors+[akLeft];
30+ Edit1.AnchorSide[akLeft].Control:=Label1;
31+ Edit1.Anchors:=Edit1.Anchors+[akLeft];
1832```
1933
20-Sie können den Abstand mit den Eigenschaften von BorderSpacing definieren:
21-
22-``` pascal
34+Sie können den Abstand mit den Eigenschaften von BorderSpacing definieren:
35+```
2336Edit1.BorderSpacing.Left:=10;
2437```
2538
26-Das selbe kann mit der Methode gemacht werden:
27-
28-``` pascal
39+Das selbe kann mit der Methode gemacht werden:
40+```
2941Edit1.AnchorToNeighbour(akLeft,10,Label1);
3042```
3143
3244## Anmerkungen
3345
34-Edit1.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.
46+Edit1.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.
3547
3648## Mittels des Ankereditors
3749
38-Der 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.
50+Der 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.
3951
40-![](/wiki-images/d/dd/Anchor_Editor_de.png)
52+[![Anchor Editor de.png](/wiki-images/d/dd/Anchor_Editor_de.png)](</File:Anchor_Editor_de.png>)
4153
4254# Beispiel 2
4355
44-Sie können die obere Seite von Edit1 so verankern, dass sie der oberen Seite von Label1 folgt:
45-
46- +--------+ +-------+
56+Sie können die obere Seite von Edit1 so verankern, dass sie der oberen Seite von Label1 folgt:
57+```
58++--------+ +-------+
4759 | Label1 | | Edit1 |
4860 +--------+ | |
4961 +-------+
50-
51-``` pascal
62+```
63+```
5264Edit1.AnchorSide[akTop].Side:=asrTop;
53-Edit1.AnchorSide[akTop].Control:=Label1;
54-Edit1.Anchors:=Edit1.Anchors+[akTop];
65+ Edit1.AnchorSide[akTop].Control:=Label1;
66+ Edit1.Anchors:=Edit1.Anchors+[akTop];
5567```
5668
57-Das selbe kann mit der Methode gemacht werden:
58-
59-``` pascal
69+Das selbe kann mit der Methode gemacht werden:
70+```
6071Edit1.AnchorParallel(akTop,0,Label1);
6172```
6273
6374# Beispiel 3
6475
65-Vertikale Zentrierung von Label1 an Edit1:
66-
67- +-------+
76+Vertikale Zentrierung von Label1 an Edit1:
77+```
78++-------+
6879 +--------+ | |
6980 | Label1 | | Edit1 |
7081 +--------+ | |
7182 +-------+
72-
73-``` pascal
83+```
84+```
7485Edit1.AnchorSide[akTop].Side:=asrCenter;
75-Edit1.AnchorSide[akTop].Control:=Label1;
76-Edit1.Anchors:=Edit1.Anchors+[akTop]-[akBottom];
86+ Edit1.AnchorSide[akTop].Control:=Label1;
87+ Edit1.Anchors:=Edit1.Anchors+[akTop]-[akBottom];
7788```
7889
79-Das selbe kann mit der Methode gemacht werden:
80-
81-``` pascal
90+Das selbe kann mit der Methode gemacht werden:
91+```
8292Edit1.AnchorVerticalCenterTo(Label1);
8393```
8494
85-Offensichtlich ist die Verankerung der unteren Seite von Edit1 bei einer Zentrierung nicht sinnvoll.
95+Offensichtlich ist die Verankerung der unteren Seite von Edit1 bei einer Zentrierung nicht sinnvoll.
8696
8797# Neue Eigenschaft
88-
89-``` pascal
98+```
9099property AnchorSide[Kind: TAnchorKind]: TAnchorSide read GetAnchorSide;
91100```
92101
93-Dies 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).
102+Dies 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).
94103
95104# Neue Methoden zur einfachen Konfiguration eines gebräuchlichen Layouts
96-
97-``` pascal
105+```
98106procedure AnchorToNeighbour(Side: TAnchorKind; Space: integer;
99- Sibling: TControl);
100-procedure AnchorParallel(Side: TAnchorKind; Space: integer;
101- Sibling: TControl);
102-procedure AnchorHorizontalCenterTo(Sibling: TControl);
103-procedure AnchorVerticalCenterTo(Sibling: TControl);
104-procedure AnchorAsAlign(TheAlign: TAlign; Space: Integer);
107+ Sibling: TControl);
108+ procedure AnchorParallel(Side: TAnchorKind; Space: integer;
109+ Sibling: TControl);
110+ procedure AnchorHorizontalCenterTo(Sibling: TControl);
111+ procedure AnchorVerticalCenterTo(Sibling: TControl);
112+ procedure AnchorAsAlign(TheAlign: TAlign; Space: Integer);
105113```
106114
107-AnchorVerticalCenterTo arbetet auch mit Eltern. Dann wird auf den Client-Bereich zentriert, das bedeutet die Mitte des Steuerelements ist bei *ClientHeight div 2*.
115+AnchorVerticalCenterTo arbetet auch mit Eltern. Dann wird auf den Client-Bereich zentriert, das bedeutet die Mitte des Steuerelements ist bei _ClientHeight div 2_.
108116
109-Das 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\]).
117+Das 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]).
110118
111119# Verankern an unsichtbaren Kontrollelementen
112120
113-Ab 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):
114-
115-` +---+ +---+ +---+`\
116-` | A | | B | | C |`\
117-` +---+ +---+ +---+`
118-
119-Ist B unsichtbar (Visible:=false), wird C.Left B überspringen und sich an der rechten Seite von A verankern, womit das Ganze dann so aussieht:
121+Ab 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):
122+```
123++---+ +---+ +---+
124+ | A | | B | | C |
125+ +---+ +---+ +---+
126+```
120127
121-` +---+ +---+`\
122-` | A | | C |`\
123-` +---+ +---+`
128+Ist B unsichtbar (Visible:=false), wird C.Left B überspringen und sich an der rechten Seite von A verankern, womit das Ganze dann so aussieht:
129+```
130++---+ +---+
131+ | A | | C |
132+ +---+ +---+
133+```
124134
125135# Zirkuläre Bezüge
126136
127-Sie 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.
128-
129-Es 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
137+Sie 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.
130138
131-``` pascal
139+Es 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
140+```
132141Parent.DisableAutosizing;
133-try
134- // change anchors, aligns, bounds...
135-finally
136- Parent.EnableAutosizing;
137-end;
142+ try
143+ // change anchors, aligns, bounds...
144+ finally
145+ Parent.EnableAutosizing;
146+ end;
138147```
139148
140-Der AutoSize-Algorithmus bricht nicht nur Kreisbezüge auf, sondern beseitigt auch Inkonsistenzen mit Align/AnchorSide.
149+Der AutoSize-Algorithmus bricht nicht nur Kreisbezüge auf, sondern beseitigt auch Inkonsistenzen mit Align/AnchorSide.
141150
142-Eventuell wäre es günstig, im Designer Hinweise darauf einzufügen oder ein Werkzeug zum Auflisten der Kreisbezüge und Inkonsistenzen.
151+Eventuell wäre es günstig, im Designer Hinweise darauf einzufügen oder ein Werkzeug zum Auflisten der Kreisbezüge und Inkonsistenzen.
143152
144153# Siehe auch
145154
146-- [[Autosize / Layout]]
147-- [[LCL AutoSizing]]
148-- [[Example: Anchors. How to reliably align dynamically created controls under changing visibility]]
155+ * [[Autosize / Layout]]
156+ * [[LCL AutoSizing]]
157+ * [[Example: Anchors. How to reliably align dynamically created controls under changing visibility]]
149158
150159---
151-*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).*
152-Category: Lazarus/de
160+*From the Free Pascal wiki, page "Anchor Sides/de", as the Internet Archive kept it on 2023-01-27. 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).*

Back to history