2012-01-13 162 views
1

這是我的第一個主題下範式創建mdi窗體,並在mdi窗體錯誤打開MDI子

在同一個應用程序:

我有一個NormalForm(MainForm的),在一個彈出菜單調用的mdi窗體象這樣的:

MDIForm:=TMDIForm.Create(nil); 
MDIForm.Show; 

的形式開放的正確......現在,在MDI窗體我嘗試與創建MDIChild:

fm := TMDIChild.Create(Self); 
    fm.FormStyle:=fsMDIChild; 
    fm.Show; 

檢索錯誤: 無法創建表單。沒有MDI表格目前處於活動狀態

任何人都知道該怎麼做?!

回答

4

你不能混用這樣的表單樣式。 MDI子窗體期望應用程序的主窗體是MDI窗體。當創建子時,VCL的代碼不會查看是否有任何 MDI表單可用。

+0

查看是否有任何MDI表單可用的代碼!?你知道我是怎麼做到的嗎? – quimdotractor 2012-01-13 15:01:23

+0

查看Forms.pas中的TCustomForm.CreateWindowHandle。這是導致您的問題的VCL代碼。 MDI是一種老技術,大多數人已經遠離並試圖強迫它以沒有設計的方式工作而要求麻煩。一種解決方法可能是使您的MDI形成實際的主窗體,但將其隱藏起來。當前的主窗體將在啓動時顯示,當其彈出菜單想要顯示MDI窗體時,它不會像您的示例那樣創建它,而只是顯示它。 – 2012-01-13 15:12:21

+1

@ user1147833這就是要點。無法更改的VCL代碼假定主窗體,即Application.MainForm是MDI窗體。你需要這樣做。 – 2012-01-13 15:18:46

1

VCL本身不支持你正在嘗試的。它要求應用程序的MainForm設置爲FormStyle=fsMDIForm,並且它只有查看MainForm。你的MainForm不是這樣設置的。

這是一個VCL的限制,而不是Windows的限制。可以解決這個問題,並在其他非MainForm表單中使用MDI子表單,但它需要對VCL源代碼進行相當多的黑客攻擊。見this examplethis QC report