6

一些数据库应用程序开发人员喜欢通过像这样编辑项目源文件来在主窗体之前创建一个数据模块

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TDM, DM);
  Application.CreateForm(TMainForm, MainForm);
{...}
  Application.Run;
end.

问题是——为什么?什么是优缺点?

4

5 回答 5

17

显而易见的原因是主窗体是否需要数据模块进行设置。例如,如果主窗体在其 OnCreate 中引用了其中的某些内容,那么数据模块当然必须首先准备好。

否则,真的无所谓。

于 2010-01-14T15:44:01.397 回答
6

我同意梅森的回答,因为它解释了人们为什么会这样做。但是,我认为这是一种不好的方法,因为它隐藏了 IDE 维护的代码中的依赖关系。在我看来,数据模块应该从自动创建列表中删除,它应该在主窗体的 OnCreate 方法中创建。

于 2010-01-14T16:08:38.090 回答
5

在这一点上确实有两个阵营,而且都是正确的。

第一个让应用程序管理每个表单/数据模块的生命周期。在这种情况下,如果主窗体使用数据模块,那么必须先创建它才能使用。这适用于小型应用程序,但是当您使用具有多个表单的大型应用程序时存在加载开销......但是一旦加载应用程序,然后显示一个表单几乎是即时的,因为它已经在内存中创建。因为已经创建了每个表单/资源,所以在运行应用程序时也会产生大量内存。当您向应用程序添加新的表单/数据模块时,此方法也是 Delphi “引导”您的默认方法。如果您不使用主窗体的 OnCreate 中的数据模块,那么它可以在创建顺序中较低,因为它在 Application.Run 启动之后才会被调用。

第二个阵营想要处理每个表单/数据模块本身的创建和销毁(通常用于除 MainForm 之外的所有表单)。这种方法的优点是应用程序加载速度更快,并且在启动时立即消耗更少的内存。通常在这种情况下,完全管理他们使用的每个表单/数据模块的生命周期的是主表单(或其他表单)。这种方法最适合具有多种形式的大型应用程序。

于 2010-01-14T17:10:02.450 回答
0

仅仅因为这是确保 DataModule 内容可用于 MainForm 的最懒惰的方式。如果您只有一个 DataModule,则没有问题。

于 2010-01-14T16:16:42.687 回答
0

在创建所有其他组件之前,不显示 MainForm。所以基本上你会在这两种情况下等待,首先创建或不创建天气数据模块。如果您的网格位于主窗体上,那么您在尝试使用数据模块表(或查询)事件(打开后)中的类似内容时可能会遇到麻烦:

cxGrid1DBTableView1.Controller.TopRowIndex :=0;
cxGrid1DBTableView1.DataController.FocusedRowIndex := 0;

原因很明显:网格还没有创建。我必须承认,我也先创建了数据模块。但是有一些原因,就像我刚才描述的那样,这样做是不切实际的。

于 2014-02-24T18:51:38.623 回答