首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 7 實現窗體停靠功能的簡易方案

     編輯:Delphi

核心思路

利用 Panel 作為停靠站點 (DockSite = True),配合 Splitter 調整大小,在停靠/取消停靠事件中動態調整 Panel 尺寸,實現類似 IDE 的停靠窗體效果。

步驟概覽

  1. 主窗體放置 4 個 Panel (Align 分別 alLeft/alRight/alTop/alBottom) + 4 個 Splitter。
  2. 設置 4 個 Panel 的 DockSite = True。
  3. 左右 Panel 掛接 OnDockDrop/OnDockOver/OnUnDock 事件,控制 Width。
  4. 上下 Panel 掛接同類事件,控制 Height。
  5. 子窗體設置 DragKind = dkDock、DragMode = dmAutomatic。
  6. 子窗體 OnClose 執行 ManualDock(nil); Action := caHide;。
  7. 主窗體動態創建子窗體並用 Show 顯示 (非 ShowModal)。

關鍵事件代碼 (左 Panel 為例)

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。

進階建議

  • 將 Panel 替換為 PageControl 可實現標籤式停靠。
  • 需更精細控制時,參考 Delphi 自帶 Docking 示例。
  • 子窗體不勾選 AutoCreate,運行時手動創建。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved