3

我经常遇到这个问题,我只是在寻找最佳实践/方法。我有一个包含数据库/数据模块的应用程序,并希望在启动时启动数据库/数据集,而在设计时将“运行时活动”设置为 true(数据库位置不同)。当应用程序启动时,还要运行一个网络“检查更新”例程。

给定 TForm 事件序列,以及各种试验和错误的结果,我目前正在使用这种方法:

我使用在主窗体中设置的“全局”记录来存储所有全局变量,其中有一个元素称为 Globals.AppInitialized(布尔值),并在主窗体的初始化部分将其设置为 False。

在主窗体的 OnShow 事件(所有窗体都由那时创建),我测试 Globals.AppInitialized; 如果它是假的,我运行我的“初始化”东西,然后通过设置 Globals.AppInitialized := True 来完成。

这似乎工作得很好,但它是最好的方法吗?从他人的经验、想法和意见中寻找洞察力。蒂亚..

4

7 回答 7

10

我通常总是关闭所有表单的自动创建,除了主表单和可能的主数据模块。

我了解到您可以做的一个技巧是将您的数据模块添加到您的项目中,允许它在您的主表单之前自动创建和创建。然后,当您的主窗体创建时,数据模块的 onCreate 将已经运行。

如果您的应用程序有一些代码要说,请设置控件的焦点(您不能在创建时执行此操作,因为它“尚不可见”)然后创建一条用户消息并将其发布到 oncreate 中的表单。一旦处理完表单消息循环,就应该(不保证)处理消息。例如:

const
  wm_AppStarted = wm_User + 101;


type
  Form1 = class(tForm)
    :
    procedure wmAppStarted(var Msg:tMessage); message wm_AppStarted;
  end; 

// in your oncreate event add the following, which should result in your wmAppStarted event firing.
PostMessage(handle,wm_AppStarted,0,0);

我想不出有一次这个消息从未被处理过,但调用的本质是它被添加到消息队列中,如果队列已满,则它被“丢弃”。请注意存在边缘情况。

于 2008-12-20T03:42:08.250 回答
6

您可能希望在表单创建调用之后和 Application.Run 之前直接干扰项目源(.dpr 文件)。(或者甚至更早,以防万一。)

这就是我通常处理此类初始化内容的方式:

...
Application.CreateForm(TMainForm, MainForm);    
...
MainForm.ApplicationLoaded; // loads options, etc..
Application.Run;
...
于 2008-12-20T00:37:28.250 回答
3

我不知道这是否有帮助,但我的一些应用程序没有自动创建任何表单,即它们在 IDE 中没有主表单。

以 Application 对象为其所有者创建的第一个表单将自动成为主表单。因此,我只自动创建一个数据模块作为加载程序,并让这个数据模块决定何时创建哪些数据模块以及以什么顺序创建哪些表单。这个数据模块有一个 StartUp 和 ShutDown 方法,它们在 dpr 中被称为 Application.Run 周围的“括号”。ShutDown 方法对关闭过程提供了更多控制。

当您为应用程序的不同用例设计了不同的“主窗体”或者您可以使用一些配置文件来选择不同的主窗体时,这会很有用。

于 2008-12-20T11:00:32.470 回答
2

Delphi 中实际上没有“全局变量”这样的概念。所有变量的范围都限于它们所在的单位和使用该单位的其他单位。

只需将AppInitializedInitialization内容作为数据模块的一部分。基本上有一个类(或数据模块)来统治你所有的非 UI 东西(有点像 One-Ring,除了不是所有的邪恶之类的东西。)

或者,您可以:

  • 从您的启动画面调用它。
  • 在登录时进行
  • 在后台线程中运行“检查更新”——不要强迫他们现在更新。像 Firefox 那样做。
于 2008-12-20T00:26:41.313 回答
1

我不确定我是否理解您为什么需要全局变量?现在,我编写所有的 Delphi 应用程序时都没有一个全局变量。即使我确实使用了它们,每个应用程序我也从来没有超过过几个。

所以也许你需要先想想为什么你真的需要它们。

于 2008-12-19T23:39:30.423 回答
1

我使用主数据模块检查数据库连接是否正常,如果不正常,则显示自定义组件表单来设置数据库连接,然后加载主表单:

Application.CreateForm(TDmMain, DmMain);

  if DmMain.isDBConnected then
    begin
      Application.CreateForm(TDmVisualUtils, DmVisualUtils);
      Application.CreateForm(TfrmMain, frmMain);
    end;

  Application.Run;
于 2009-05-08T12:32:46.053 回答
-1

我使用的一个技巧是在主窗体上放置一个 TTimer,将时间设置为 300 毫秒,然后执行任何初始化(数据库登录、网络文件复制等)。启动应用程序会立即打开主窗体并允许任何初始化“东西”发生。用户不会在启动多个实例时想“哦……我没有 dbl-click……我会再做一次……”

于 2008-12-21T13:42:31.720 回答