17.9. ИНТЕРФЕЙС DRAG&DOCK

В Delphi введена поддержка специального интерфейса Drag&Dock (перетащи и причаль), с помощью которого можно перетаскивать мышью компоненты на новое место. В среде Delphi этот интерфейс используется для настройки кнопок инструментальных панелей (см. гл. 2).

В интерфейсе Drag&Dock участвуют два компонента: принимающий компонент (всегда - потомок TWinControl) и перетаскиваемый компонент (потомок TControl).

Принимающий компонент должен иметь значение True в своем свойстве Docksite. Поскольку Drag&Dock является разновидностью более общего интерфейса Drag&Drop, в TControi введено дополнительное свойство

property DragKind: TDragKind;

type TDragKind = (dkDrag, dkDock) ;

с помощью которого различаются способы использования мыши: для Drag&Drop (dkDrag) или для Drag&Dock (dkDock). И у перетаскиваемого компонента, и у компонента-приемника эти свойства должны иметь значения dkDock.

Количество установленных на форме перетаскиваемых компонентов (Т. С. компонентов, у которых DragKind=dkDock И DockSite=False) Определяется свойством DockClientCount, а их список хранится в индексированном свойстве DockClients.

Для реализации Drag&Dock в класс TControl введены такие дополнительные свойства и события.

property AutoSize: Boolean;

Разрешает (True) или запрещает (False) оконному компоненту менять свои размеры автоматически в зависимости от количества и размеров содержащихся в нем дочерних компонентов. Свойство

property FloatingDockSiteClass: TWinControlClass;

определяет класс окна, в которое будет погружен дочерний элемент вне границ оконного элемента. Неоконные компоненты могут не только перетаскиваться в оконные компоненты-приемники, но и покидать их. После “отчаливания” от компонента-приемника неоконные элементы автоматически окружаются окном, тип которого содержит свойство FloatingDockSiteClass. По умолчанию это окно содержит уменьшенный по высоте заголовок и системную кнопку закрытия. В свойстве

property DockOrientation: TDockOrientation;

type TDockOrientation = (doNoOrient,doHorizontal,doVertical);

можно установить (или получить) ориентацию, которую будет иметь “причаливаемый” компонент в окне родителя: doNoOrient -сохраняется исходная ориентация перемещаемого компонента; do-Horizontal (dovertical) - компонент будет иметь горизонтальную (вертикальную) ориентацию. С помощью свойства

property LRDockWidth: Integer;

можно получить ширину последнего перемещенного компонента, который расположился горизонтально, а с помощью

property TBDockHeight: Integer;

- высоту последнего вертикально расположенного компонента.

Свойства

property UndockHeight: Integer; property UndockWidth: Integer;

определяют соответственно высоту и ширину последнего “отчалившего” компонента. Свойство

property Constraints: TSizeConstraints;

с помощью объекта класса TSizeConstraints накладывает ограничения на возможные размеры “причаливаемого” компонента (задает максимальные и минимальные величины для высоты и ширины).

События

property OnDockDrop: TDockDropEvent;

property OnDockOver: TDockOverEvent;

type TDockOverEvent = procedure(Sender: TObject; Source:

TDragDockObject; X, Y: Integer; State: TDragState;

var Accept:

Boolean) of object;

аналогичны событиямиOnDragDrop и OnDragOver (CM. П.17.7). Co6ытие

property OnGetSiteInfo: TGetSiteInfoEvent;

возникают перед событием OnDragDrop. Его обработчик должен сообщить объекту TDragDockObject, который автоматически связывается с перемещаемым объектом, некоторую дополнительную информацию (размеры, которые будет иметь принимаемый объект, будет ли он погружен в “плавающее” окно и т. п.). Наконец, событие

property OnUnDock: TUnDockEvent;

type TUnDockEvent = procedure (Sender: TObject; Client: TControl;

var Allow: Boolean) of object;

возникает при “отчаливании” неоконного компонента от своего родителя. Обработчик этого события должен поместить в Allow значение True, если компонент client может покинуть границы своего владельца sender.

Все указанные события обрабатываются автоматически, если оба компонента (клиент и сервер) содержат значение dmAutomatic в своем свойстве DragMode.

Чтобы познакомиться в действии с технологией Drag&Dock, поместите на пустую форму панель трапе! и кнопку TButton, установите для панели значение True в свойство Docksite, установите для обоих компонентов Значение dkDock в свойстваа DragKind И dmAutomatic в свойства DragMode. После запуска программы перетащите кнопку на панель, а затем стащите ее обратно.