Где Sender - отправитель, Target - указатель на объект-получатель или Mil, если перенос закончился неудачно; X, Y - координаты курсора в момент
отпусканияклавиши мыши.
§4.9. Механизм причаливания
В Delphi введена поддержка специального механизма Drag&Dock (перетащи и причаль), посредством которого можно причалить мышкой компонент в новое место. В механизме Drag&Dock участвуют два компонента: принимающий компонент (всегда потомок TWnControl) и причаливаемый компонент (потомок класса TControl). Принимающий (оконный) компонент имеет свойство DockSite, установленное в True, оно делает компонент контейнером- приемником в рассматриваемом механизме.
Поскольку причаливание является частью более общего механизма перетаскивания, в класс TControl введено дополнительное свойство, благодаря которому различаются способы использования мыши. В компонентах, которые могут выступать клиентами в механизме Drag&Dock, надо установить свойство DragKind в dkDock. TDragKind = (dkDrag, dkDock);
property DragKind: TDragKind read FDragKind write FDragKind
default dkDrag;
Количество установленных на форме причаливаемых компонентов (у которых DragKind=dkDock и DockSite=False) определяется свойством DockClientCount, а их список хранится в свойстве-массиве DockClients.
Для реализации причаливания в класс TControl введены следующие свойства.
Свойство AutoSize разрешает (true) или запрещает оконному компоненту менять свои размеры в зависимости от количества и размеров содержащихся в
нем дочерних компонентов.
property AutoSize: Boolean read FAutoSize write SetAutoSize
default False;
Неоконные компоненты могут не только причаливаться к оконным элементам, но и покидать их. После «отчаливания» неоконные элементы автоматически оказываются в окне, тип которого содержит свойство FloatingDockSiteClass. По умолчанию это окно содержит уменьшенный по высоте заголовок и системную кнопку закрытия, property FloatingDockSiteClass: TWinControlClass
read GetFloatingDockSiteClass write "FloatingDockSiteClass;
В свойстве DockOrientation можно установить (получить) ориентацию, которую будет иметь «причаливаемый» компонент в окне родителя TDockOrientation = (doNoOrient, doHorizoxital, doVertical) , property DockOrientation: TDockOrientation read FDockOrientatiori
write FDockOrientation; doNoOrient - сохраняется исходная ориентация перемещаемого компонента; doHorizontal - компонент будет иметь горизонтальную ориентацию; doVertical - компонент будет иметь вертикальную ориентацию.
С помощью свойств LRDockWidth и TBDockEeight можно соответсвенно получить ширину последнего перемещенного компонента.
расположившегося горизонтально, или высоту последнего перемещенного
компонента, расположившегося вертикально, property LRDockWidth: Integer read GetLRDockWidth
write FLRDockWidth; property TBDockHeight: Integer read GetTBDockHeight
writ© FTBDockHeight; СвойстваUndockHeight иUndockWidth определяют высоту и ширину последнего «отчалившего» компонента.
property OndockHeight: Integer read GetOndockHeight
write FUndockHeight; property OndockWidth: Integer read GetOndockWidth
write FUndockWidth;
СвойствоConstraints с помощью объектаTSizeConstraintsнакладывает ограничения на возможные размеры причаливаемого компонента, property Constraints: TSizeConstraints read FConstraints
write SetConstraints;
Механизм Drag&Dock обслуживается следующими событиями. Для принимающего компонента:
· СобытиеOnGetSitelnfо возникает в момент начала перетаскивания и повторяется непрервно в процессе перетаскивания. Обработчик этого события должен сообщить объектуTDragDockObject, который автоматически связывается с причаливаемым объектом, некоторую дополнительную информацию (размеры, которые будет иметь этот объект, будет ли он погружен в «плавающее» окно и т.п.).
property OnGetSitelnfо: TGetSitelnfoEvent read FOnGetSitelnfo
write FOnGetSitelnfo; TGetSitelnfoEvent = procedure(Sender: TObject; DockClient: TControl;
var Inf luenceRect: TRect; MousePos: TPoint; таг CanDock: Boolean) of object; гдеDockClient - перетаскиваемый объект;
InfluenceReet - прямоугольник рамки перетаскиваемого объекта; MousePos - положение курсора мыши; CanDock - разрешение перетаскивать.
· СобытиеOnDoekOver аналогичноOnDragOver, оно возникает и повторяется, когда компонент-клиент перемещается над компонентом-приемником. Возвращаемый параметрAccept установленный вfalse определяет, что данный оконный компонент не принимает перетаскиваемый компонент.
property OnDoekOver: TDockOverEvent read FOnDockOver
write FOnDockOver; TDockOverEvent = procedure(Sender: TObject; Source: TDragDockObject;
X. X: Integer; State: TDragState; var Accept: Boolean) of object;
· СобытиеOnDockDrop аналогичноOnDragDrop, оно возникает в момент оконачания перетаскивания клиента над приемником. Этот обработчик позволяет разместить клиента Source тем или иным образом, в зависимости от его имени, типа, местоположения.
property OnDockDrop: TDockDropEvent read POnDockDroi,
write FOnDockDrop;
4. Событие OnUnDock возникает при отчаливании компонента. Обработчик этого события должен поместить в свойство Allow значение true, если компонент может покинуть границы своего владельца Sender.
property OnUnDock: TUnDockEvent read FOnUnDock write FOnUnDock; TUnDockEvent = procedure(Sender: TObject; Client: TControl;
NewTarget: TWinControl; var Allow: Boolean) of object; где, Client - компонент, который был клиентом; NewTarget - новый приемник;
Allow - определяет, можно ли перетащить клиента из приемника.
Все указанные события обрабатываются автоматически, если оба компонента содержат значение dmAutomatic в своем свойстве DragMode.