在C ++ Builder中创建Vcl应用程序时,它会自动为您创建表单并添加以下行:
Application->CreateForm(__classid(Tmain), &main);
我倾向于使用
new
创建表单,因此删除所有这些行,但我的主要表单除外(有关某些讨论,请参见this article的Rob Kennedy)。我最近发现的是CreateForm()可以很高兴地创建包含纯虚拟方法的表单。这可能会在运行时导致“调用的纯虚函数”错误。相反,使用
new
创建表单会产生编译时“无法创建抽象类实例”错误。编译时错误优于运行时错误,我想知道我是否可以在所有形式(包括主形式)上使用
new
? Application.CreateForm()
在后台进行了哪些其他操作,我可以复制吗? 最佳答案
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进行工作。