Sign in Join
Wiki copytemporary

Revision 1 of 2, by FTurtle on 12-9-2018. The page as it is now.

LCL AutoSizing/ru

Обзор / Терминология

На этой странице объясняется алгоритм автомасштабирования в LCL. AutoSizing означает здесь: автоматическое изменение размера и перемещение элементов управления LCL.

Если вам просто интересно, как использовать свойства AutoSize, см. Autosize/Layout.

Свойства

Следующие свойства определяют поведение автомасштабирования в LCL:

Для совместимости с Delphi LCL поддерживает метод AdjustClientRect, который является расширением свойств ChildSize.LeftRightSpacing/TopBottomSpacing.

Порядок

Обзор

Автомасштабирование работает в несколько этапов:

В основном свойство AutoSizing работает в следующем порядке:

Алгоритм выравнивания и привязки

Основным методом является TWinControl.AlignControls.

  1. инициация RemainingClientRect в ClientRect и RemainingBorderSpace в Rect(0,0,0,0)
  2. вызов AdjustClient, чтобы настроить RemainingClientRect
  3. применение ChildSizing.LeftRightSpacing,ChildSizing.TopBottomSpacing
  4. вызов DoAlign с alTop,alBottom,alLeft,alRight,alClient,alCustom,alNone
    1. DoAlign собирает дочерние элементы управления с этим значением Align и вызывает для каждого такого контрола DoPosition
    2. DoPosition вычисляет новые Left,Top,Width,Height

DoAutoSize

Этот [метод] вызывается [методом] DoAllAutoSize и не должен вызываться приложением. Приложения должны вызывать AdjustSize и/или InvalidatePreferredSize.

Если он не переопределен, нормальный TWinControl.DoAutoSize делает следующее, когда AutoSize=true:

Он будет перемещать "элементы управления без выравнивания" - дочерние элементы управления с привязками по умолчанию (Anchors=[akLeft,akTop],Align=alNone). Он переместит все их одинаковое количество, поэтому их общий ограничивающий прямоугольник растягивается влево и вверх. Рассматривается интервал между BorderSpacing и ChildSize.
Перед перемещением есть место слева и над кнопками:

<figure> <img src="Autosize_before_move_childs.png" title="Autosize_before_move_childs.png" /> <figcaption>Autosize_before_move_childs.png</figcaption> </figure>

После перемещения:

<figure> <img src="Autosize_after_move_childs.png" title="Autosize_after_move_childs.png" /> <figcaption>Autosize_after_move_childs.png</figcaption> </figure>

Затем вычисляется предпочтительный размер элемента управления. В этом расчете учитываются дочерние элементы управления, Align, Anchors, Constraints, ChildSizing.Layout и другие свойства LCL.

Размер элемента управления изменен:

<figure> <img src="Autosize_after_shrink.png" title="Autosize_after_shrink.png" /> <figcaption>Autosize_after_shrink.png</figcaption> </figure>

См. также: Выравнивание и свойство AutoSize родителя

DisableAutoSizing/EnableAutosizing

см здесь.

Отличия от Delphi

FAQ

см. Autosize / Layout.


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.