對Delphi很熟悉的人,都知道MDI視窗的建立方式,是将主視窗的formstyle設定成MDIForm,然後将各個要設定成MDI的視窗的FormStyle都設定成MDIChild,運作就可以看到效果了嘿。
但是,如果MDI子視窗的依附視窗不是主視窗呢?此時是否依然能夠建立MDI應用程式呢?事實證明是不行的,通過看Forms單元的源碼中的CreateWindowHandle這個我們可以看到這樣幾句代碼
if (FormStyle = fsMDIChild) and not (csDesigning in ComponentState) then
begin
if (Application.MainForm = nil) or
(Application.MainForm.ClientHandle = 0) then
raise EInvalidOperation.Create(SNoMDIForm);
如果視窗樣式為MDIChild的,先檢視MainForm的ClientHandle是否為0,也就是說被局限在了
Application.MainForm上了,此時如果MainForm不是MDIForm樣式,那麼ClientHandle就為0了,是以就會報出一個異常 EInvalidOperation.Create(SNoMDIForm);
既然這樣,那我們就需要繞過Application.Mainform這個砍,讓子視窗建立的時候MainForm的 ClientHandle<>0,設定MDIForm自然就不是我們需要的了,我們是要非主視窗建立MDI應用程式,于是俺想到一個辦法修改 Application.MainForm這個屬性,修改成視窗樣式為MDIFOrm的非主視窗,此時不就可以過了嗎?
于是寫下
Application.MainForm := MyMdiForm;
很明顯這個是會報錯誤的,因為Application.MainForm為隻讀屬性聲明為:
Property MainForm: TForm read FMainForm;
那麼是否就無策了呢?細心的同志們仔細觀察一下應該是可以發現的MainForm指向的是FMainForm,也就是說MainForm就是FMainForm的位址映射,那麼我們就可以通過指針來達到這個修改的目的了哈哈
那麼就可以這樣
var
p: PInteger;
begin
p := @Application.MainForm;
p^ := Integer(form3);//這裡就修改了Application的Mainform的屬性了哈。
end;
然後我們就可以建立MDI子視窗了,呵呵
具體如下:
procedure TForm2.BitBtn1Click(Sender: TObject);
f: TForm;
f := Application.MainForm;
f.Hide;
form3 := Tform3.Create(nil);
p^ := Integer(form3);
Form3.Show;
f.Close;
僅供研究,使用請慎重。沒做任何測試。
本文轉自 不得閑 部落格園部落格,原文連結: http://www.cnblogs.com/DxSoft/archive/2010/01/01/1637659.html ,如需轉載請自行聯系原作者