КАТЕГОРИИ: Архитектура-(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,
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 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; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |