【问题标题】:DataModule created before main form [closed]在主窗体之前创建的 DataModule [关闭]
【发布时间】:2010-01-14 15:34:13
【问题描述】:

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

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

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

【问题讨论】:

  • 没有 OnCreate 处理程序,否则。 MainForm 可能会引用 datamodule 中声明的数据源,但是 afaik 它们在不更改创建顺序的情况下成功解析。
  • 这并不意味着您必须编辑项目源代码。可以在项目选项对话框中更改数据模块和表单的创建顺序。创建的第一个表单将是主表单,但在此之前可以创建数据模块。你也可以看看我对这个问题的回答:stackoverflow.com/questions/382527/…
  • 致 Uwe Raabe - 我知道有很多选择。我自己有时会编译一个没有任何形式的 GUI 单元测试项目。

标签: delphi datamodule


【解决方案1】:

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

否则,这并不重要。

【讨论】:

  • 我同意,也看到动态生成菜单。
【解决方案2】:

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

【讨论】:

  • 我不同意数据模块应该由 MainForm 的 OnCreate 方法创建,并认为这是不好的风格。相反,我总是首先创建主窗体,然后是数据模块,并且在创建或销毁期间,我不会在依赖于任何其他窗体的主窗体中放置任何代码。相反,我会编写单独的初始化函数,并通过我编写的代码调用它们,以便在某个时间发生。我不喜欢 FormCreate 事件,这些事件除了在表单内创建作为私有/受保护字段的本地对象外。其他任何东西都不应该在 FormCreate 中。
【解决方案3】:

这方面确实有两个阵营,而且都是正确的。

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-17
        • 1970-01-01
        • 2022-01-08
        相关资源
        最近更新 更多