设C++;Builder/Delphi在启动时创建TForms,还是手动创建?

设C++;Builder/Delphi在启动时创建TForms,还是手动创建?,delphi,c++builder,vcl,Delphi,C++builder,Vcl,在Builder(或Delphi)中创建TForm时,会将代码添加到main,以便在应用程序启动时创建这些表单: Application->CreateForm( __classid( TxForm), &xForm ); 这使事情变得更容易,但是当应用程序有10、20、50、100个表单时,它明智吗?我假设这可以获取所有类型的内存和系统句柄。当需要时,通过使用“项目->选项->表单”对话框删除表单,并: std::auto_ptr< TxForm > myForm(

在Builder(或Delphi)中创建TForm时,会将代码添加到
main
,以便在应用程序启动时创建这些表单:

Application->CreateForm( __classid( TxForm), &xForm );
这使事情变得更容易,但是当应用程序有10、20、50、100个表单时,它明智吗?我假设这可以获取所有类型的内存和系统句柄。当需要时,通过使用“项目->选项->表单”对话框删除表单,并:

std::auto_ptr< TxForm > myForm( new TxForm( this ));

myForm->ShowModal();
std::auto_ptrmyForm(新TxForm(this));
myForm->showmodel();

<> P>这是个问题,最好是让C++ Builder自己做它的方法,或者在需要时手动创建表单?

这完全取决于你如何在你的应用程序中使用表单。我通常在需要时动态创建它们,然后在完成后释放它们。这是更多的手工工作,但节省资源(并且每次都会花费一点CPU,这可能会导致延迟)


如果你很少使用表单,我会说在需要时手动创建/释放(删除),但如果你在整个应用程序生命周期内一直使用表单,请使用默认方式。

已创建但尚未可见的表单占用内存并影响启动时间,但不应使用任何系统句柄,因为像窗口句柄这样的东西在窗口实际显示之前是不会分配的

尽管如此,我几乎总是手动创建表单(使用类似于您的
auto_ptr
)的代码),因为我无法忍受全局变量。手动创建表单有几个优点:应用程序启动速度更快,表单始终以已知的良好状态显示,如果需要,更容易在以后切换到同时显示表单的多个实例


正如,
delete
直接(或间接,通过使用库存
std::auto_ptr
)删除表单可能会导致内存错误,因为表单可能有未处理的消息。为了避免这个问题,我编写了两个智能指针类,负责调用
Release
,而不是
delete
。您可以从下载。

IMO,自动创建您可能不会使用的表单(例如“关于”框)是一种浪费。我通常自动创建主窗体,然后根据需要动态创建其余窗体

建议让IDE“以自己的方式”意味着IDE正在使用某种智能来生成用于创建表单和数据模块的代码它不是。它只是按照您告诉它的顺序创建您要创建的内容。如果您没有通过“项目选项”对话框明确告诉它要做什么,那么它只是按照您将它们添加到项目中的顺序创建东西。IDE并不比您更清楚

使用自动创建的表单和数据模块鼓励使用IDE声明的全局变量来引用这些对象。你不需要它们


仅自动创建主窗体。当您需要其他任何东西时,请使用创建对象的典型方式自己创建它:调用构造函数,并将对对象的引用存储在其他对象的局部变量或字段中,而不是IDE提供的全局变量中,您应该删除它们。不要费心于
CreateForm

除非应用程序只是一个非常小的试验台或POC, 仅创建主窗体(和/或全局数据模块,如果需要) 您的样式/设计)并手动创建所有其他样式/设计

在加载时创建所有表单只是一种浪费(取决于 在表单上所做的事情)可以使程序快速加载
海龟在沙滩上行走…

当然,您可以通过将它们从Project>>Options>>forms的自动创建表单列表中删除,使Delphi不会自动创建有问题的表单。您可能已经知道了,但我认为应该在问题中提到它。正确,为了清楚起见,我将把它添加到问题中。为什么您的DeleteOrRelease()调用delete呢。根据docs,Release每次都会做这项工作吗?如果您查看要发布的源代码,它会调用
PostMessage(Handle,…)
,读取Handle属性的值会调用HandleNeeded,它会分配一个句柄(即,分配一组在屏幕上显示表单所需的Windows资源)。对于一个从未显示过的窗体或其窗口句柄已被销毁的窗体,分配一个句柄以便可以立即释放它,这在我看来似乎很愚蠢。呼叫删除如果!HandleAllocated是一个微优化,但它从未给我带来任何问题。如果你仔细阅读VCL文档,它会说:“表单或其子级的任何事件处理程序都应该使用Release,而不是Free(Delphi)或delete(C++)。否则可能会导致内存访问错误。”表单的事件处理程序需要使用Release()而不是Free()或delete,但是任何其他未从窗体事件处理程序上下文中调用的代码都可以安全地使用Free()或delete,而不必担心“内存错误”。如上链接的同一文档也有一行明确的内容:使用Release销毁窗体并释放其关联内存。所以,我们仍然必须使用Release,但不是因为可能的内存错误吗?@Remy:谢谢你的澄清。事实上,我有一些事件处理程序链,它们最终以一种形式从自己的事件处理程序中释放出来,因此我可能会在自己的代码中继续使用Release