gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 03:27:00 26 4
gpt4 key购买 nike

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

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

我倾向于使用 new要创建表单,因此删除所有这些行,除了我的主表单的那一行(有关一些讨论,请参阅 this article by Rob Kennedy)。

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

编译时错误优于运行时错误,我不知道我是否可以使用 new在所有表格上,包括主表格?还有什么东西是 Application.CreateForm()在幕后做,我可以复制这个吗?

最佳答案

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

在 C++ 中,您可以使用 new对于所有辅助表单,但您 不能 将它用于主窗体(没有一些麻烦)。
Application->CreateForm()分配 Application->MainForm创建 TForm 时的属性第一次对象。 MainFormApplication->Run() 要求.如果MainForm未分配,Run()将立即退出,终止进程。

另外,MainForm属性在 VCL 中是只读的,所以你不能手动设置它(不过你可以在 FireMonkey 中)。

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

关于C++Builder:是否需要 Application.CreateForm()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40631119/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com