4、上下Panel添加 OnDockDrop、OnDockOver、OnUnDock事件如下:
procedure TfrmMain.pnlBottomUnDock(Sender: TObject; ClIEnt: TControl;
NewTarget: TWinControl; var Allow: Boolean);
begin
if (Sender as TPanel).DockClIEntCount = 1 then
begin
(Sender as TPanel).Height := 1;
end;
end;
procedure TfrmMain.pnlBottomDockDrop(Sender: TObject;
Source: TDragDockObject; X, Y: Integer);
begin
(Sender as TPanel).Height := max(source.Control.UndockHeight,(Sender as TPanel).Height);
end;
procedure TfrmMain.pnlBottomDockOver(Sender: TObject;
Source: TDragDockObject; X, Y: Integer; State: TDragState;
var Accept: Boolean);
begin
if State = dsDragEnter then
begin
(Sender as TPanel).Height := max(Source.Control.UndockHeight, (Sender as TPanel).Height);
end
else
begin
if State = dsDragLeave then
begin
(Sender as TPanel).Height := 1;
end;
end;
end;
上下兩個Panel響應事件代碼相同。
5、創建新的窗體用於停靠到主窗體。
6、設置新窗體DragKind為dkDock,DragMode為dmAutomatic。
7、在新窗體OnClose事件中添加如下代碼:
if self.HostDockSite <> nil then
begin
self.ManualDock(nil);
end;
Action := caHide;
8、設置新窗體不自動創建。
9、在主創體中創建新窗體並顯示。記住:用Show,不要用ShowModal。
這種方法是一個不很規范的方法,如果需要更細致的控制,最好參考Delphi的Docking示例。如果將此例中的某個Panel更改為TabControl或者PageConrol,你可以得到更好的效果,不過代碼需要稍微變化,有興趣的哥們可以試試。