天天看點

Delphi非應用程式主視窗建立MDI

對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  ,如需轉載請自行聯系原作者

繼續閱讀