КАТЕГОРИИ: Архитектура-(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) |
Implementation. Процедура CMDockclient позволяет подключить к
End. Процедура CMDockclient позволяет подключить к. приложению новые доки из двух подключенных модулей. Если сообщение клиента о возможности присоединения было проигнорировано (в данном случае основной формой), то процедура CMDockclient строит с помощью объявленной вспомогательной переменной Host один из двух объявленных в модулях uCon-joinHost и uTabHost новых доков и после дополнительных проверок пытается пристыковать клиентов с помощью нестандартных методов к этим докам. Может быть построено несколько таких доков. Один вариант формы-дока (форма-контейнер) объявлен в модуле, который приводится ниже.
unit uConjoinHost; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, uDockForm; type TConjoinDockHost = class(TForm) procedure FormClose (Sender: TObject; var Action: TCloseAction); procedure FormDockDrop (Sender: TObject; Source: TDragDockObject; X, Y: Integer); procedure FormOnDock (Sender: TObject; Client: TControl; NewTarget: TWinControl; var Allow: Boolean); procedure FonnDockOver (Sender: TObject; Source: TDragDockObject; X, Y: Integer; State: TDragState; var Accept: Boolean); procedure FormGetSitelnfо (Sender: TObject; DockClient: TControl; var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean); private procedure DoFloat(AControl: TControl); end; var ConjoinDockHost: TConjoinDockHost; implementation {$R *.dfm} procedure TConjoinDockHost.DoFloat (AControl: TControl); var ARect: TRect; begin ARect.TopLeft:= AControl.ClientToScreen(Point(0, 0)); ARect.BottomRight:= AControl.ClientToScreen(Point (AControl.UndockWidth, AControl.UndockHeight)); AControl.ManualFloat(ARect); end; procedure TConjoinDockHost.FormClose (Sender: TObject; var Action: TCloseAction); begin if DockClientCount = 1 then begin DoFloat(DockClients[0]); Action:= caFree; end else Action:= caHide; end; procedure TConjoinDockHost.FormDockDrop (Sender: TObject; Source: TDragDockObject; X, Y: Integer); begin DockManager.ResetBounds(True); end; procedure TConjoinDockHost.FormUnDock (Sender:TObject;Client: TControl; NewTarget:TWinControl; var Allow: Boolean); begin if Client is TDockableForm then TDockableForm(Client).DockSite:= True; if (DockClientCount = 2) and (NewTarget <> Self) then PostMessage(Self.Handle, WM_CLOSE, 0, 0); end; procedure TConjoinDockHost.FonnDockOver (Sender: TObject; Source: TDragDockObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin Accept:= Source.Control is TDockableForm; end; procedure TConjoinDockHost.FormGetSitelnfо (Sender: TObject; DockClient: TControl; var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean); begin CanDock:= DockClient is TDockableForm; end; end. Для формы-контейнера установлено: DockSite=true и UseDockMan-ager=true (обязательно установить, иначе сгенерируется исключительная ситуация). На рис. 58 показан вариант пристыковки к форме-контейнеру трех клиентов. Рис. 58 Последняя форма (TabDockHost) не может принимать клиентов - эту функцию выполняет расположенный на ней компонент PageControl1, у которого установлено свойство DockSite=true. Модуль, в котором эта форма объявлена, приводится ниже. unit uTabHost; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls; type TTabDockHost = class(TForm) PageControl1: TPageControl; procedure FormClose (Sender: TObject; var Action: TCloseAction); procedure PageControllUnDock (Sender: TObject; Client: TControl; NewTarget: TWinControl; var Allow: Boolean); procedure PageControllGetSitelnfo (Sender: TObject; DockClient: TControl; var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean); procedure PageControllDockOver (Sender: TObject; Source: TDragDockObject; X, Y: Integer; State: TDragState; var Accept: Boolean); end; var TabDockHost: TTabDockHost; {$R *.dfm} uses uDockForm; procedure TTabDockHost.FormClose (Sender: TObject; var Action: TCloseAction); var ARect: TRect;^ begin if PageControll.DockClientCount = 1 then begin with PageControll.DockClients[0] do begin ARect.TopLeft:= ClientToScreen(Point (0, 0)); ARect.BottomRight:= ClientToScreen(Point(UndockWidth, UndockHeight)); ManualFloat(ARect); end; Action:= caFree; end else Action:= caHide; end; procedure TTabDockHost.PageControllUnDock (Sender: TObject; Client:TControl; NewTarget:TWinControl; var Allow:Boolean) begin if (PageControll.DockClientCount = 2) and (NewTarget <> Self) then PostMessage(Self.Handle, WM_CLOSE, 0, O); end; procedure TTabDockHost.PageControllGetSitelnfo (Sender: TObject; DockClient: TControl; var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean); begin CanDock:= DockClient is TDockableForm; end; procedure TTabDockHost.PageControllDockOver (Sender: TObject; Source: TDragDockObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin Accept:= Source.Control is TDockableForm; end;
Дата добавления: 2014-12-29; Просмотров: 465; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |