C ++ Builder:Application.CreateForm()是否必要?

时间:2016-11-16 11:35:36

标签: c++builder vcl c++builder-xe6

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

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

我倾向于使用new来创建表单,因此请删除除主表单之外的所有行(请参阅this article Rob Kennedy进行讨论)。< / p>

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

编译时错误比运行时错误更好,我不得不怀疑是否可以在所有表​​单上使用new,包括主窗体? Application.CreateForm()在幕后做了什么其他的事情,我可以复制一下吗?

1 个答案:

答案 0 :(得分:2)

CreateForm()在Delphi中实现,Delphi愉快地实例化抽象类的对象(为什么任何人都在猜测)。跨越Delphi / C ++边界时,任何一种语言本身提供的某些安全措施都可能丢失。

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

第一次创建Application->CreateForm()对象时,

Application->MainForm会分配TForm属性。 MainForm需要Application->Run()。如果未分配MainFormRun()将立即退出,从而终止该过程。

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

因此,尝试通过MainForm手动创建new是不值得的,因为您必须复制CreateForm()Run()内部执行的所有内容(建立应用程序与任务栏的关系,并运行VCL消息循环)。最好简单地确保您的主窗体类从不开始抽象,然后使用CreateForm()在运行时实例化它。让VCL开展工作。