2016-11-16 35 views
3

當您在C++ Builder中的Vcl應用程序,它爲你自動創建形式,並增加了線,如:C++ Builder:是否需要Application.CreateForm()?

Application->CreateForm(__classid(Tmain), &main); 

我傾向於更喜歡使用new創建表單,所以刪除所有這些行除了我的主要形式之外(參見this articleRob Kennedy進行了一些討論)。

我最近發現的是,CreateForm()將非常高興地創建包含純虛方法的表單。在運行時會導致「純虛函數稱爲」錯誤。相反,使用new創建表單給出了編譯時「不能創建抽象類的實例」的錯誤。

編譯時錯誤優於運行時錯誤,我不得不懷疑我是否可以在所有表​​單上使用new,包括主窗體?還有什麼其他的東西是Application.CreateForm()在幕後做的,我可以複製這個?

+0

在項目 - >選項 - >表單中你有一個列表「自動創建表單」(和一個主表單選擇)。您可以將除主窗體之外的所有窗體移動到「可用窗體」列表中,以在運行時手動創建它們。 – Flanker

回答

2

CreateForm()在Delphi中實現,並且Delphi很高興地實例化了抽象類的對象(儘管爲什麼會有人猜測)。當跨越Delphi/C++邊界時,任何一種語言提供的某種安全措施都可能會丟失。

在C++中,可以使用new所有次級形式,但你不能使用它的主要形式(沒有一些麻煩)。

Application->CreateForm()第一次創建TForm對象時會分配Application->MainForm屬性。 Application->Run()需要MainForm。如果未分配MainForm,則Run()將立即退出,終止該過程。

而且,MainForm屬性在VCL中是隻讀的,所以不能手動設置它(可以在FireMonkey中)。

所以,這是不值得的麻煩試圖通過new手動創建MainForm,因爲你再有重複的一切,CreateForm()Run()做內部(建立應用程式和任務欄上的關係,並運行VCL消息循環) 。最好簡單地確保你的主窗體類從不抽象開始,然後使用CreateForm()在運行時實例化它。讓VCL做它的工作。

+0

我可以從TApplication派生出來,並使派生類中的MainForm讀寫嗎?還是有更多的在CreateForm? –

+0

@NigelHawkins:不,你不能使'MainForm'屬性讀/寫,因爲'FMainForm'成員是私有的。但是有一些[一些技巧](http://stackoverflow.com/questions/25666626/)可以用來改變這個值。是的,在CreateForm()中還有更多的事情不只是設置屬性。 –