Sign in Join
Wiki copytemporary

Anchor Sides/ja: what changed

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

OldNewLine
11コントロールのレイアウトを自動的に行うために、いくつかの新しいプロパティ、メソッドが存在します。コントロールの座標を、他のコントロールから一定の距離を保つように設定したり、他のコントロールを基準にして中央揃えにしたりすることができます。下記の例を参照してください。
22
33Each of the four sides of a control (Left, Top, Right, Bottom) can now be anchored/bound to a side of another control. For example you can now anchor the left side of TEdit to the right side of a TLabel. Everytime the Label is moved or resized the Edit's left side will follow, which normally results in moving the Edit parallel to the Label.
44
55# 例 1
66
77`+--------+ +-------+`\
88`| Label1 | | Edit1 |`\
99`+--------+ |       |`\
1010`           +-------+`
1111
1212## コーディング内容
1313
1414``` pascal
1515Edit1.AnchorSide[akLeft].Side := asrRight;
1616Edit1.AnchorSide[akLeft].Control := Label1;
1717Edit1.Anchors := Edit1.Anchors + [akLeft];
1818```
1919
2020BorderSpacing プロパティで距離を指定できます。
2121
2222``` pascal
2323Edit1.BorderSpacing.Left := 10;
2424```
2525
2626メソッドを使うことでもできます。
2727
2828``` pascal
2929Edit1.AnchorToNeighbour(akLeft, 10, Label1);
3030```
3131
3232## Notes
3333
3434The Edit1.Left will follow Label1.Left+Label1.Width, not the other way around. That means, moving Label1 will move Edit1. But moving Edit1 will be undone by the LCL. If you also anchor the right side of Label1 to the left side of Edit1, you created a circle, and this can result together with some other autosize properties in a loop. This is ignored by the LCL or automagically repaired when the Parent.AutoSize is true.
3535
3636## Via the Anchor Editor
3737
3838The anchor editor is a floating window that is available via the menu **View / Anchor Editor** or via the button on the **Anchors** property in the object inspector.
3939
40-<figure>
41-<img src="Anchoreditor.png" title="Anchoreditor.png" />
42-<figcaption>Anchoreditor.png</figcaption>
43-</figure>
40+![](/wiki-images/6/6d/Anchoreditor.png)
4441
4542# 例 2
4643
4744You can anchor the Edit's top side to follow the Label's top side:
4845
4946 +--------+ +-------+
5047 | Label1 | | Edit1 |
5148 +--------+ | |
5249 +-------+
5350
5451``` pascal
5552Edit1.AnchorSide[akTop].Side := asrTop;
5653Edit1.AnchorSide[akTop].Control := Label1;
5754Edit1.Anchors := Edit1.Anchors + [akTop];
5855```
5956
6057メソッドを使うことでもできます。
6158
6259``` pascal
6360Edit1.AnchorParallel(akTop,0,Label1);
6461```
6562
6663# 例 3
6764
6865Centering a Label vertically to an Edit:
6966
7067 +-------+
7168 +--------+ | |
7269 | Label1 | | Edit1 |
7370 +--------+ | |
7471 +-------+
7572
7673``` pascal
7774Edit1.AnchorSide[akTop].Side := asrCenter;
7875Edit1.AnchorSide[akTop].Control := Label1;
7976Edit1.Anchors := Edit1.Anchors + [akTop] - [akBottom];
8077```
8178
8279メソッドを使うことでもできます。
8380
8481``` pascal
8582Edit1.AnchorVerticalCenterTo(Label1);
8683```
8784
8885Obviously anchoring the bottom side of Edit1 does not make sense when centering.
8986
9087# 新しいプロパティ
9188
9289``` pascal
9390property AnchorSide[Kind: TAnchorKind]: TAnchorSide read GetAnchorSide;
9491```
9592
9693This is not published in the [[IDE Window: Object Inspector|object inspector]]. You can edit it in the designer via the [[IDE Window: Anchor Editor|anchor editor]] (Menu: View -\> View anchor editor, or click on button of 'Anchors' property).
9794
9895# New methods to easily configure common layouts
9996
10097``` pascal
10198procedure AnchorToNeighbour(Side: TAnchorKind; Space: integer;
10299 Sibling: TControl);
103100procedure AnchorParallel(Side: TAnchorKind; Space: integer;
104101 Sibling: TControl);
105102procedure AnchorHorizontalCenterTo(Sibling: TControl);
106103procedure AnchorVerticalCenterTo(Sibling: TControl);
107104procedure AnchorAsAlign(TheAlign: TAlign; Space: Integer);
108105```
109106
110107AnchorVerticalCenterTo works with Parent too. Then it will center on the client area, that means the center of the control is at *ClientHeight div 2*.
111108
112109Center anchoring is not yet fully supported when computing the size of the parent. For example when you put a label center anchored into a Groupbox1 and set Groupbox1.AutoSize to true then Groupbox1 height will shrink leaving no space for the label. The solution is to center to a control that is not centered. For example center a Label1 to a ComboBox and use for the ComboBox the default anchors (Anchors=\[akLeft,akTop\]).
113110
114111# Anchoring to invisible controls
115112
116113Since 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):
117114
118115` +---+ +---+ +---+`\
119116` | A | | B | | C |`\
120117` +---+ +---+ +---+`
121118
122119If B is hidden (Visible:=false) then C.Left will skip B and use the right of A, resulting in
123120
124121` +---+ +---+`\
125122` | A | | C |`\
126123` +---+ +---+`
127124
128125# Circular references
129126
130127You can build circular references by anchoring two sides to each other, which creates an impossible anchoring. The LCL notices that, but will not raise an exception, because it can be a temporary circle. For example: A row of buttons. Button1 is left of Button2, Button2 is left of Button3. Now the order is changed to: Button3, Button1, Button2. If the reanchoring is started with Button3, a circle is created temporarily and is fixed when the reordering is completed. The LCL detects circles and will not move the Button. Circles are not the only anomaly.
131128
132129There is one exception to this rule. If the Parent.AutoSize is true, then the LCL will automatically break circles on autosize and writes a warning via debugln (windows: --debug-log.txt, linux, et al: stdout). Which anchor is broken depends on the order of controls and the sides. So, temporary circles are still allowed with AutoSize=true if you enclose the change in
133130
134131``` pascal
135132Parent.DisableAutosizing;
136133try
137134 // change anchors, aligns, bounds...
138135finally
139136 Parent.EnableAutosizing;
140137end;
141138```
142139
143140The AutoSize algorithm does not only break circles, but fixes Align/AnchorSide inconsistencies too.
144141
145142Eventually it would be good to add some hints in the designer or a tool to list the circles and inconsistencies.
146143
147144# 関連情報
148145
149146- [[Autosize / Layout]]
150147- [[Example: Anchors. How to reliably align dynamically created controls under changing visibility]]
151148
152149---
153150*From the Free Pascal wiki, page "Anchor Sides/ja", as it stood on 2020-02-09 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).*

Back to history