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

时间:2010-11-10 19:28:37

标签: delphi c++builder vcl

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

Application->CreateForm( __classid( TxForm), &xForm );

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

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

myForm->ShowModal();

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

5 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:5)

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

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

仅自动创建主表单。当您需要其他任何东西时,使用典型的创建对象的方法自己创建它:调用构造函数,并将对象的引用存储在本地变量或其他对象的字段中,而不是IDE应提供的全局变量。不要打扰CreateFormI wrote an article explaining why.

答案 2 :(得分:2)

创建但尚未显示的表单占用内存并使启动时间有效但不应使用任何系统句柄,因为窗口句柄之类的东西在实际显示窗口之前不会分配。

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

作为the VCL documentation explains,直接(或通过使用股票deletestd::auto_ptr表单可能会导致内存错误,因为表单可能包含未经处理的消息。为了避免这个问题,我编写了两个智能指针类,负责调用Release而不是delete。您可以从http://gist.github.com/671452下载它们。

答案 3 :(得分:2)

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

答案 4 :(得分:0)

除非应用程序只是一个非常小的测试床或POC, 只创建主窗体(和/或全局数据模块,如果是的话) 你的风格/设计)并手动创建所有其他人。

在加载时创建所有表单只是浪费而且(取决于 在表格上做了什么)可以使你的程序像海洋一样​​快速加载 乌龟走在沙滩上......