在Delphi7中實現停靠功能我們在使用Delphi7開發應用系統過程中經常需要使用子視窗在主視窗上停靠的功能,如果對這一部分不熟練時,通常會到CSDN等網站尋找各種相關的控件,或者參考Delphi自帶的例程Docking,以下我要為大家介紹一個能夠湊乎用的簡單方法。 1.在主視窗中加入四個Panel和四個Splitter,設定對齊上下左右四邊。
2.設定四個Panel的屬性DockSite屬性為True。
3.左右Panel添加OnDockDrop、OnDockOver、OnUnDock事件如下:
PRocedure TfrmMain.pnlLeftUnDock(Sender: TObject; Client: TControl;
NewTarget: TWinControl; var Allow: Boolean);
begin
if (Sender as TPanel).VisibleDockClientCount = 1 then
begin
(Sender as TPanel).Width := 1;
end ;
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
begin
(Sender as TPanel).Width := max(Source.Control.UndockWidth, (Sender as TPanel).Width);
end
else
begin
if State = dsDragLeave then
begin
(Sender as TPanel).Width := 1;
end;
end;
end;
左右Panel響應事件代碼相同。 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,你可以得到更好的效果,不過程式碼需要稍微變化,有興趣的哥們可以試試。