Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Procedure TDockableForm.CMDockclient




A) 6)

End.

End.

Для основной формы установлено свойство DockSite=false. Для двух расположенных на ней панелей (TPanel) и CoolBar1 установлено Dock-Site=true. Таким образом, "причаливание" клиентов TDockableForm разрешено к двум панелям. К компоненту TCoolBar также разрешено "при­чаливание". Используются при этом стандартные методы. Тип форм-


клиентов, которые могут быть пристыкованы к основной форме, описан во втором модуле uDockForm.

unit uDockForm; interface

uses Windows, Messages, SysUtils, Classes, Graphics,

Controls, Forms, Dialogs, Menus, ExtCtrls, StdCtrls; type

TDockableForm = class(TForm) Memo1: TMemo;

procedure FormDockOver (Sender: TObject; Source: TDragDockObject; X, Y: Integer; State: TDragState; var Accept: Boolean);

procedure FormClose (Sender: TObject;

var Action: TCloseAction); private

function ComputeDockingRect (var DockRect: TRect;

MousePos: TPoint): TAlign; end;

implementation {$R *.dfm}

uses ComCtrls, uMain;

procedure TDockableForm.FormDockOver (Sender: TObject; Source: TDragDockObject; X, Y: Integer; State: TDragState;

var Accept: Boolean); var.ARect: TRect;

begin

Accept:= (Source.Control is TDockableForm);

if Accept and (ComputeDockingRect(ARect,Point(X, 7)) <> alNone) then Source.DockRect:= ARect;

end;

function TDockableForm.ComputeDockingRect (var DockRect:

TRect; MousePos: TPoint): TAlign;

var DockTopRect, DockLeftRect, DockBottomRect,

DockRightRect, DockCenterRect: TRect; begin

Result:= alNone;

DockLeftReet.TopLeft:= Point(0, 0); DockLeftRect.BottomRight:= Point(ClientWidth div 5,

ClientHeight);

DockTopRect.TopLeft:= Point(ClientWidth div 5, 0); DockTopRect.BottomRight:= Point(

ClientWidth div 5*4, ClientHeight div 5); DockRightRect.TopLeft:= Point(ClientWidth div 5*4, 0); ' DockRightRect.BottomRight:=Point(ClientWidth, ClientHeight); DockBottomRect.TopLeft:= Point(ClientWidth div 5,

ClientHeight div 5 * 4);

DockBottomRect.BottomRight:= Point(ClientWidth div 5*4,


ClientHeight);

DockCenterRect.TopLeft: = Point(ClientWidth div 5,

4,

ClientHeight div 5);

DockCenterRect.BottomRight:= Point(ClientWidth div

ClientHeight div 5 * 4);

if PtInRect(DockLeftRect, MousePos) then begin

Result:= alLeft;

DockRect:= DockLeftRect;

DockRect.Right:= ClientWidth div 2;

end else

if PtInRect(DockTopRect, MousePos) then begin

Result:= alTop;

DockRect:= DockTopRect;

DockRect.Left:= 0;

DockRect.Right:= ClientWidth;

DockRect.Bottom:= ClientHeight div 2;

end else

 

if PtInRect(DockRightRect, MousePos) then begin

Result:= alRight;

DockRect:= DockRightRect;

DockRect.Left: = ClientWidth div 2;

 

end else

if PtInRect(DockBottomRect, MousePos) then begin

Result:= alBottom;

DockRect:= DockBottomRect;

DockRect.Left:= 0;

DockRect.Right:= ClientWidth;

DockRecb.Top:= ClientHeight div 2;

end else

if PtInRect(DockCenterRect, MousePos) then begin
Result:= alClient;
DockRect:= DockCenterRect;
end;

if Result = alNone then Exit;

DockRect. TopLeft:= ClxentToScreen(DockRect.TopLeft); DockRect.BottomRight:=ClientToScreen(DockRect.BottomRxght);

end;

procedure TDockablePorm.PormClose (Sender: TObject;

var Action: TCloseAction);

begin

Action:= caHide;

end;

Модуль uDockForm определяет форму, для которой установлено: Dock-Site=true, DragKind=DkDock, DragMode=dmAutomatic, т.е. данная форма может быть как клиентом, так и доком. Важную функцию выполняет под­программа ComputeDockingRect, которая позволяет вычислить возможный


вариант (по позиции курсора мыши) и прямоугольник пристыковки клиента. Можно попытаться изменить используемые в этой функции константы при расчете прямоугольника пристыковки. Приводятся 5 возможных вариантов, которые применяются для форм типа TDockableForm. Функция ptlnRect проверяет предоставляемый доком прямоугольник и проводит вычисления, необходимые для пристыковывания клиента. Второй вариант выполнения примера приводится на рис. 54, на котором показано, что используются пла­вающие панели инструментов.

Рис. 54

В примере использовалось несколько новых компонентов. Как можно заметить, в частности (см. рис. 53), одновременно было применено меню и две инструментальные панели с кнопками.

Практика показала, что для построения панелей инструментов удобно использовать специальные компоненты ТToolBar и ТCoolBar, находящиеся на странице Win32 палитры компонентов. Эти компоненты имеют большое разнообразие возможностей, свойств и методов. В данном случае ТСооШаг используется как контейнер, на котором расположены две инструменталь­ные панели со специальными кнопками TToolButton. Кроме кнопок, на па­нель ТТооШаг можно помещать комбинированные списки, быстрые кнопки SpeedButton, редакторы Edit и другие элементы. Для добавления новой

 


кнопки нужно щелкнуть на панели правой кнопкой мыши и выбрать пункт New Button.

Так как инструментальные кнопки и пункты меню дублируют друг друга в работе, для синхронизации управляющих элементов был использован ком­понент TActionList. Нажатием правой кнопки мыши на компоненте, распо­ложенном на форме, вызывается специальный редактор Action List Editor, который позволяет набрать нужное количество объектов действий Action типа Taction (рис. 55, категории ViewWindows (а) и ViewToolBars (б)).

Рис. 55

Все объекты Action группируются в категории, число которых можно выбирать произвольно или равным числу пунктов в линейке меню. На рис. 55 не показано, что пункт "Выход" входит в состав категории (No Category).

Очевидно, с каждым совпадающим по своему действию пунктом меню и инструментальной кнопкой должен работать один и тот же обработчик со­бытий. Дальнейшая настройка действий Action выполняется с помощью ин­спектора объектов (рис. 56, 57).


Образцы настройки свойств и событий для всех кнопок показаны на рис. 56 (показан выбор свойств (а) и событий (б) для кнопки Yellow). Естествен­но, вначале необходимо с помощью свойства Name присвоить всем кнопкам имена (на рис. 56 это не показано). Следует обратить внимание на то, что вместо события OnClick для пунктов меню настраивается событие On-Execute, используемое для действий Acton. Среда Delphi автоматически подставляет для события OnClick пункта меню (см. рис. 56, б) то же самое событие, что устанавлено программистом для события OnExecute.

Последняя операция заключается в согласовании действий элемента Ас-tionList1 и меню MainMenu1. Данное согласование также проводят, исполь­зуя инспектор объектов. На рис. 57 показан выбор свойств (а) и событий (б) для пункта меню Yellowl. Имена всех пунктов меню и инструментальных кнопок можно найти в тексте программы примера 24.

Рис. 57

В примере использовался еще один новый элемент TSplitter. Этот ком­понент служит для формирования окна, разделенного плавающими граница­ми на несколько зон. Сами компоненты TSplitter при этом остаются невиди­мыми. В данном случае было применено два таких элемента на нижней гра­нице и слева от основной формы (там, где на рис. 53 пристыкованы клиенты) для того, чтобы пристыкованные клиенты не уходили за пределы границ окна-дока.

Теперь, рассмотрим более сложные варианты технологии Drag and Drop с использованием нестандартных подходов, в частности, такого инструмен­та, как DockManager. Для этого нам понадобятся упоминавшиеся выше два модуля. Кроме того, необходимо немного изменить второй модуль uDockForm.

Необходимо обратить внимание на то, что построение форм conjoin-DockHost и TabDockHost осуществляется в процессе выполнения приложе­ния. Поэтому в программе-проекте нужно убрать строки автоматического построения этих форм, которые появятся после подключения к проекту до­полнительных модулей. Далее приводится текст программы второго модуля,

 




в котором опущено описание метода ComputeDockingRect (приводится выше).

unit uDockForm;

interface

uses Windows, Messages, SysUtils, Classes, Graphics,

Controls, Forms, Dialogs, Menus, ExtCtrls, StdCtrls; type

TDockableForm = class (TForm) Memo1: TMemo;

procedure FormDookOver (Sender: TObject; Source: TDragDockObject; X, Y: Integer;

State: TDragState; var Accept: Boolean); procedure FormClose (Sender: TObject;

var Action: TCloseAction); private

function ComputeDockingRect (var DockRect: TRect;

MousePos: TPoint): TAlign; procedure CMDockclient (var Message:

TCMDockClient); message CM_DOCKCLIENT; end;

implementation {$R *.dfm}

uses ComCtrls, uTabHost, uConjoinHost, uMain; procedure TDockableForm.FormDockOver (Sender: TObject; Source: TDragDockObject; X, Y: Integer; State: TDragState; var Accept: Boolean);

var ARect: TRect;

begin

Accept:= (Source.Control is TDockableForm);

if Accept and (ComputeDockingRect(ARect, Point(X, Y))

<> alNone) then Source.DockRect:= ARect; end; function TDockableForm.ComputeDockingRect

……….

end;

procedure TDockableForm.FormClose (Sender: TObject;

var Action: TCloseAction); begin

if (HostDockSite is TConjoinDockHost) then

if HostDockSite.VisibleDockClientCount <= 1

then HostDockSite.Hide;

if (HostDockSite is TPanel) then MainForm.ShowDockPanel(

HostDockSite as TPanel, False, nil); Action:= caHide;

end;

(var Message: TCMDockClient);


var ARect: TRect;

DockType: TAlign; Host: TForm; Pt: TPoint; begin

if Message.DockSource.Control is TDockableForm then begin

Pt.x:= Message.MousePos.x; Pt.y:= Message.MousePos.y; DockType:= ComputeDockingRect(ARect, Pt); if (HostDockSite is TPanel) then begin Message.DockSource.Control.ManualDock(

HostDockSite, nil, DockType); Exit; end; if DockType = alClient then begin

Host:= TTabDockHost.Create(Application);

Host.BoundsRect:= Self.BoundsRect;

Self.ManualDock(TTabDockHost(Host).PageControll,

nil, alClient);

Message.DockSource.Control.ManualDock(TTabDockHost(Host).PageControll, nil, alClient); Host.Visible:= True; end else begin

Host:= TConjoinDockHost.Create(Application); Host.BoundsRect:= Self.BoundsRect; Self.ManualDock(Host, nil, alNone); Message.DockSource.Control.ManualDock(

Host, nil, DockType); Host.Visible:= True;

end;

end;

end;




Поделиться с друзьями:


Дата добавления: 2014-12-29; Просмотров: 572; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.