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. После запуска программы перетащите кнопку на панель, а затем стащите ее обратно.