Sign in Join
Wiki copytemporary

Anchor Docking/ru: what changed

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

OldNewLine
11Про стыковку вообще см. [[Docking]].
22
33# Обзор
44
55Пристыковка окон позволяет комбинировать формы или обрабатывать элементы управления как формы. Вы используете мышь, чтобы перетаскивать и стыковать(скреплять) формы вместе или расстыковывать (разделять) их. Основная функциональность перетаскивания, пристыковки и расстыковки предоставляется LCL. Но вам нужен менеджер пристыковки для добавления разделителей и зон захвата, а также для сохранения и восстановления макетов.
66
77Пристыковка с привязкой реализована, начиная с версии 0.9.29, в пакете *anchordocking.lpk*. Он прост в использовании и предоставляет множество функций и опций, недоступных в более ранних установочных пакетах.
88
99Пример кода вы найдете здесь: components/anchordocking/miniide/miniide1.lpi
1010
1111Это означает, что более ранние модули TLazDockingManager и LDockCtrl устарели и далее поддерживаться не будут.
1212
1313## Характеристики
1414
1515- **Перетаскивание и стыковка**: добавлены заголовки, которые можно перетаскивать с помощью мыши на стыкуемые элементы управления . Прямоугольники предварительного просмотра покажут, где и как закреплен элемент управления.
1616- **Любой макет**: с помощью привязок LCL возможна практически любая компоновка. Вы можете пристыковать \[компонент\] влево, вправо, сверху, снизу, внутри или снаружи или в виде страницы, как \[это сделано\] в TPageControl. Вы можете расширять пристыкованные элементы управления через всплывающее меню. Нет необходимости расстыковывать весь макет.
1717- **То, что вы видите, как это структурировано**: тут нет скрытых панелей для выравнивания элементов управления в строках и столбцах. Пристыковка с привязкой гарантирует, что формы не будут перекрываться.
1818- **Сплиттеры** автоматически вставляются между пристыкованными формами для \[получения возможности\] изменения размера.
1919- **Пристыковка страницы**: формы можно стыковывать не только влево/вправо/сверху/снизу, но и внутри страницы. TPageControl автоматически создается для естественного внешнего вида. Страница также может содержать произвольные пристыкованные формы, включая сопутствующие пристыкованные формы, допускающие вложенные страницы и макеты. Когда страница отстыкована от pagecontrol, она автоматически удаляется. Вы можете таскать и бросать вкладки или использовать всплывающее меню для перемещения страниц.
2020- **Простота использования**: с помощью одной строки кода вы можете сделать форму или элемент управления стыкуемыми. Просто дайте им уникальные имена.
2121- Не только формы, но и любой **TWinControl** может быть сделан стыкуемым.
2222- Можно **сохранять/загружать макеты**: информация о макете сохраняется для каждого пристыкованного элемента управления, а старые файлы макетов будут работать \[по-прежнему\], даже если приложение получит больше пристыкованных элементов управления или некоторые из них будут удалены. Информация хранится в абстрактном классе LCL TConfigStorage. Таким образом, вы можете использовать, например, TXMLConfigStorage для хранения макетов в XML-файлах, или вы можете создать собственное хранилище для хранения его в любом месте.
2323- Каждая пристыкованная форма помещается в стыковочный узел, предоставляя необязательный **заголовок**. Заголовок показывает название пристыкованной формы и содержит кнопку закрытия. Вы можете *перетащить заголовок*, чтобы перетащить форму и отстыковать ее или пристыковать в другой позиции. Заголовок может находиться на любой из четырех сторон и по умолчанию автоматически перемещается на меньшую сторону, чтобы сэкономить место. Вы можете настроить и это. Заголовок показывает настраиваемую подсказку, позволяющую читать длинные надписи.
2424- При изменении размера стыковочного узла *дочерние узлы масштабируются автоматически*. Вы можете отключить это.
2525- **Сохранение размеров форм**: например, при стыковке формы к левой стороне стыковочного узла ширина пристыкованной формы сохраняется. То же самое справедливо для других сторон, а также при отстыковке.
2626- **Уменьшение мерцания**: при восстановлении предпринимается попытка повторно использовать существующие узлы и разделители, чтобы уменьшить создание и мерцание форм, и сохранить Z-порядок(порядок наложения) форм. Это позволяет быстро переключаться между макетами.
2727- **Всплывающее меню заголовка**:
2828 - блокировать/разблокировать (отключить перетаскивание)
2929 - положение заголовка (авто, слева, сверху, справа, снизу), это сохраняется/восстанавливается вместе с макетом
3030 - объединить (например, после перемещения стыковочного узла страницы внутрь макета)
3131 - отстыковать (требуется, если нет места для отстыковки на экране)
3232 - увеличить сторону слева, сверху, справа, снизу
3333 - закрыть
3434 - настройки
3535- **Всплывающее меню страницы**:
3636 - блокировать/разблокировать (отключить перетаскивание)
3737 - отстыковать (требуется, если нет места для отстыковки на экране)
3838 - положение вкладки для управления страницей (сверху, снизу, слева, справа), это сохраняется/восстанавливается вместе с макетом
3939 - переместить страницу влево, вправо, в крайнее левое положение, в крайнее правое положение
4040 - закрыть
4141 - настройки
4242- Формы могут создавать стыковочные узлы. Тогда они могут пристыковываться к одной из сторон. Но их нельзя пристыковать к себе.
4343- Кнопка закрытия автоматически сохраняет макет
4444- Мощные функции для изменения макета. Вы можете использовать Drag&Drop, чтобы переместить форму, а также вы можете отстыковать и пристыковать ее за один раз. Есть функции для увеличения форм и сжатия других. Эти функции также доступны через всплывающее меню заголовка. См. ниже.
4545- Существует пакет IDE, который позволяет сделать стыкуемыми \[окна интерфейса\] IDE Lazarus. Он называется anchordockingdsgn.lpk. Убедитесь, что вы устанавливаете только один пакетдля пристыковки. Не устанавливайте easydockmgr одновременно!
4646
4747## Запланированное
4848
4949- Пакет времени разработки: добавление всех файлов макета в меню
5050- Простой способ сделать формы прикрепляемыми во время разработки (то есть без написания кода)
5151- Кнопка сворачивания и скрытия
5252- При показе снова: восстановить макет по умолчанию
5353- Кнопка закрытия для страниц
5454- Реализовать автоматическое слияние меню в LCL (когда две формы с основными меню состыкованы).
5555
5656# Использование
5757
5858## Быстрый старт
5959
6060Добавьте пакет **AnchorDocking** к требуемым пакетам в инспекторе проектов.
6161
6262Затем добавьте модуль **AnchorDocking** в раздел uses вашего основного модуля (модуль вашей основной формы).
6363
6464Добавьте в событие OnCreate вашей основной формы:
6565
6666``` pascal
6767 DockMaster.MakeDockSite(Self,[akBottom],admrpChild);
6868```
6969
7070Для других стыкуемых форм замените все вызовы *Show* и *ShowOnTop* на
7171
7272``` pascal
7373 DockMaster.MakeDockable(Form1,true,true);
7474```
7575
7676Для других стыкуемых форм замените все вызовы *Visible:=true* на
7777
7878``` pascal
7979 DockMaster.MakeDockable(Form1,true);
8080```
8181
8282Удалите или закомментируйте все вызовы *Hide*, *Visible:=false*, *WindowState:=*.
8383
8484## Предварительные условия использования
8585
8686- Ваш проект должен использовать пакет *AnchorDocking*.
8787- Все стыкуемые формы должны показываться с помощью MakeDockable или MakeDockSite. Не используйте *Show*, *BringToFront*, *ShowOnTop*, *Visible:=true*. Конечно же, у вас может быть несколько не пристыковывающихся форм, таких как всплывающие подсказки или заставки.
8888- Все стыкуемые формы должны иметь свободно изменяемый размер, это означает, что нет ограничений, нет BorderStyle=bsDialog.
8989- Нет другой системы пристыковки. AnchorDocking несовместим с EasyDockMgr.
9090
9191## Превращение форм в стыкуемые
9292
9393Есть два способа сделать форму стыкуемой. Вы можете использовать **DockMaster.MakeDockable**, чтобы пристегнуть форму к док-узлу(стыковочному узлу). Тогда ваша форма может пристыковывать и быть стыкуемой совершенно свободно. Вы будете использовать этот способ для большей части ваших форм, за исключением MainForm, потому что это поддерживается для MainForm только в gtk2 и qt. Второй способ - использовать **DockMaster.MakeDockSite**. Форма может пристыковывать другие узлы, но не может быть пристыкована сама. Вы можете использовать *MakeDockSite* для *MainForm*. Для большинства других форм вы, вероятно, захотите использовать это:
9494
9595``` pascal
9696// показываем YourForm
9797// если это еще не сделано, пристегиваем форму к док-узлу
9898DockMaster.MakeDockable(YourForm);
9999```
100100
101101Вот несколько примеров того, как форма может быть пристыкована с помощью **DockMaster.MakeDockable**:
102102
103103![Top](/wiki-images/b/bc/Docksite1.png) ![Top](/wiki-images/c/c6/Docksite2.png)
104104
105105Положение заголовка обычно устанавливается автоматически, и пользователь может щелкнуть правой кнопкой мыши по любой из четырех сторон.
106106
107107## Пример: miniide1
108108
109109Пример можно найти в *lazarus/components/anchordocking/miniide/miniide1.lpi*. Он имеет *mainform* в модуле *unit1.pas* с главным меню, которая работает как док-узел, и несколькими формами, которые можно пристыковать.
110110
111-<figure>
112-<img src="Anchordocking_miniide1.png" title="Anchordocking_miniide1.png" />
113-<figcaption>Anchordocking_miniide1.png</figcaption>
114-</figure>
111+![](/wiki-images/a/a5/Anchordocking_miniide1.png)
115112
116113## Превращение главной формы в стыковочный узел
117114
118115В TMainIDE.FormCreate основная форма **MainIDE** превращается в стыковочный узел:
119116
120117``` pascal
121118DockMaster.MakeDockSite(Self,[akBottom],admrpChild);
122119```
123120
124121Параметр *\[akBottom\]* позволяет пристыковывать другие узлы в нижней части MainIDE. Параметр *admrpChild* сообщает DockMaster, что при расширении MainIDE дополнительное пространство распределяется между закрепленными узлами.
125122
126123Когда пользователь пристыковывает узел в нижней части MainIDE, узел помещается на MainIDE (Site.Parent:=MainIDE) с выравниванием Site.Align=alBottom. Другие элементы управления на MainIDE должны быть с ним совместимы. Например, MainIDE имеет BtnPanel с выравниванием Align=alLeft и TNoteBook с выравниванием Align=alClient. См. [[Autosize / Layout/ru|здесь]], чтобы увидеть, как работает Align.
127124
128125DockMaster автоматически добавляет сплиттер:
129126
130-<figure>
131-<img src="Anchordocking_miniide_dockedse1.png" title="Anchordocking_miniide_dockedse1.png" />
132-<figcaption>Anchordocking_miniide_dockedse1.png</figcaption>
133-</figure>
127+![](/wiki-images/c/ca/Anchordocking_miniide_dockedse1.png)
134128
135129Как только стыкуемая форма прикрепляется, ее заголовок отображается в заголовке дока.
136130
137131### Требования к настраиваемому стыковочному узлу
138132
139133Пока ничто не пристыковано к пользовательскому узлу, ваша форма может делать все то же, что и обычная форма. Но когда узел пристыкован к ней, некоторые свойства и методы требуют особого внимания:
140134
141135- AutoSize=true может привести к бесконечному циклу. Отключите это свойство или переопределите DoAutoSize/CalculatePreferredSize и будьте особенно внимательны.
142136- Ограничения: DockMaster очищает максимум ограничений и восстанавливает их при отстыковке.
143137- Дочерние элементы управления, привязанные к выровненному узлу, могут перекрываться. См. [[Autosize / Layout/ru|здесь]], как работает Align.
144138- ChildSizing: свойства зазоров, таких как LeftRightSpacing, TopBottomSpacing, могут мешать стыковочному макету.
145139
146140## Процедура создания всех других форм по имени
147141
148142MainIDE задает событие **DockMaster.OnCreateControl**, чтобы позволяет DockMaster создавать формы по имени. Это необходимо для восстановления макетов.
149143
150144``` pascal
151145DockMaster.OnCreateControl:=@DockMasterCreateControl;
152146```
153147
154148``` pascal
155149procedure TMainIDE.DockMasterCreateControl(Sender: TObject; aName: string; var
156150 AControl: TControl; DoDisableAutoSizing: boolean);
157151
158152 procedure CreateForm(Caption: string; NewBounds: TRect);
159153 begin
160154 AControl:=CreateSimpleForm(aName,Caption,NewBounds,DoDisableAutoSizing);
161155 end;
162156
163157begin
164158 // сначала проверяем существование формы
165159 // LCL Screen содержит список всех существующих форм
166160 // Примечание: помните, что LCL допускает в качестве имен форм только стандартные
167161 // Паскаль идентификаторы и сравнивает их без учета регистра
168162 AControl:=Screen.FindForm(aName);
169163 if AControl<>nil then begin
170164 // если он уже существует, просто отключите автоматическое изменение размера, если требуется
171165 if DoDisableAutoSizing then
172166 AControl.DisableAutoSizing;
173167 exit;
174168 end;
175169 // если форма еще не существует, создаем ее
176170 if aName='CodeExplorer' then
177171 CreateForm('Code Explorer',Bounds(700,230,100,250))
178172 ...
179173 else if aName='DebugOutput' then
180174 CreateForm('Debug Output',Bounds(400,400,350,150));
181175end;
182176```
183177
184178Создать форму можно очень просто:
185179
186180``` pascal
187181MyForm:=TMyForm.Create(Self);
188182if DoDisableAutoSizing then
189183 MyForm.DisableAutoSizing;
190184```
191185
192186Но, конечно, вы можете поместить туда все виды кода инициализации.
193187
194188*DisableAutoSizing* уменьшает мерцание. Убедитесь, что свойство **Visible** формы установлено в значение **false**.
195189
196190Не забудьте вызвать **DisableAutoSizing** для формы, если для параметра **DoDisableAutoSizing** установлено значение *true*, поскольку вызовы *Disable-* и *EnableAutosizing* должны быть сбалансированы. Если вы пропустите *DisableAutosizing*, LCL создаст исключение позже:
197191
198192``` pascal
199193TControl.EnableAutoSizing SourceEditor1:TSimpleForm: missing DisableAutoSizing
200194```
201195
202-<figure>
203-<img src="MissingDisableAutoSizing.png" title="MissingDisableAutoSizing.png" />
204-<figcaption>MissingDisableAutoSizing.png</figcaption>
205-</figure>
196+![](/wiki-images/8/8e/MissingDisableAutoSizing.png)
206197
207198Если вы слишком часто вызываете **DisableAutoSizing**, ваши формы не будут отображаться и/или не будут должным образом изменять размер, поскольку LCL будет ожидать вызова *EnableAutoSizing*, который так никогда и не поступит.
208199
209200## Отображение форм
210201
211202Раньше, для отображения формы, вы, вероятно, использовали что-то вроде **MyForm.Show**. Вместо этого вы должны теперь использовать
212203
213204``` pascal
214205DockMaster.MakeDockable(MyForm);
215206```
216207
217208Это "обернет" MyForm в стыковочный узел и покажет его. Узел достаточно "умен", чтобы выяснить, что форма уже "обернута" в него.
218209
219210Если вы установили событие **DockMaster.OnCreateControl**, вы можете использовать это:
220211
221212``` pascal
222213DockMaster.ShowControl('MyForm',true);
223214```
224215
225216## Пристыковка вручную, программно
226217
227218Используйте процедуру **DockMaster.ManualDock**, чтобы пристыковать узел к другому.
228219
229220``` pascal
230221procedure ManualDock(SrcSite, TargetSite: TAnchorDockHostSite; Align: TAlign; TargetControl: TControl = nil);
231222```
232223
233224- **SrcSite** - это узел для стыковки. Если SrcSite был пристыкован, он будет отстыкован первым.
234225- **TargetSite** - это \["родительский"\] узел, у которого SrcSite будет пристыкован либо внутри, либо как соседнее окно.
235226- **TargetControl** - указывает, в виде какого окна будет пристыкована форма: как соседнее (=nil), внутри соседа (=TargetSide) или перед страницей (=TAnchorDockPage).
236227
237228## Отстыковка вручную, программно
238229
239230Используйте процедуру **DockMaster.ManualFloat**, чтобы отсоединить узел от его соседей и создать плавающую форму верхнего уровня. Встроенный элемент управления остается встроенным в TAnchorDockHostSite.
240231
241232``` pascal
242233 procedure ManualFloat(AControl: TControl);
243234```
244235
245236В качестве параметра можно указать TAnchorDockHostSite или элемент управления, встроенный в TAnchorDockHostSite (например, форму, которая была пристыкована с помощью MakeDockable). Узел будет размещен в том же месте экрана.
246237
247238## Сохранение макета
248239
249240DockMaster позволяет сохранять текущий макет в TConfigStorage. В примере miniide используется версия xml:
250241
251242``` pascal
252243procedure TMainIDE.SaveLayout(Filename: string);
253244var
254245 XMLConfig: TXMLConfigStorage;
255246begin
256247 try
257248 // создаем новый XML-файл конфигурации
258249 XMLConfig:=TXMLConfigStorage.Create(Filename,false);
259250 try
260251 // сохраняем текущий макет всех форм
261252 DockMaster.SaveLayoutToConfig(XMLConfig);
262253 XMLConfig.WriteToDisk;
263254 finally
264255 XMLConfig.Free;
265256 end;
266257 except
267258 on E: Exception do begin
268259 MessageDlg('Ошибка',
269260 'Ошибка сохранения макета в файл '+Filename+':'#13+E.Message,mtError,
270261 [mbCancel],0);
271262 end;
272263 end;
273264end;
274265```
275266
276267## Загрузка макета
277268
278269``` pascal
279270procedure TMainIDE.LoadLayout(Filename: string);
280271var
281272 XMLConfig: TXMLConfigStorage;
282273begin
283274 try
284275 // загружаем XML-файл конфигурации
285276 XMLConfig:=TXMLConfigStorage.Create(Filename,True);
286277 try
287278 // восстанавливаем макет
288279 // это закроет ненужные формы и вызовет OnCreateControl для всех необходимых форм
289280 DockMaster.LoadLayoutFromConfig(XMLConfig);
290281 finally
291282 XMLConfig.Free;
292283 end;
293284 except
294285 on E: Exception do begin
295286 MessageDlg('Ошибка',
296287 'Ошибка загрузки макета из файла '+Filename+':'#13+E.Message,mtError,
297288 [mbCancel],0);
298289 end;
299290 end;
300291end;
301292```
302293
303294## Увеличение/Уменьшение размеров
304295
305296Менеджер стыковки может увеличивать/уменьшать размеры пристыкованных соседей. Это делается через всплывающее меню заголовка узла или в коде с помощью функции **DockMaster.ManualEnlarge**:
306297
307298``` pascal
308299 function ManualEnlarge(Site: TAnchorDockHostSite; Side: TAnchorKind; OnlyCheckIfPossible: boolean): boolean;
309300```
310301
311302Site - дочерний узел, Side - сторона узла, которая растянется. Если вы хотите только проверить, возможно ли увеличение, установите OnlyCheckIfPossible в true.
312303
313304### Растянуть один, ужать другой
314305
315306Ужать соседний *Object Inspector*, растянуть *Messages*: щелкните правой кнопкой мыши заголовок *Messages* и выберите **Enlarge right side**(Увеличить правую сторону). Два сплиттера будут изменены в размерах.
316307
317308![](/wiki-images/1/15/Anchordocking_before_enlarge1.png) ⇒ ⇒ ⇒ узел *Messages* растягивается вправo: ⇒ ⇒ ⇒ ![](/wiki-images/f/f8/Anchordocking_after_enlarge1.png)
318309
319310### Растянуть один, ужать остальные
320311
321312Сожмите разделитель с одной стороны, растяните оба соседних разделителя, разверните разделитель кзади, растяните Control, уменьшите элементы управления при повороте разделителя. Щелкните правой кнопкой мыши по заголовку *Source Editor 1*, затем нажмите **Enlarge bottom side**(Увеличить нижнюю сторону).
322313
323314![](/wiki-images/c/cb/Anchordocking_before_enlarge2.png) ⇒ ⇒ ⇒ становится ⇒ ⇒ ⇒ ![](/wiki-images/4/42/Anchordocking_after_enlarge2.png)
324315
325316## Общие настройки стыковки
326317
327318Пакет AnchorDocking предоставляет диалог для настройки некоторых свойств DockMaster. Диалог находится в модуле AnchorDockOptionsDlg, и вы можете использовать его весьма просто:
328319
329320``` pascal
330321uses ... AnchorDockOptionsDlg;
331322...
332323procedure TMainIDE.FormCreate(Sender: TObject);
333324...
334325begin
335326 ...
336327 DockMaster.OnShowOptions:=@ShowAnchorDockOptions;
337328 ...
338329end;
339330```
340331
341332Это добавит новый пункт меню во всплывающие меню заголовков стыковочных узлов и страниц под названием *Docking options*(Опции стыковки).
342333
343334# Стыковка в IDE
344335
345336Если вам не нравится внешний вид "обособленных окон" по умолчанию в среде IDE Lazarus и вы предпочитаете единое окно (например, как RAD Studio™), вы можете установить пакет с именем **AnchorDockingDsgn**. Этот пакет делает окна стыкуемыми (lazarus/components/anchordocking/design/anchordockingdsgn.lpk). Удалите все другие менеджеры стыковки (например, easydockmgrdsgn).
346337
347338После того, как вы установили пакет и перезапустили IDE, IDE начинает пристыковываться с макетом по умолчанию. Вы можете изменить макет: вы можете перетаскивать и закреплять заголовки (полосы вверху или слева от каждого окна), изменять размер через разделители или границы окна. Вы можете щелкнуть правой кнопкой мыши по заголовку, чтобы выбрать другие параметры, например, чтобы изменить внешний вид заголовков, как показано ниже:
348339
349340Вы можете сохранить макет через пункт меню **Tools / Save window layout as default**(Инструменты/Сохранить макет окна по умолчанию). Это сохраняет настройки в ~/.lazarus/anchordocklayout.xml и восстанавливает их при запуске IDE.
350341
351342------------------------------------------------------------------------
352343
353344[[User|Прим.перев.]]: на самом деле, на момент перевода статьи расположение окон в IDE сохраняется в Tools(Сервис) / Desktops(Рабочие столы) / Manage desktops (Управление рабочими столами), а настройки хранятся в environmentoptions.xml в каталоге с прочими настройками Лазаруса.
354345
355346------------------------------------------------------------------------
356347
357348Вы также можете сохранить макет в файл и загрузить его позже.
358349
359350Начиная с Lazarus 1.1 вы можете передавать параметр командной строки
360351
361352``` bash
362353./lazarus --anchordocklayout=<filename>
363354```
364355
365356Вот пример того, как выглядит стыкуемая IDE в Windows 7:
366357
367-<figure>
368-<img src="Laz_IDE_v1.2.6_Docked.png" title="Laz_IDE_v1.2.6_Docked.png" />
369-<figcaption>Laz_IDE_v1.2.6_Docked.png</figcaption>
370-</figure>
358+![](/wiki-images/9/98/Laz_IDE_v1.2.6_Docked.png)
371359
372360Это пример того, как выглядит стыкуемая IDE ( пакеты **AnchorDockingDsgn** и **sparta_DockedFormEditor**) в Windows 10:
373361
374-<figure>
375-<img src="Lazarus_IDE_v1.8.4_docked.png" title="Lazarus_IDE_v1.8.4_docked.png" />
376-<figcaption>Lazarus_IDE_v1.8.4_docked.png</figcaption>
377-</figure>
362+![](/wiki-images/6/69/Lazarus_IDE_v1.8.4_docked.png)
378363
379364Внешний вид (как и заголовки) можно изменить, щелкнув по ним правой кнопкой мыши.
380365
381-<figure>
382-<img src="docking_headers.gif" title="docking_headers.gif" />
383-<figcaption>docking_headers.gif</figcaption>
384-</figure>
366+![](/wiki-images/8/8a/Docking_headers.gif)
385367
386368# Настройки
387369
388-<figure>
389-<img src="anchordocking_options.png" title="anchordocking_options.png" />
390-<figcaption>anchordocking_options.png</figcaption>
391-</figure>
370+![](/wiki-images/3/3a/Anchordocking_options.png)
392371
393372## Scale on resize (масштабирование при изменении размера)
394373
395374При изменении размера окна все закрепленные внутри формы масштабируются пропорционально.
396375
397376## Flatten headers (отображать заголовки плоскими)
398377
399378Заголовки без 3D рамки.
400379
401380## Header align top/left (помещение заголовка сверху/слева)
402381
403382Заголовки автоматически помещаются сверху или слева в зависимости от этих двух значений:
404383
405384- Переместить заголовок вверх, когда (ширина/высота)*100\<=HeaderAlignTop, по умолчанию 80
406385- Переместить заголовок влево, когда (ширина/высота)*100\>=HeaderAlignLeft, по умолчанию 120
407386- В противном случае сохранить заголовок в текущей позиции.
408387
409388Это означает, что заголовок по умолчанию размещен на меньшей стороне закрепленного элемента управления. При изменении размера элемента управления заголовок переключается на меньшую сторону.
410389
411390# Зачем использовать Anchors(привязки) вместо Align(выравнивания)?
412391
413392Привязки позволяют создать любую возможную прямоугольную планировку. Выравнивание ограничено в своих возможностях. Выравнивание с панелями может теоретически создать множество макетов, но все же не всё. И некоторые операции, такие как растяжение/сжатие, более сложны при их реализации с помощью выравнивания/панелей, чем при использовании привязок. Выравнивание работает хорошо для нескольких форм, но чем больше форм пристыковано, тем больше становятся очевидными недостатки выравнивания.
414393
415394## Макеты, которые можно создавать с помощью выравнивания
416395
417396Выравнивание может создавать только следующие макеты:
418397
419-<figure>
420-<img src="Anchordocking_align_layout1.png" title="Anchordocking_align_layout1.png" />
421-<figcaption>Anchordocking_align_layout1.png</figcaption>
422-</figure>
398+![](/wiki-images/1/13/Anchordocking_align_layout1.png)
423399
424400Элементы управления с alTop всегда находятся вверху, заполняя всю горизонтальную ширину. Это потому, что LCL сначала выравнивает все элементы управления с помощью alTop, затем всех alBottom, затем alLeft, затем alRight и, наконец, alClient.
425401
426402## Макеты, которые можно создавать с помощью выравнивания и панелями
427403
428404Можно смонтировать выравнивание макетов с помощью скрытых панелей. Затем можно создать любой макет, который можно рекурсивно разбить на две части. Тогда вы можете создать, например:
429405
430-<figure>
431-<img src="Anchordocking_align_panels_layout1.png" title="Anchordocking_align_panels_layout1.png" />
432-<figcaption>Anchordocking_align_panels_layout1.png</figcaption>
433-</figure>
406+![](/wiki-images/0/0e/Anchordocking_align_panels_layout1.png)
434407
435408Для этого требуется только одна скрытая панель.
436409
437410## Изменение макетов
438411
439412Теперь пользователь хочет расширить *FPDocEditor* по горизонтали (и ужать *CodeExplorer*). С помощью *AnchorDocking* вы можете просто щелкнуть правой кнопкой мыши по заголовку *FPDocEditor* и выбрать **Увеличить правую сторону**.
440413
441-<figure>
442-<img src="Anchordocking_align_panels_layout2.png" title="Anchordocking_align_panels_layout2.png" />
443-<figcaption>Anchordocking_align_panels_layout2.png</figcaption>
444-</figure>
414+![](/wiki-images/8/88/Anchordocking_align_panels_layout2.png)
445415
446416Другие стыковочные движки требуют как минимум 2 панели. Один для *SrcEditor*, *Messages*, *FPDocEdit*, *CodeExpl* и один для *SrcEdit* и *Messages*. Большинство стыковочных макетов даже не предоставляют простой способ изменить макет таким способом. Алгоритм, допускающий это изменение макета, должен анализировать всю структуру, как если бы не было панелей, и должен отражать многие вещи. По сути, алгоритм должен делать то же самое, что и алгоритм пристыковки, но с дополнительной работой по переводу макета с использованием выравнивания плюс скрытых панелей.
447417
448418## Макеты, которые невозможны с выравниванием и панелями
449419
450420Теперь пользователь хочет расширить *SourceEditor1* по горизонтали (и ужать *ObjectInspector*):
451421
452-<figure>
453-<img src="Anchordocking_impossible_with_align_panels1.png" title="Anchordocking_impossible_with_align_panels1.png" />
454-<figcaption>Anchordocking_impossible_with_align_panels1.png</figcaption>
455-</figure>
422+![](/wiki-images/e/e9/Anchordocking_impossible_with_align_panels1.png)
456423
457424Такая компоновка невозможна при выравнивании и панелях, поскольку нельзя разрезать его на две половины. То же самое для стыковки с привязкой
458425
459-<figure>
460-<img src="Anchordocking_impossible_with_align_panels2.png" title="Anchordocking_impossible_with_align_panels2.png" />
461-<figcaption>Anchordocking_impossible_with_align_panels2.png</figcaption>
462-</figure>
426+![](/wiki-images/1/1e/Anchordocking_impossible_with_align_panels2.png)
463427
464428## Заключение
465429
466430Выравнивание со скрытыми панелями позволяет легко создать простой менеджер стыковки, который хорошо работает для нескольких форм. Но это всегда будет ограничивать пользователя. Выравнивание полезно для макета строк и столбцов, а не для таблиц. Стыковка с привязкой работает даже для сложных форм.
467431
468432# Старый/устаревший механизм стыковки
469433
470434## Создание TLazDockingManager
471435
472436``` pascal
473437 DockingManager:=TLazDockingManager.Create(Self);
474438```
475439
476440Параметр Self используется только в качестве указания владельца. Это означает, что когда основная форма освобождается, DockingManager также освобождается. Вы можете использовать *nil* и освободить DockingManager самостоятельно.
477441
478442## Необязательное: загрузка конфигурации
479443
480444Вы можете загрузить пользовательскую конфигурацию с жесткого диска.
481445
482446``` pascal
483447 Config:=TXMLConfigStorage.Create('config.xml',true);
484448 DockingManager.LoadFromConfig(Config);
485449 Config.Free;
486450```
487451
488452Это загружает файл *config.xml*. Конфиг может быть создан функцией SaveToConfig. См. ниже.
489453
490454## Преобразование формы/элемента управления в стыкуемый
491455
492456Создаем TLazControlDocker для каждой формы/элемента управления, которые должны быть стыкуемыми
493457
494458``` pascal
495459 ControlDocker1:=TLazControlDocker.Create(Self);
496460 ControlDocker1.Name:='DockerForm1';
497461 ControlDocker1.Manager:=DockingManager;
498462```
499463
500464## Необязательное: сохранение пользовательской конфигурации на жесткий диск
501465
502466Когда программа закрывается, вы можете сохранять пользовательскую конфигурацию на диск
503467
504468``` pascal
505469 Config:=TXMLConfigStorage.Create('config.xml',true);
506470 DockingManager.SaveToConfig(Config);
507471 Config.WriteToDisk;
508472 Config.Free;
509473```
510474
511475# Ссылки
512476
513477- [[Anchor Docking Step by step example|Anchor Docking: пошаговые примеры]]
514478- [[Docking]] в общем
515479- [[EasyDockingManager]] - альтернативная реализация стыковки с более простым механизмом компоновки и меньшим количеством опций.
516480
517481---
518482*From the Free Pascal wiki, page "Anchor Docking/ru", as it stood on 2020-04-20 after a change by Zoltanleo, 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).*
519483Category: Docking

Back to history