Sign in Join
Wiki copytemporary

Anchor Docking Step by step example/ru: what changed

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

OldNewLine
11# Anchor Docking : Пошаговый пример
22
33> **Warning:** ЭТОТ ПРИМЕР РАБОТАЕТ НЕ НА 100%, КАК БЫЛО ЗАДУМАНО. См. раздел [[Anchor Docking Step by step example/ru|Отладка]] для получения дополнительной информации.
44
55У нас теперь есть мануал по [[Anchor Docking/ru|anchor docking]] ... но я знаю, что люди учатся на методом тыка, а не посредством чтения ... итак, давайте делать это.
66
77Сначала я создам новое приложение с нуля, а затем (надеюсь) мы увидим, сможем ли мы "преобразовать" в него существующее приложение (которое работало по старому способу выравнивания "Panel").
88
99Для первого проекта я создам приложение, которое должно выглядеть так:
1010
1111` +-----------------------------+`\
1212` | Main menu                   |`\
1313` +-----------------------------+`\
1414` | Toolbar (open, save etc.)   |`\
1515` +-----+-----------------------+`\
1616` | __= |                       |`\
1717` |     |                       |`\
1818` |  T  |   Main Application    |`\
1919` |  o  |                       | `\
2020` |  o  |                       |`\
2121` |  l  +-----------------------+`\
2222` |  s  |   Output Messages     |`\
2323` +-----+-----------------------+`
2424
2525С панелью инструментов (Toolbar), инструментами (Tools) (несколько страниц), «Вывода сообщений» ( Output Messages) все части становятся «пристыковываемыми» (dockable). Поскольку механизм "drag-and-drop" еще не реализован, я не собираюсь пытаться добавить функциональность для перемещения частей. (Компиляция примера показывает, как это можно сделать) ... Этот проект будет лишь демонстрировать состояние «закреплено» или «не закреплено» для каждой из этих частей. (Этот проект может быть выполнен только с панелями.)
2626
2727# Шаг 1: Создание главной страницы
2828
2929По сути, мы просто создадим новую форму, добавим в форму главное меню, а затем добавим в форму dockmanager. Я также добавляю stringgrid, чтобы показать, как она будет выглядеть.
3030
3131- Создайте новый проект
3232- В Lazarus перейдите в File -\> New ... -\> Выберите "Application"
3333- Первая форма (unit1.pas) будет частью "Main Application".
3434 - Перетащите компонент TMainMenu на форму.
3535 - Дважды щелкните компонент TMainMenu и создайте:
3636 - Main - File
3737 - FileSub - Exit
3838 - Main - Windows
3939 - WindowsSub - Dock/Undock Active Window (Пристыковать/Отстыковать активное окно) (добавьте шоткат к F11 - чтобы он был у нас)
4040 - WindowsSub - Save Window Positions (Сохранить позиции окна)
4141 - Создайте событие «OnCreate» для формы
4242 - Выберите форму в конструкторе форм
4343 - В инспекторе объектов перейдите на вкладку "events" (события) и дважды щелкните событие «OnCreate»
4444 - Создайте диспетчер стыковки
4545 - Добавьте этот код в событие OnCreate: \`**DockingManager:=TLazDockingManager.Create(Self);**\`
4646 - Добавьте переменную dockmanager к классу основной формы.
47- - Нажмите <span class="kbd">Ctrl</span>+<span class="kbd">Shift</span>+<span class="kbd">Up</span> (это приведет вас к определению события OnCreate в классе формы.)
47+ - Нажмите `Ctrl`+`Shift`+`Up` (это приведет вас к определению события OnCreate в классе формы.)
4848 - Добавьте этот код в определение класса раздела **public**: \`**DockingManager: TLazDockingManager;**\`
4949 - Добавьте модуль стыковки и XMLPropStorage в раздел uses,
5050 - Прокрутите редактор кода до раздела uses
5151 - Добавьте \`**, LDockCtrl, XMLPropStorage**\` в раздел uses
5252 - Теперь мы просто добавим материал, чтобы он выглядел как приложение
5353 - Добавьте компонент StringGrid
5454 - Сделайте **Align = Client** в инспекторе объектов
5555
5656# Шаг 2: Создание своей панели инструментов
5757
5858Я не собираюсь притворяться, что знаю, как создать правильную панель инструментов ... аля excel или что-то в стиле Офиса (прим.перев.: очевидно, имеется ввиду M\$Office). Поэтому я просто создам форму со speedbutton'ами, которые выровнены по левому краю, и добавлю к ней несколько значков. Также добавьте к нему элемент управления док-станцией.
5959
6060- Создайте новую форму (File -\> New Form)
6161 - Измените ее размер так, чтобы она выглядела «реалистично» по размеру. Высота - 61.
6262 - Добавьте к ней несколько кнопок загрузки/сохранения (добавьте несколько значков, если хотите) и **Align = Left** для них. Я добавил speedbuttons Load и Save, получил несколько глифов из *Lazarus/images/menu*. В моем другом проекте я добавил новую панель и поместил туда combobox. Делай что хочешь!
6363 - Добавьте панель управления.
6464 - В событие OnCreate добавьте:
6565
6666``` pascal
6767 ControlDocker1:=TLazControlDocker.Create(Self);
6868 ControlDocker1.Name:='ToolbarForm';
6969 ControlDocker1.Manager:=Form1.DockingManager;
7070```
7171
7272- - Добавьте соответствующие модули в раздел uses. (**unit1, LDockCtrl**)
7373 - Добавьте переменную в раздел **public** определения класса формы: **ControlDocker1: TLazControlDocker;**
7474
7575# Шаг 3: Наши страницы инструментов
7676
7777Мы просто создадим 2 разные формы, которые *узнаваемо* отличаются друг от друга. И добавьте к нему элемент управления док-станцией. Сделайте следующее дважды:
7878
7979- Создайте новую форму (File -\> New Form)
8080 - Измените ее размер, чтобы она выглядела «реалистично» по размеру. (Я только что сделал это около 150 px в ширину)
8181 - Обозначьте ее. (Я помещаю на нее label, где пишу "окно инструментов" 1 и 2).
8282 - Добавьте панель управления.
8383 - В событии OnCreate добавьте:
8484
8585``` pascal
8686
8787 ControlDocker1:=TLazControlDocker.Create(Self);
8888 ControlDocker1.Name:='Toolwindow1Form'; // (или 2 для второго)
8989 ControlDocker1.Manager:=Form1.DockingManager;
9090```
9191
9292- - Добавьте соответствующие модули в разделе uses(**unit1, LDockCtrl**)
9393 - Добавьте переменную в разделе **public** определния класса формы: **ControlDocker1: TLazControlDocker;**
9494
9595# Шаг 4: Наше Окно Сообщений
9696
9797Просто наша последняя форма ... Форма вывода. Выполните те же действия, что и раньше ...
9898
9999- Создайте новую форму (File -\> New Form)
100100 - Измените ее размер, чтобы она выглядела "реалистично" по размеру. (Я только что сделал его около 100 px высотой и довольно широким)
101101 - Добавьте компонент memo, и выровняйте **align = client**
102102 - Добавьте control docker
103103 - В событии OnCreate добавьте:
104104
105105``` pascal
106106 ControlDocker1:=TLazControlDocker.Create(Self);
107107 ControlDocker1.Name:='OutputForm'; // (или 2 для второго)
108108 ControlDocker1.Manager:=Form1.DockingManager;
109109```
110110
111111- - Добавьте соответствующие модули в разделе uses(**unit1, LDockCtrl**)
112112 - Добавьте переменную в разделе **public** определния класса формы: **ControlDocker1: TLazControlDocker;**
113113
114114# Шаг 5: Собираем все вместе
115115
116116Теперь мы просто добавим все вместе в основную форму ... и посмотрим, что из этого получится.
117117
118118- Добавьте все модули в раздел об использовании вашего основного модуля. (**unit2, unit3, unit4, unit5**)
119119- Далее мы хотим добавить это в диспетчер стыковки ... но проблема в том, что формы еще не созданы в событии "OnCreate" основной формы. Итак, я перенесу «присвоение» свойств окнам пристыковки на событие «OnActivate» и просто установлю флаг, что это было сделано (чтобы он не делал это снова)
120120- Итак: добавьте переменную Initialized в класс form1: **Initialized: boolean;**
121121- В OnCreate мы установим ее значение в «False», а затем установим в «True» во время метода OnActivate.
122122- Текущий метод «OnActivate».
123123
124124``` pascal
125125procedure TForm1.FormActivate(Sender: TObject);
126126begin
127127 if initialized then exit;
128128 Initialized := true;
129129 // Устанавливаем панель инструментов вверху
130130 DockingManager.Manager.InsertControl(Form2,alTop,Form1);
131131
132132 // Устанавливаем окно инструментов слева
133133 DockingManager.Manager.InsertControl(Form3,alLeft,Form1);
134134
135135 // Устанавливаем второе окно инструментов ВНУТРИ первого
136136 DockingManager.Manager.InsertControl(Form4,alClient,Form3);
137137
138138 // Устанавливаем второй элемент управления сообщениями снизу
139139 DockingManager.Manager.InsertControl(Form5,alBottom,Form1);
140140end;
141141```
142142
143143# Отладка
144144
145145Это не сработало на 100%, как ожидалось.
146146
147147Вещи, которые заработали, как ожидалось:
148148
1491491. Панель инструментов выглядела правильно и потрясающе
1501502. Ширина окна инструмента была ожидаемой
151151
152152Вещи, которые не сработали должным образом:
153153
1541541. Второе окно инструментов не работало должным образом, там был page control, но вторая страница не была назначена, а первой странице было назначено ВТОРОЕ окно инструментов
1551552. Главное меню отсутствовало
1561563. Memo исчезло ... хотя форма Form5 была там (может, нет? "title" не прочитан "Form5")
1571574. Form5 занял все пространство, предназначенное для основного приложения. Возможно, исправит ситуацию добавление ограничений в главное окно.
158158
159159---
160160*From the Free Pascal wiki, page "Anchor Docking Step by step example/ru", as it stood on 2020-01-20 after a change by Trev, 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).*
161161Category: Docking
162162Category: Russian

Back to history