268______________________________________________Глава 4  1

щелчке на компонентах-клиентах они превращаются в самостоятельные плаваю-
щие окна (панели Рапе15 и Рапе16 на рис. 4.14 б), которые можно перемещать, вы-
ходя даже за пределы родительской формы, можно изменять их размеры, можно
закрывать их, после чего соответствующие компоненты исчезают. Причем все это
достигнуто только заданием соответствующих свойств, без единого написанного
вами оператора.

Приемником может быть и сама форма. Укажите для формы вашего приложе-
ния DockSite равным true и выполните приложение опять. Поведение перетаски-
ваемых панелей несколько изменится. При щелчке на компонентах-клиентах они
по-прежнему превращаются в плавающие окна, которые можно перемещать, изме-
нять их размеры и т.п. Но при повторном щелчке они опять становятся обычными
панелями, сохраняя при этом измененное местоположение и размеры. Объясняет-
ся это тем, что повторный щелчок воспринимается в этом случае как встраивание
клиента в приемник — форму.

Теперь посмотрим, как можно управлять из компонента-приемника всеми
этими процессами.

У приемника имеется свойство DockClients, объявленное как

TControl* DockClients[int Index]

которое позволяет получить доступ к каждому клиенту, перенесенному в прием-
ник. Свойство DockClientCount содержит число клиентов. Оба свойства — Do-
ckClients и DockClientCount только для чтения.

Определены соответствующие события, которые позволяют приемнику управ-
лять процессом встраивания. Они генерируются только в том случае, если в компо-
ненте установлено DockSite = true.

Первое из этих событий — OnGetSiteInfo, возникающее в момент начала пере-
таскивания и повторяющееся непрерывно в процессе перетаскивания. Заголовок
соответствующего обработчика имеет вид:

void   fastcall TFormI::PanellGetSiteInfo(TObject *Sender,

TControl *DockClient, TRect &InfluenceRect,
TPoint SMousePos, bool sCanDock)

В качестве параметров в обработчик передается DockClient — перетаскивае-
мый объект, InfluenceRect — прямоугольник рамки перетаскиваемого объекта,
который можно изменять, MousePos — положение курсора мыши и CanDock —
разрешение перетаскивания. Если в обработчике указать CanDock = false, это бу-
дет означать, что приемник отказывается принимать, компонент. Например, вы
можете написать в обработчике события OnGetSiteInfo панели Panell оператор:

CanDock = DockClient != Рапе1б;

Тогда Panell будет принимать любой компонент, кроме Рапе16.
Еще одно событие — OnDockOver, возникающее и повторяющееся, когда ком-
понент-клиент перемещается над компонентом-приемником, точнее, когда в поле
приемника войдет курсор мыши, буксирующий клиента. Это событие аналогично
событию OnDragOver в технологии Drag&Drop. Заголовок соответствующего обра-
ботчика имеет вид:

void _fastcall TFormI::PanellDockOver(TObject *Sender,

TDragDockObject *Source, int X, int Y,
TDragState State, bool ^Accept)

В этом обработчике вы можете, как и в описанном выше, проверить, хотите ли
вы, чтобы данный оконный компонент принял перетаскиваемый компонент, опре-
деляемый параметром Source. Если принимать не надо, то задается значение Ac-
cept = false.