在使用Delphi進行工作時,也許需要將多個獨立的窗口放在一個主窗口中,但有不打算使用多文檔界面(MDI),那麼下面介紹的方法可能對你會有所啟發。直接控制窗口的產生過程,並指定它的容器對象即Parent屬性或ParentWindow 屬性。
使用容器。這個容器是指可以容納目標窗口的控制元件(WindowsControl),它可以是窗口、面板、頁面控制等VCL對象。一個窗口在類別注冊後將調用API函數CreateWindow,函數調用時需要傳遞一個WndParent即父窗口的句柄。Delphi 已將該函數封裝在TcustomForm對象的CreateParams過程裡面了。原函數的參數也封裝在一個TCreateparams的記錄類型裡面。在IDE裡,我們重載它,然後在容器控制的單元中調用即可。假設要將Form2和Form3放在Form1的Panel1中,可以這樣做:
Form2單元接口部分
type
TForm2=Class(TForm)
pubic
procedureLoaded;override;
procedureCreateParams
(varParams:TParams);override;
end;
實現部分
procedureTForm2.Loaded;
begin
inheritedLoaded;
Visible:=Flase;
Position:=poDefault;
BorderIcons:=[];
BorderStyle:=bsNone;
//注意此時的窗口邊界樣式和圖標,
改變這兩個值,看看有無其它變化。
HandNeeded;//如果窗口不存在,就生成它。
SetBouds(0,0,Width,Height);
//不改變窗口原來的大小。
end;
procedureTForm2.CreateParams
(varParams:TCreateParams);
begin
inheritedCreateParams(Params);
Params.WndParent:=(OwnerasTForm).Handle;
//指定父窗口的句柄。
Params.Style:=WS_CHILDorWS_CLIPSIBLINGS;
//注意窗口的樣式。
params.X:=0;
params.Y:=0;
end;
Form3單元類似於Form2單元。注意理解Loaded方法的重載,以及和Create方法的區別,先後順序的不同。