Sign in Join
Wiki copytemporary

LCL AutoSizing/ru: what changed

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

OldNewLine
11## Обзор / Терминология
22
33На этой странице объясняется алгоритм автомасштабирования в LCL. AutoSizing означает здесь: автоматическое изменение размера и перемещение элементов управления LCL.
44
55Если вам просто интересно, как использовать свойства AutoSize, см. [[Autosize / Layout/ru|Autosize/Layout]].
66
77## Свойства
88
99Следующие свойства определяют поведение автомасштабирования в LCL:
1010
1111- Current Left,Top,Width,Height,ClientWidth,ClientHeight
1212- Loaded Left,Top,Width,Height,ClientWidth,ClientHeight
1313- AutoSize
1414- Anchors
1515- AnchorSides
1616- Align
1717- BorderSpacing
1818- ChildSizing
1919- Constraints
2020
2121Для совместимости с Delphi LCL поддерживает метод AdjustClientRect, который является расширением свойств ChildSize.LeftRightSpacing/TopBottomSpacing.
2222
2323## Порядок
2424
2525### Обзор
2626
2727Автомасштабирование работает в несколько этапов:
2828
2929- DisableAutosizing. На первом этапе приложение изменяет свойства, создает или удаляет элементы управления. Вся форма заблокирована. Отсутствует автоматическая настройка, никакие границы в виджет не отправляются .
3030- EnableAutoSizing. Вызывается \[методом\] DoAllAutoSize родительской формы.
3131- Все необходимые дескрипторы создаются рекурсивно \[методом\] TWinControl.DoAllAutoSize. Они еще не сделаны видимыми.
3232- \[Метод\] TControl.DoAllAutoSize вычисляет границы, вызывая DoAutoSize для всех элементов управления. Он делает это в цикле, пока никакие границы не изменены.
3333- Границы отправляются в виджет (TWinControl.RealizeBoundsRecursive вызывает RealizeBounds).
3434- Дескрипторы становятся видимыми (если \[свойство\] HandleObjectShouldBeVisible \[имеет значение True\] и not Showing, то \[вызывается\] UpdateShowing).
3535
3636В основном свойство AutoSizing работает в следующем порядке:
3737
3838- Ограничения применяются к каждому шагу.
3939- Сначала идет выравнивание в порядке alTop, alBottom, alLeft, alRight и, наконец, alClient. Например, alLeft имеет 3 выровненных стороны и одну свободную сторону. Свободная сторона обрабатывается приведенными ниже правилами. BorderSpacing применяется к выровненным сторонам. alCustom и alNone не имеют выровненных сторон.
4040- Далее идет ChildSizing. Если ChildSizing.Layout не \[в значении\] cclNone, все дочерние элементы управления со \[значениями\] Align=alNone, Anchors=\[akLeft,akTop\] и элементы управления без AnchorSide масштабируются/репозиционируются. Эти дочерние элементы управления называются на этой странице "элементы управления без выравнивания".
4141- Затем идет AutoSize. Если ChildSizing.Layout \[имеет значение\] cclNone, тогда все "элементы управления без выравнивания" перемещаются кверху и влево, а элемент управления сужается или расширяется, чтобы соответствовать всем его дочерним элементам (а не только "элементам управления без выравнивания").
4242- Потом идут якоря (привязки). Только те стороны \[считаются\] привязанными, которые не обрабатываются \[свойством\] Align (например, akRight в alLeft). Если у элемента управления установлено \[свойство\] AnchorSide, сторона \[этого контрола\] будет выровнена к стороне другого элемента управления. В противном случае применяются правила привязки по умолчанию, которые в основном аналогичны Delphi.
4343- Каждое изменение границ запускает событие OnResize/OnChangeBounds, которое может использоваться приложением для выполнения произвольных действий.
4444
4545### Алгоритм выравнивания и привязки
4646
4747Основным методом является TWinControl.AlignControls.
4848
49491. инициация RemainingClientRect в ClientRect и RemainingBorderSpace в Rect(0,0,0,0)
50502. вызов AdjustClient, чтобы настроить RemainingClientRect
51513. применение ChildSizing.LeftRightSpacing,ChildSizing.TopBottomSpacing
52524. вызов DoAlign с alTop,alBottom,alLeft,alRight,alClient,alCustom,alNone
5353 1. DoAlign собирает дочерние элементы управления с этим значением Align и вызывает для каждого такого контрола DoPosition
5454 1. DoPosition вычисляет новые Left,Top,Width,Height
5555
5656### DoAutoSize
5757
5858Этот \[метод\] вызывается \[методом\] DoAllAutoSize и не должен вызываться приложением. Приложения должны вызывать AdjustSize и/или InvalidatePreferredSize.
5959
6060Если он не переопределен, нормальный TWinControl.DoAutoSize делает следующее, когда AutoSize=true:
6161
6262Он будет перемещать "элементы управления без выравнивания" - дочерние элементы управления с привязками по умолчанию (Anchors=\[akLeft,akTop\],Align=alNone). Он переместит все их одинаковое количество, поэтому их общий ограничивающий прямоугольник растягивается влево и вверх. Рассматривается интервал между BorderSpacing и ChildSize.\
6363Перед перемещением есть место слева и над кнопками:
6464
65-<figure>
66-<img src="Autosize_before_move_childs.png" title="Autosize_before_move_childs.png" />
67-<figcaption>Autosize_before_move_childs.png</figcaption>
68-</figure>
65+![](/wiki-images/a/ab/Autosize_before_move_childs.png)
6966
7067После перемещения:
7168
72-<figure>
73-<img src="Autosize_after_move_childs.png" title="Autosize_after_move_childs.png" />
74-<figcaption>Autosize_after_move_childs.png</figcaption>
75-</figure>
69+![](/wiki-images/6/61/Autosize_after_move_childs.png)
7670
7771Затем вычисляется предпочтительный размер элемента управления. В этом расчете учитываются дочерние элементы управления, Align, Anchors, Constraints, ChildSizing.Layout и другие свойства LCL.
7872
7973Размер элемента управления изменен:
8074
81-<figure>
82-<img src="Autosize_after_shrink.png" title="Autosize_after_shrink.png" />
83-<figcaption>Autosize_after_shrink.png</figcaption>
84-</figure>
75+![](/wiki-images/3/33/Autosize_after_shrink.png)
8576
8677См. также: [[Autosize / Layout/ru|Выравнивание и свойство AutoSize родителя]]
8778
8879### DisableAutoSizing/EnableAutosizing
8980
9081см [[Autosize / Layout/ru|здесь]].
9182
9283### Отличия от Delphi
9384
9485- Delphi не имеет BorderSpacing, AnchorSides, ChildSizing.
9586- Delphi не поддерживает AutoSize и Align на всех элементах управления.
9687- Алгоритм автомасштабирования Delphi не поддерживает вложенные автомасштабируемые элементы управления со свойством Align. Например, Panel1 с Align=alTop в Panel2 и обе панели имеют AutoSize=true. Panel2 не будет уменьшаться/увеличиваться по горизонтали, что означает, что Panel1 также не будет уменьшаться/увеличиваться. Таким образом, Panel1 не имеет автомасштабирования для своих дочерних элементов.
9788
9889## FAQ
9990
10091см. [[Autosize / Layout/ru|Autosize / Layout]].
10192
10293---
10394*From the Free Pascal wiki, page "LCL AutoSizing/ru", as it stood on 2018-12-09 after a change by FTurtle, 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