在C ++ Builder中创建Vcl应用程序时,它会自动为您创建表单并添加以下行:
Application->CreateForm(__classid(Tmain), &main);
我倾向于使用new
来创建表单,因此请删除除主表单之外的所有行(请参阅this article Rob Kennedy进行讨论)。< / p>
我最近发现的是,CreateForm()非常乐意创建包含纯虚方法的表单。这可能导致在运行时“调用纯虚函数”错误。相反,使用new
创建表单会产生编译时“无法创建抽象类的实例”错误。
编译时错误比运行时错误更好,我不得不怀疑是否可以在所有表单上使用new
,包括主窗体? Application.CreateForm()
在幕后做了什么其他的事情,我可以复制一下吗?
答案 0 :(得分:2)
CreateForm()
在Delphi中实现,Delphi愉快地实例化抽象类的对象(为什么任何人都在猜测)。跨越Delphi / C ++边界时,任何一种语言本身提供的某些安全措施都可能丢失。
在C ++中,您可以将new
用于所有辅助表单,但不能将其用于主表单(没有麻烦)。
Application->CreateForm()
对象时, Application->MainForm
会分配TForm
属性。 MainForm
需要Application->Run()
。如果未分配MainForm
,Run()
将立即退出,从而终止该过程。
此外,MainForm
属性在VCL中是只读的,因此您无法手动设置(但您可以在FireMonkey中)。
因此,尝试通过MainForm
手动创建new
是不值得的,因为您必须复制CreateForm()
和Run()
内部执行的所有内容(建立应用程序与任务栏的关系,并运行VCL消息循环)。最好简单地确保您的主窗体类从不开始抽象,然后使用CreateForm()
在运行时实例化它。让VCL开展工作。