Controlling How Child Controls Are Docked

From RAD Studio
Jump to: navigation, search

Go Up to Implementing Drag and Dock in Controls

A docking site automatically accepts child controls when they are released over the docking site. For most controls, the first child is docked to fill the client area, the second splits that into separate regions, and so on. Page controls dock children into new tab sheets (or merge in the tab sheets if the child is another page control).

Three events allow docking sites to further constrain how child controls are docked:

 property OnGetSiteInfo: TGetSiteInfoEvent;
 TGetSiteInfoEvent = procedure(Sender: TObject; DockClient: TControl; var   InfluenceRect: TRect; var CanDock: Boolean) of object;
__property TGetSiteInfoEvent OnGetSiteInfo = {read=FOnGetSiteInfo, write=FOnGetSiteInfo}; 
typedef void __fastcall (__closure *TGetSiteInfoEvent)(System::TObject* Sender, TControl* DockClient, Windows::TRect &InfluenceRect, const Windows::TPoint &MousePos, bool &CanDock);

OnGetSiteInfo occurs on the docking site when the user drags a dockable child over the control. It allows the site to indicate whether it will accept the control specified by the DockClient parameter as a child, and if so, where the child must be to be considered for docking. When OnGetSiteInfo occurs, InfluenceRect is initialized to the screen coordinates of the docking site, and CanDock is initialized to True. A more limited docking region can be created by changing InfluenceRect and the child can be rejected by setting CanDock to False.

 property OnDockOver: TDockOverEvent;
 TDockOverEvent = procedure(Sender: TObject; Source: TDragDockObject; X, Y:  Integer; State: TDragState; var Accept: Boolean) of object;
__property TDockOverEvent OnDockOver = {read=FOnDockOver, write=FOnDockOver};
typedef void __fastcall (__closure *TDockOverEvent)(System::TObject* Sender, TDragDockObject* Source, int X, int Y, TDragState State, bool &Accept);

OnDockOver occurs on the docking site when the user drags a dockable child over the control. It is analogous to the OnDragOver event in a drag-and-drop operation. Use it to signal that the child can be released for docking, by setting the Accept parameter. If the dockable control is rejected by the OnGetSiteInfo event handler (perhaps because it is the wrong type of control), OnDockOver does not occur.

 property OnDockDrop: TDockDropEvent;
 TDockDropEvent = procedure(Sender: TObject; Source: TDragDockObject; X, Y:  Integer) of object;
__property TDockDropEvent OnDockDrop = {read=FOnDockDrop, write=FOnDockDrop}; typedef void __fastcall (__closure *TDockDropEvent)(System::TObject* Sender, TDragDockObject* Source, int X, int Y);

OnDockDrop occurs on the docking site when the user releases the dockable child over the control. It is analogous to the OnDragDrop event in a normal drag-and-drop operation. Use this event to perform any necessary accommodations to accepting the control as a child control. Access to the child control can be obtained using the Control property of the TDockObject specified by the Source parameter.

See Also