在C ++ Builder中创建Vcl应用程序时,它会自动为您创建表单并添加以下行:

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


我倾向于使用new创建表单,因此删除所有这些行,但我的主要表单除外(有关某些讨论,请参见this articleRob Kennedy)。

我最近发现的是CreateForm()可以很高兴地创建包含纯虚拟方法的表单。这可能会在运行时导致“调用的纯虚函数”错误。相反,使用new创建表单会产生编译时“无法创建抽象类实例”错误。

编译时错误优于运行时错误,我想知道我是否可以在所有形式(包括主形式)上使用newApplication.CreateForm()在后台进行了哪些其他操作,我可以复制吗?

最佳答案

CreateForm()是在Delphi中实现的,而Delphi则愉快地实例化了抽象类的对象(不过为什么有人会这样猜测)。当跨越Delphi / C ++边界时,任何一种语言单独提供的某些保护措施都可能丢失。

在C ++中,可以将new用于所有辅助表单,但是不能将其用于主表单(没有麻烦)。

首次创建Application->CreateForm()对象时,Application->MainForm分配TForm属性。 MainFormApplication->Run()所必需的。如果未分配MainFormRun()将立即退出,从而终止该过程。

另外,MainForm属性在VCL中是只读的,因此您不能手动设置它(但是可以在FireMonkey中设置)。

因此,尝试通过MainForm手动创建new的麻烦不值得,因为您随后必须在内部复制CreateForm()Run()做的所有事情(建立应用与任务栏的关系,然后运行VCL消息循环)。最好只是确保您的主窗体类从一开始就不会抽象,然后使用CreateForm()在运行时实例化它。让VCL进行工作。

10-01 20:26