4

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

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

我更喜欢用它new来创建表单,所以删除所有这些行,除了我的主要表单的那一行(有关一些讨论,请参阅Rob Kennedy 的这篇文章)。

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

编译时错误比运行时错误更可取,我想知道我是否可以new在所有表​​单上使用,包括主表单?Application.CreateForm()幕后还有什么其他事情,我可以复制吗?

4

1 回答 1

3

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

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

Application->CreateForm()第一次Application->MainForm创建对象时分配属性。TForm是所MainForm必需的Application->Run()。如果MainForm没有分配,Run()将立即退出,终止进程。

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

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

于 2016-11-17T00:04:46.680 回答