LCL AutoSizing
From Lazarus-ccr
Contents |
[edit] Overview / Terminology
This page explains the LCL auto sizing algorithm. AutoSizing means here: Automatic resizing and repositioning of LCL controls.
If you are merely interested in how to use the AutoSize properties, see Autosize_/_Layout.
[edit] Properties
The following properties defines the behavior of the LCL autosizing:
- Current Left,Top,Width,Height,ClientWidth,ClientHeight
- Loaded Left,Top,Width,Height,ClientWidth,ClientHeight
- AutoSize
- Anchors
- AnchorSides
- Align
- BorderSpacing
- ChildSizing
- Constraints
For Delphi compatibility the LCL supports the method AdjustClientRect which is an extension to the ChildSizing.LeftRightSpacing/TopBottomSpacing properties.
[edit] Order
[edit] Overview
Basically AutoSizing works in this order:
- The constraints are applied to every step.
- First comes the Align in order alTop, alBottom, alLeft, alRight and finally alClient. For example alLeft has 3 aligned sides and one free side. The free side is handled by the below rules. BorderSpacing is applied to aligned sides. alCustom and alNone have no aligned sides.
- Next comes ChildSizing. If ChildSizing.Layout is not cclNone then all child controls with Align=alNone, Anchors=[akLeft,aklRight] and no AnchorSide controls are resized/positioned. These child controls are called on this page "non aligned controls".
- Next comes AutoSize. If ChildSizing.Layout is cclNone then all "non aligned controls" are moved to the top, left and the control is shrinked/enlarged to fit around all its childs (not only the "non aligned controls").
- Next comes the Anchors. Only those sides are anchored, which were not handled by Align (e.g. akRight on alLeft). If a AnchorSide control is set the side will be aligned to the side of the other control. Otherwise the default anchor rules apply, which are mostly similar to the Delphi ones.
[edit] Algorithm
The main method is TWinControl.AlignControls.
- init RemainingClientRect to ClientRect and RemainingBorderSpace to Rect(0,0,0,0)
- call AdjustClient to adjust RemainingClientRect
- apply ChildSizing.LeftRightSpacing,ChildSizing.TopBottomSpacing
- call DoAlign with alTop,alBottom,alLeft,alRight,alClient,alCustom,alNone
- DoAlign collects child controls with this Align value and call for each such control DoPosition
- DoPosition calculates the new Left,Top,Width,Height
- DoAlign collects child controls with this Align value and call for each such control DoPosition
[edit] Differences to Delphi
- Delphi has no BorderSpacing, AnchorSides, ChildSizing.
- Delphi does not support AutoSize and Align on all controls.
- Delphi's AutoSize algorithm does not support nested autosized controls with the Align property. For example a Panel1 with Align=alTop in a Panel2 and both panels have AutoSize=true. Panel2 will not shrink/enlarge horizontally, which means Panel1 will not shrink/enlarge neither. So, Panel1 is not autosized to the needed size for its childs.
[edit] FAQ
see Autosize_/_Layout.
