在 Delphi 開發中,有時需要將一個表單作為子控件嵌入另一個表單的面板中,以實現模組化介面設計。這篇文章示範如何透過設定 Parent 屬性與調整邊框樣式,將 Form2 完整嵌入 Form1 的 Panel 控件內。
在 Form1 的 OnCreate 事件中,動態建立 Form2 實例並指定父容器:
uses Unit2;
procedure TForm1.FormCreate(Sender: TObject);
begin
// 建立 Form2,指定 Owner 為 Panel,確保釋放機制正確
Form2 := TForm2.Create(Panel, Self);
// 移除邊框,使其融入面板
Form2.BorderStyle := bsNone;
// 最大化填滿父容器
Form2.WindowState := wsMaximized;
// 關鍵:設定 Parent 為 Panel,實現視覺嵌入
Form2.Parent := Panel;
Form2.Show;
end;
Form2 需要重新引入建構函數以接收父視窗參數,並保存參考以便日後響應父視窗事件:
uses Unit1;
type
TForm2 = class(TForm)
private
FOwnerForm: TForm;
public
// 重新引入建構函數,接收額外的 OwnerForm 參數
constructor Create(AOwner: TComponent; OwnerForm: TForm); reintroduce;
end;
constructor TForm2.Create(AOwner: TComponent; OwnerForm: TForm);
begin
inherited Create(AOwner);
FOwnerForm := OwnerForm; // 保存父視窗引用
end;
透過保存的 FOwnerForm 參考,子視窗可判斷父視窗類型並觸發對應邏輯:
procedure TForm2.Button1Click(Sender: TObject);
begin
// 檢查父視窗是否為 TForm1
if Self.FOwnerForm.ClassType = TForm1 then
begin
ShowMessage('按下我了!');
end;
end;
reintroduce 多載建構函數,建立雙向通訊管道。此技術常用於:MDI 風格介面模擬、插件式模組載入、複雜表單拆分為多個獨立單元開發再整合。掌握此技巧能大幅提升大型專案的維護性與模組化程度。