Difference between revisions of "LCL AutoSizing/ru"

From Free Pascal wiki
Jump to navigationJump to search
(Created page with "{{MenuTranslate|page=LCL AutoSizing}} ==Overview / Terminology== This page explains the LCL auto sizing algorithm. AutoSizing means here: Automatic resizing and repositionin...")
 
(Switched template, deleted English categories.)
 
(10 intermediate revisions by one other user not shown)
Line 1: Line 1:
{{MenuTranslate|page=LCL AutoSizing}}
+
{{LCL AutoSizing}}
  
==Overview / Terminology==
+
__TOC__
  
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]].
+
На этой странице объясняется алгоритм автомасштабирования в LCL. AutoSizing означает здесь: автоматическое изменение размера и перемещение элементов управления LCL.
  
==Properties==
+
Если вам просто интересно, как использовать свойства AutoSize, см. [[Autosize_/_Layout/ru#Разметка (Layout)|Autosize/Layout]].
  
The following properties defines the behavior of the LCL autosizing:
+
==Свойства==
 +
 
 +
Следующие свойства определяют поведение автомасштабирования в LCL:
  
 
*Current Left,Top,Width,Height,ClientWidth,ClientHeight
 
*Current Left,Top,Width,Height,ClientWidth,ClientHeight
Line 21: Line 23:
 
*Constraints
 
*Constraints
  
For Delphi compatibility the LCL supports the method AdjustClientRect which is an extension to the ChildSizing.LeftRightSpacing/TopBottomSpacing properties.
+
Для совместимости с Delphi LCL поддерживает метод AdjustClientRect, который является расширением свойств ChildSize.LeftRightSpacing/TopBottomSpacing.
  
==Order==
+
==Порядок==
  
===Overview===
+
===Обзор===
  
The autosizing works in several phases:
+
Автомасштабирование работает в несколько этапов:
  
*DisableAutosizing. In the first phase the application changes properties, creates or deletes controls. The whole form is locked. No Autosizing is done, no bounds are sent to the widgetset.
+
*DisableAutosizing. На первом этапе приложение изменяет свойства, создает или удаляет элементы управления. Вся форма заблокирована. Отсутствует автоматическая настройка, никакие границы в виджет не отправляются .
*EnableAutoSizing. The parent form DoAllAutoSize is called.
+
*EnableAutoSizing. Вызывается [методом] DoAllAutoSize родительской формы.
*All needed handles are created recursively by TWinControl.DoAllAutoSize. They are not yet made visible.
+
*Все необходимые дескрипторы создаются рекурсивно [методом] TWinControl.DoAllAutoSize. Они еще не сделаны видимыми.
*TControl.DoAllAutoSize computes the bounds by calling DoAutoSize for all controls. It does that in a loop until no bound changes.
+
*[Метод] TControl.DoAllAutoSize вычисляет границы, вызывая DoAutoSize для всех элементов управления. Он делает это в цикле, пока никакие границы не изменены.
*The bounds are sent to the widgetset (TWinControl.RealizeBoundsRecursive calling RealizeBounds).
+
*Границы отправляются в виджет (TWinControl.RealizeBoundsRecursive вызывает RealizeBounds).
*The handles are made visible (if HandleObjectShouldBeVisible and not Showing then [[LCL - Showing controls|UpdateShowing]]).
+
*Дескрипторы становятся видимыми (если [свойство] HandleObjectShouldBeVisible [имеет значение True] и not Showing, то [вызывается] UpdateShowing).
  
Basically the AutoSizing properties work in this order:
+
В основном свойство AutoSizing работает в следующем порядке:
  
*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.
+
*Сначала идет выравнивание в порядке alTop, alBottom, alLeft, alRight и, наконец, alClient. Например, alLeft имеет 3 выровненных стороны и одну свободную сторону. Свободная сторона обрабатывается приведенными ниже правилами. BorderSpacing применяется к выровненным сторонам. alCustom и alNone не имеют выровненных сторон.
*Next comes ChildSizing. If ChildSizing.Layout is not cclNone then all child controls with Align=alNone, Anchors=[akLeft,akTop] and no AnchorSide controls are resized/repositioned. These child controls are called on this page "non aligned controls".
+
*Далее идет ChildSizing. Если ChildSizing.Layout не [в значении] cclNone, все дочерние элементы управления со [значениями] Align=alNone, Anchors=[akLeft,akTop] и элементы управления без AnchorSide масштабируются/репозиционируются. Эти дочерние элементы управления называются на этой странице "элементы управления без выравнивания".
*Next comes AutoSize. If ChildSizing.Layout is cclNone then all "non aligned controls" are moved to the top, left and the control is shrunken or enlarged to fit around all its children (not only the "non aligned controls").  
+
*Затем идет AutoSize. Если ChildSizing.Layout [имеет значение] cclNone, тогда все "элементы управления без выравнивания" перемещаются кверху и влево, а элемент управления сужается или расширяется, чтобы соответствовать всем его дочерним элементам (а не только "элементам управления без выравнивания").
*Next comes the Anchors. Only those sides are anchored, which were not handled by Align (e.g. akRight on alLeft). If an 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.
+
*Потом идут якоря (привязки). Только те стороны [считаются] привязанными, которые не обрабатываются [свойством] Align (например, akRight в alLeft). Если у элемента управления установлено [свойство] AnchorSide, сторона [этого контрола] будет выровнена к стороне другого элемента управления. В противном случае применяются правила привязки по умолчанию, которые в основном аналогичны Delphi.
*every change of bounds triggers an OnResize/OnChangeBounds event, which may be used by the application to do arbitrary things.
+
*Каждое изменение границ запускает событие OnResize/OnChangeBounds, которое может использоваться приложением для выполнения произвольных действий.
  
===Algorithm for Align and Anchors===
+
===Алгоритм выравнивания и привязки===
  
The main method is TWinControl.AlignControls.
+
Основным методом является TWinControl.AlignControls.
  
#init RemainingClientRect to ClientRect and RemainingBorderSpace to Rect(0,0,0,0)
+
#инициация RemainingClientRect в ClientRect и RemainingBorderSpace в Rect(0,0,0,0)
#call AdjustClient to adjust RemainingClientRect
+
#вызов AdjustClient, чтобы настроить RemainingClientRect
#apply ChildSizing.LeftRightSpacing,ChildSizing.TopBottomSpacing
+
#применение ChildSizing.LeftRightSpacing,ChildSizing.TopBottomSpacing
#call DoAlign with alTop,alBottom,alLeft,alRight,alClient,alCustom,alNone
+
#вызов DoAlign с alTop,alBottom,alLeft,alRight,alClient,alCustom,alNone
##DoAlign collects child controls with this Align value and call for each such control DoPosition
+
##DoAlign собирает дочерние элементы управления с этим значением Align и вызывает для каждого такого контрола DoPosition
###DoPosition calculates the new Left,Top,Width,Height
+
###DoPosition вычисляет новые Left,Top,Width,Height
  
 +
===DoAutoSize===
  
===DoAutoSize===
+
Этот [метод] вызывается [методом] DoAllAutoSize и не должен вызываться приложением. Приложения должны вызывать AdjustSize и/или InvalidatePreferredSize.
  
This is called by DoAllAutoSize and should not be called by the application. Applications should call AdjustSize and/or InvalidatePreferredSize.
+
Если он не переопределен, нормальный TWinControl.DoAutoSize делает следующее, когда AutoSize=true:
  
If it is not overriden the normal TWinControl.DoAutoSize does the following, when AutoSize=true:
+
Он будет перемещать "элементы управления без выравнивания" - дочерние элементы управления с привязками по умолчанию (Anchors=[akLeft,akTop],Align=alNone). Он переместит все их одинаковое количество, поэтому их общий ограничивающий прямоугольник растягивается влево и вверх. Рассматривается интервал между BorderSpacing и ChildSize.<br />
  
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.
+
Перед перемещением есть место слева и над кнопками:
  
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.