利用 Panel 作為停靠站點 (DockSite = True),配合 Splitter 調整大小,在停靠/取消停靠事件中動態調整 Panel 尺寸,實現類似 IDE 的停靠窗體效果。
DockSite = True。OnDockDrop/OnDockOver/OnUnDock 事件,控制 Width。Height。DragKind = dkDock、DragMode = dmAutomatic。OnClose 執行 ManualDock(nil); Action := caHide;。Show 顯示 (非 ShowModal)。procedure TfrmMain.pnlLeftUnDock(Sender: TObject; Client: TControl;
NewTarget: TWinControl; var Allow: Boolean);
begin
if (Sender as TPanel).VisibleDockClientCount = 1 then
(Sender as TPanel).Width := 1;
end;
procedure TfrmMain.pnlLeftDockDrop(Sender: TObject;
Source: TDragDockObject; X, Y: Integer);
begin
(Sender as TPanel).Width := Max(Source.Control.UndockWidth, (Sender as TPanel).Width);
end;
procedure TfrmMain.pnlLeftDockOver(Sender: TObject;
Source: TDragDockObject; X, Y: Integer; State: TDragState;
var Accept: Boolean);
begin
if State = dsDragEnter then
(Sender as TPanel).Width := Max(Source.Control.UndockWidth, (Sender as TPanel).Width)
else if State = dsDragLeave then
(Sender as TPanel).Width := 1;
end;
右 Panel 代碼相同;上下 Panel 將 Width 換為 Height、UndockWidth 換為 UndockHeight。
PageControl 可實現標籤式停靠。Docking 示例。AutoCreate,運行時手動創建。