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

Gre*_*ndt 6 delphi vcl c++builder

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

Application->CreateForm( __classid( TxForm), &xForm );
Run Code Online (Sandbox Code Playgroud)

这使事情变得更容易,但是当应用程序有10,20,50,100个表单时它是否明智?我假设这可以抓住各种内存和系统句柄.通过使用Project-> Options-> Forms对话框删除表单,可以在需要时随时创建表单,并且:

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

myForm->ShowModal();
Run Code Online (Sandbox Code Playgroud)

所以问题是,哪个更好,让C++ Builder以自己的方式完成它,或者在需要时手动创建表单?

Ale*_*exV 5

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

如果您很少使用表单,我会在需要时手动创建/免费(删除),但如果您在应用程序的整个生命周期中使用表单,请使用默认方式.


Rob*_*edy 5

建议让IDE"按照自己的方式行事"意味着IDE正在采用某种智能来生成用于创建表单和数据模块的代码.事实并非如此.它只是创建你告诉它创建的内容,并按照你告诉它使用的顺序.如果您没有通过项目选项对话框明确告诉它该做什么,那么它只是按照您将它们添加到项目中的顺序创建.IDE并不比你更了解.

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

仅自动创建主表单.当您需要其他任何东西时,使用创建对象的典型方法自己创建它:调用构造函数,并将对象的引用存储在本地变量或其他对象的字段中,而不是IDE应提供的全局变量.不要打扰CreateForm.我写了一篇解释原因的文章.


Jos*_*ley 2

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

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

正如VCL 文档所解释的delete直接(或通过使用 stock 间接)调用表单std::auto_ptr可能会导致内存错误,因为表单可能有未处理的消息。为了避免这个问题,我编写了两个智能指针类来负责调用Release而不是delete. 您可以从http://gist.github.com/671452下载它们。

  • 如果您更仔细地阅读 VCL 文档,它会说:“**表单或其子项的任何事件处理程序**应该使用 Release 而不是 Free (Delphi) 或删除 (C++)。不这样做可能会导致内存访问错误。” 表单的 **事件处理程序** 需要使用 Release() 而不是 Free() 或删除,但任何其他未从表单事件处理程序上下文中调用的代码都可以安全地使用 Free() 或删除,而不必担心“记忆错误”。 (4认同)
  • 为什么你的DeleteOrRelease()会调用delete呢?根据文档,Release 每次都会完成这项工作吗? (2认同)