Difference between revisions of "LCL AutoSizing/ru"

From Lazarus wiki
Jump to navigationJump to search
(Switched template, deleted English categories.)
 
(7 intermediate revisions by one other user not shown)
Line 1: Line 1:
{{MenuTranslate|page=LCL AutoSizing}}
+
{{LCL AutoSizing}}
 
 
----
 
<span style="color:#FF0000">ENG: '''AT THE MOMENT THIS PAGE IS UNDER TRANSLATION.''' <br /> RUS: '''В НАСТОЯЩИЙ МОМЕНТ СТРАНИЦА НАХОДИТСЯ В ПРОЦЕССЕ ПЕРЕВОДА.'''</span>
 
----
 
  
 
__TOC__
 
__TOC__
Line 68: Line 64:
 
Если он не переопределен, нормальный TWinControl.DoAutoSize делает следующее, когда AutoSize=true:
 
Если он не переопределен, нормальный TWinControl.DoAutoSize делает следующее, когда AutoSize=true:
  
It will move "non aligned controls" - child controls with default anchors (Anchors=[akLeft,akTop],Align=alNone). It moves all of them the same amount, so their total bounding box fits left and top. The spacing of BorderSpacing and ChildSizing is considered.
+
Он будет перемещать "элементы управления без выравнивания" - дочерние элементы управления с привязками по умолчанию (Anchors=[akLeft,akTop],Align=alNone). Он переместит все их одинаковое количество, поэтому их общий ограничивающий прямоугольник растягивается влево и вверх. Рассматривается интервал между BorderSpacing и ChildSize.<br />
 +
 
 +
Перед перемещением есть место слева и над кнопками:
  
Before the move, there is space to the left and above the buttons:
 
 
[[Image:Autosize before move childs.png]]
 
[[Image:Autosize before move childs.png]]
  
After the move:
+
После перемещения:
 +
 
 
[[Image:Autosize after move childs.png]]
 
[[Image:Autosize after move childs.png]]
  
Then the preferred size of the control is computed. This calculation considers child controls, Align, Anchors, Constraints, ChildSizing.Layout and the other LCL properties.  
+
Затем вычисляется предпочтительный размер элемента управления. В этом расчете учитываются дочерние элементы управления, Align, Anchors, Constraints, ChildSizing.Layout и другие свойства LCL.  
 +
 
 +
Размер элемента управления изменен:
  
The control is resized:
 
 
[[Image:Autosize after shrink.png]]
 
[[Image:Autosize after shrink.png]]
  
  
See also: [[Autosize_/_Layout#Align_and_parent_AutoSize|Align and parent AutoSize]]
+
См. также: [[Autosize_/_Layout/ru#Выравнивание и свойство AutoSize родителя|Выравнивание и свойство AutoSize родителя]]
  
 
===DisableAutoSizing/EnableAutosizing===
 
===DisableAutoSizing/EnableAutosizing===
  
see [[Autosize_/_Layout#Reduce_overhead_with_DisableAutoSizing.2C_EnableAutoSizing|here]].
+
см [[Autosize_/_Layout/ru#.D0.A1.D0.BE.D0.BA.D1.80.D0.B0.D1.89.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.B0.D0.BA.D0.BB.D0.B0.D0.B4.D0.BD.D1.8B.D1.85_.D1.80.D0.B0.D1.81.D1.85.D0.BE.D0.B4.D0.BE.D0.B2_.D1.81_.D0.BF.D0.BE.D0.BC.D0.BE.D1.89.D1.8C.D1.8E_.5B.D0.BC.D0.B5.D1.82.D0.BE.D0.B4.D0.BE.D0.B2.5D_DisableAutoSizing.2C_EnableAutoSizing|здесь]].
  
===Differences from Delphi ===
+
===Отличия от Delphi===
  
*Delphi has no BorderSpacing, AnchorSides, ChildSizing.
+
*Delphi не имеет BorderSpacing, AnchorSides, ChildSizing.
*Delphi does not support AutoSize and Align on all controls.
+
*Delphi не поддерживает AutoSize и Align на всех элементах управления.
*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 either. So, Panel1 is not autosized to the needed size for its children.
+
*Алгоритм автомасштабирования Delphi не поддерживает вложенные автомасштабируемые элементы управления со свойством Align. Например, Panel1 с Align=alTop в Panel2 и обе панели имеют AutoSize=true. Panel2 не будет уменьшаться/увеличиваться по горизонтали, что означает, что Panel1 также не будет уменьшаться/увеличиваться. Таким образом, Panel1 не имеет автомасштабирования для своих дочерних элементов.
  
 
==FAQ==
 
==FAQ==
  
see [[Autosize / Layout]].
+
см. [[Autosize_/_Layout/ru|Autosize / Layout]].
 
 
[[Category:LCL]]
 
[[Category:GUI]]
 
[[Category:Layout]]
 

Latest revision as of 22:27, 9 December 2018

English (en) русский (ru)

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

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

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

Свойства

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

  • Current Left,Top,Width,Height,ClientWidth,ClientHeight
  • Loaded Left,Top,Width,Height,ClientWidth,ClientHeight
  • AutoSize
  • Anchors
  • AnchorSides
  • Align
  • BorderSpacing
  • ChildSizing
  • Constraints

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

Порядок

Обзор

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

  • DisableAutosizing. На первом этапе приложение изменяет свойства, создает или удаляет элементы управления. Вся форма заблокирована. Отсутствует автоматическая настройка, никакие границы в виджет не отправляются .
  • EnableAutoSizing. Вызывается [методом] DoAllAutoSize родительской формы.
  • Все необходимые дескрипторы создаются рекурсивно [методом] TWinControl.DoAllAutoSize. Они еще не сделаны видимыми.
  • [Метод] TControl.DoAllAutoSize вычисляет границы, вызывая DoAutoSize для всех элементов управления. Он делает это в цикле, пока никакие границы не изменены.
  • Границы отправляются в виджет (TWinControl.RealizeBoundsRecursive вызывает RealizeBounds).
  • Дескрипторы становятся видимыми (если [свойство] HandleObjectShouldBeVisible [имеет значение True] и not Showing, то [вызывается] UpdateShowing).

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

  • Ограничения применяются к каждому шагу.
  • Сначала идет выравнивание в порядке alTop, alBottom, alLeft, alRight и, наконец, alClient. Например, alLeft имеет 3 выровненных стороны и одну свободную сторону. Свободная сторона обрабатывается приведенными ниже правилами. BorderSpacing применяется к выровненным сторонам. alCustom и alNone не имеют выровненных сторон.
  • Далее идет ChildSizing. Если ChildSizing.Layout не [в значении] cclNone, все дочерние элементы управления со [значениями] Align=alNone, Anchors=[akLeft,akTop] и элементы управления без AnchorSide масштабируются/репозиционируются. Эти дочерние элементы управления называются на этой странице "элементы управления без выравнивания".
  • Затем идет AutoSize. Если ChildSizing.Layout [имеет значение] cclNone, тогда все "элементы управления без выравнивания" перемещаются кверху и влево, а элемент управления сужается или расширяется, чтобы соответствовать всем его дочерним элементам (а не только "элементам управления без выравнивания").
  • Потом идут якоря (привязки). Только те стороны [считаются] привязанными, которые не обрабатываются [свойством] Align (например, akRight в alLeft). Если у элемента управления установлено [свойство] AnchorSide, сторона [этого контрола] будет выровнена к стороне другого элемента управления. В противном случае применяются правила привязки по умолчанию, которые в основном аналогичны Delphi.
  • Каждое изменение границ запускает событие OnResize/OnChangeBounds, которое может использоваться приложением для выполнения произвольных действий.

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

Основным методом является 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
      1. DoPosition вычисляет новые Left,Top,Width,Height

DoAutoSize

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

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

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

Перед перемещением есть место слева и над кнопками:

Autosize before move childs.png

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

Autosize after move childs.png

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

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

Autosize after shrink.png


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

DisableAutoSizing/EnableAutosizing

см здесь.

Отличия от Delphi

  • Delphi не имеет BorderSpacing, AnchorSides, ChildSizing.
  • Delphi не поддерживает AutoSize и Align на всех элементах управления.
  • Алгоритм автомасштабирования Delphi не поддерживает вложенные автомасштабируемые элементы управления со свойством Align. Например, Panel1 с Align=alTop в Panel2 и обе панели имеют AutoSize=true. Panel2 не будет уменьшаться/увеличиваться по горизонтали, что означает, что Panel1 также не будет уменьшаться/увеличиваться. Таким образом, Panel1 не имеет автомасштабирования для своих дочерних элементов.

FAQ

см. Autosize / Layout.