Студопедия

КАТЕГОРИИ:


Архитектура-(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; Просмотров: 438; Нарушение авторских прав?; Мы поможем в написании вашей работы!


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



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




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