Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Разработка интерфейса Drag & Dock.doc
Скачиваний:
7
Добавлен:
15.11.2019
Размер:
192.51 Кб
Скачать

2. Методические указания по разработке проекта

Работа выполняется на С++.

1) Начните новый проект. Присвойте свойству Name формы значение DockForm, а свойству CaptionDrag & Dock. На форме создадим набор элементов управления Windows, расположенных на перемещаемых панелях (CoolBands). Поместите на форму два экземпляра компонента TСoolBar со страницы Win32, которые будут содержать панели инструментов. Чтобы вставить в панели CoolBar необходимые элементы управления, создадим две панели инструментов с помощью компонентов TToolBar. Установите их свойство ShowCaptions в true. Создайте у компонента ToolBar1 две кнопки с заголовками Aqua и Red, а у компонента ToolBar2 – две кнопки с заголовками Memo и Button.

Выберите на форме компонент CoolBar1, через контекстное меню которого или через свойство Bands создайте новую панель типа TСoolBands. В свойстве Control данной панели установите значение ToolBar1. Аналогично разместите панель инструментов ToolBar2 на панели компонента CoolBar2.

Значения свойства компонентов CoolBar1 и CoolBar2 AutoSize установите в true.

Поместите на форму третий экземпляр компонента TСoolBar, который будет служить контейнером для панелей инструментов. Создайте у него две панели, значения свойства Control которых установите соответственно в CoolBar1 и CoolBar2.

Запустите приложение на исполнение и попробуйте перетащить панели друг относительно друга.

2) Выберите компонент CoolBar3 и установите его свойство DockSite в true. Таким образом он станет доком и сможет принимать паркуемые компоненты.

Определим панель CoolBar1 в качестве паркуемого компонента. Установим ее свойство DragKind в значение dkDock, а DragMode – в dmAutomatic.

Запустите приложение. Теперь панель с кнопками Aqua и Red вытаскивается мышью за пределы формы и помещается обратно.

3) Создайте в проекте новую форму с именем Aqua и перенесите ее из списка Auto-create forms в список Available forms. Разместите на форме экземпляр компонента TPanel. Установите его свойства: DockSite – в true, DragKind – в dkDock, а DragMode – в dmAutomatic.

Расположите форму на экране таким образом, чтобы она при создании не перекрывала главную форму приложения.

Внесите в обработчик события OnClick кнопки Aqua следующий код:

inc (f);

Aqua:=T Aqua.Create (Self);

Aqua.Caption:= 'Aqua '+ IntToStr (f);

Aqua.Color:= clAqua;

Aqua.Show;

Переменную f для подсчета количества созданных форм объявите в разделе implementation модуля.

4) На главной форме модуля поместите два экземпляра компонента TGroupBox. Свойствам Caption которых присвойте соответственно Button и Memo. Они будут служить для привязки создаваемых компонентов с помощью соответствующих кнопок на панели инструментов.

В обработчики событий OnClick кнопок Button и Memo внесите соответственно следующий код:

procedure TForm1.ToolButton3Click(Sender: TObject);

var NewButton: TButton;

begin

NewButton:=TButton.Create(Self);

inc(b);

NewButton.DragKind:=dkDock;

NewButton.DragMode:=dmAutomatic;

NewButton.Caption:= 'DockButton '+IntToStr(b);

NewButton.Parent:=GroupBox1;

NewButton.Left:= 20;

NewButton.Top:=20;

NewButton.Show;

end;

procedure TForm1.ToolButton4Click(Sender: TObject);

var NewMemo: TMemo;

begin

NewMemo:=TMemo.Create(Self);

inc(m);

NewMemo.DragKind:=dkDock;

NewMemo.DragMode:=dmAutomatic;

NewMemo.Color:= rgb(0,m*60+50,0);

NewMemo.Parent:=GroupBox2;

NewMemo.Left:= 20;

NewMemo.Top:=20;

NewMemo.Show;

end;

Переменные b и m объявите аналогично переменной f.

5) Разместите на форме DockForm экземпляр компонента TPageControl и установите его свойство DockSite в true.

Запустите приложение. Создайте окно Aqua, а затем, создавая экземпляры кнопки Button и поля Memo, перетаскивайте их на компонент Panel окна Aqua или на компонент PageControl. Выполните парковку компонента Panel.

Осуществите вывод информации о количестве припаркованных компонентов.

S : = " ;

for i := 0 to Panell.DockClientCount-1 do

AppendStrfs,Panel1.DockClients[i].Name+#$D#$A);

ShowMessage(s);

Для припаркованных компонентов также выведите соответствующую информацию.

Пример:

procedure TForm1.ButtonlEndDock(Sender, Target: TObject; X, Y: Integers);

begin

(Sender as TControl).HostDocksite.SetTextBuf(pChar((Sender as TControl) .Name)) ;

end;

6) Переносить компоненты можно не только с помощью мыши, но и программно. Для этого используются соответствующие методы.

а) Для программного размещения компонента в доке используется метод

function ManualDock (NewDockSite: TWinControl;

DropControl: TControl = nil; ControlSide: TAlign = alNone): Boolean;

Этот метод определен у компонентов класса TControl. Параметр NewDockSite определяет док, куда будет помещен компонент. DropControl – это компонент в доке, на который будет помещаться данный компонент (по умолчанию он отсутствует). Привязкой компонента к границам дока (по умолчанию – отсутствует) управляет параметр ControlSide.

Пример нажатие кнопки с именем BitBtnl переносит форму custForm на док MainForm. panell и размещает ее по всей доступной площади (параметр выравнивания alciient).

procedure TMainFom.BitBtnIClick (Sender: TObject);

begin CustForm.ManualDock(MainForm.Panell,nil,

alciient);

end;

б) метод ManualFloat снимает компонент с дока.

Пример Нажатие кнопки BitBtn2 снимает эту форму с дока и выравнивает ее по центру экрана. В свойствах UndockHeight и UndockWidth хранятся высота и ширина элемента управления на момент, предшествующий помещению на док:

procedure TMainForm.BitBtn2Click(Sender: TObject);

begin

with CustForm do begin ManualFloat(Rect( (Screen.Width-UndockWidth) div 2,

(Screen.HeightUndockHeight) div 2, (Screen.Width+UndockWidth) div 2, (Screen.Height+UndockHeight) div 2));

end;

Создайте новую форму с именем Client с компонентом TMemo, которая будет использоваться в качестве клиентов при парковке в доке. Установите его свойства DragKind в dkDock и DragMode в dmAutomatic. Свойству Align присвойте значение alClient. Чтобы модифицировать свойства формы во время работы, создайте процедуру, изменяющую заголовок окна и текст, отображаемый компонентом TMemo:

procedure TClient.InitControls (Capt: String);

begin

Caption:=capt;

Memo1.Lines.Text:=capt;

end;

В данном случае форма Client – это компонент, который будет использован для парковки в доке. Поэтому у нее также нужно будет установить свойства DragKind в dkDock и DragMode в dmAutomatic.

7) В модуле формы Aqua объявите переменные

var

View, Tree, Editor: TClient;

Установите свойство формы DockSite в true.

Разместите на форме Aqua экземпляр компонента TPageControl и установите его свойство DockSite в true.

8) Для того, чтобы при запуске программы клиенты поместились на форму в нужное место, напишите обработчик события OnCreate формы Aqua.

procedure TAqua.FormCreate (Sender: TObject);

begin

View:= TClient.Create (Self);

View.InitControls('Обзор');

Tree:=TClient.Create(Self);

Tree.InitControls('Дерево');

Editor:=TClient.Create(Self);

Editor.InitControls('Редактор');

// поместим PageControl в док

PageControl1.BeginDrag(true); //переместим

PageControl1.EndDrag(true); // бросим

PageControl1.ManualDock(Self, nil, alTop);//поместим в док

// поместим клиентов в док

Editor.ManualDock(Self, nil, alLeft); // на форму слева

View.ManualDock(self.PageControl1); // на PageControl

Tree.ManualDock(self.PageControl1); // на PageControl

Editor.Show;

View.Show;

Tree.Show;

end;

Обработчик создает три экземпляра формы (TClient) для размещения в доке и инициалицирует свойства каждого экземпляра уникальными значениями. Затем компонент TPageControl размещается в доке формы. Во время работы это можно сделать, перетаскивая компонент с помощью мыши. При размещении клиентов в доке одна форма размещается на форме Aqua, а две – на компоненте TPageControl.

Запустите приложение на исполнение. Планируемый вид элементов управления не получен. Для того чтобы программно управлять операциями парковки необходимо использовать свойства UseDockManager и DockManager.

В нашем примере установите свойство UseDockManager формы Aqua в true.

Свойство DockManager представляет собой СОМ-интерфейс, позволяющий расширить возможности дока, вплоть до записи его состояния в поток (TStream).