C++Builder:Application.CreateForm() 是必要的吗?
C++Builder: Is Application.CreateForm() necessary?
当您在 C++Builder 中创建 Vcl 应用程序时,它会自动为您创建表单并添加如下行:
Application->CreateForm(__classid(Tmain), &main);
我倾向于使用 new
来创建表单,因此删除所有这些行,除了我的主表单的行(有关讨论,请参阅 this article by Rob Kennedy)。
我最近发现 CreateForm() 会非常愉快地创建包含纯虚拟方法的表单。这可能会在 运行 时导致 "pure virtual function called" 错误。相反,使用 new
创建表单会产生编译时 "cannot create instance of abstract class" 错误。
编译时错误优于 运行 时错误,我想知道我是否可以在所有窗体上使用 new
,包括主窗体? Application.CreateForm()
在幕后做了什么其他事情,我可以复制这个吗?
CreateForm()
在 Delphi 中实现,并且 Delphi 愉快地实例化抽象 classes 的对象(尽管有人猜测为什么)。当跨越 Delphi/C++ 边界时,任何一种语言自身提供的某些安全措施都可能会丢失。
在 C++ 中,您可以将 new
用于所有 secondary 窗体,但您 不能 将其用于主窗体(没有一些麻烦)。
Application->CreateForm()
在第一次创建 TForm
对象时分配 Application->MainForm
属性。 Application->Run()
需要 MainForm
。如果 MainForm
没有赋值,Run()
将立即退出,终止进程。
此外,MainForm
属性 在 VCL 中是只读的,因此您不能手动设置它(但在 FireMonkey 中可以)。
因此,尝试通过 new
手动创建 MainForm
是不值得的,因为您必须复制 CreateForm()
和 Run()
所做的一切在内部(建立应用程序与任务栏的关系,以及 运行 VCL 消息循环)。最好简单地确保您的主窗体 class 从一开始就不是抽象的,然后在 运行 时使用 CreateForm()
实例化它。让 VCL 完成它的工作。
当您在 C++Builder 中创建 Vcl 应用程序时,它会自动为您创建表单并添加如下行:
Application->CreateForm(__classid(Tmain), &main);
我倾向于使用 new
来创建表单,因此删除所有这些行,除了我的主表单的行(有关讨论,请参阅 this article by Rob Kennedy)。
我最近发现 CreateForm() 会非常愉快地创建包含纯虚拟方法的表单。这可能会在 运行 时导致 "pure virtual function called" 错误。相反,使用 new
创建表单会产生编译时 "cannot create instance of abstract class" 错误。
编译时错误优于 运行 时错误,我想知道我是否可以在所有窗体上使用 new
,包括主窗体? Application.CreateForm()
在幕后做了什么其他事情,我可以复制这个吗?
CreateForm()
在 Delphi 中实现,并且 Delphi 愉快地实例化抽象 classes 的对象(尽管有人猜测为什么)。当跨越 Delphi/C++ 边界时,任何一种语言自身提供的某些安全措施都可能会丢失。
在 C++ 中,您可以将 new
用于所有 secondary 窗体,但您 不能 将其用于主窗体(没有一些麻烦)。
Application->CreateForm()
在第一次创建 TForm
对象时分配 Application->MainForm
属性。 Application->Run()
需要 MainForm
。如果 MainForm
没有赋值,Run()
将立即退出,终止进程。
此外,MainForm
属性 在 VCL 中是只读的,因此您不能手动设置它(但在 FireMonkey 中可以)。
因此,尝试通过 new
手动创建 MainForm
是不值得的,因为您必须复制 CreateForm()
和 Run()
所做的一切在内部(建立应用程序与任务栏的关系,以及 运行 VCL 消息循环)。最好简单地确保您的主窗体 class 从一开始就不是抽象的,然后在 运行 时使用 CreateForm()
实例化它。让 VCL 完成它的工作。