【问题标题】:Why would something fail in FormCreate, but work fine in FormShow?为什么在 FormCreate 中会失败,但在 FormShow 中却可以正常工作?
【发布时间】:2010-07-16 03:04:20
【问题描述】:

我使用的是 Delphi 7。当我尝试在 FormCreate 中创建一个对象时,它失败了(实际上它只是挂起)。当我尝试在 FormShow 中做同样的事情时,它可以工作。请注意,我不是在谈论创建像 TEdit 这样的可视化组件。它是一个数据库抽象对象。任何想法为什么会发生这种情况?有没有关于这个主题的指南?

【问题讨论】:

  • 更多细节会有所帮助。它是一个什么样的对象?它是我们熟悉的标准吗?它在其构造函数中尝试做什么?它在什么时候挂起?到目前为止,调试器告诉了你什么关于这个问题的信息?
  • 请注意,调试语句(例如输出到 GExperts Debuger 或 SmartInspect 等控制台)可以帮助查明它挂在哪一行。那么答案通常是显而易见的。
  • @Mason Wheeler:这是我们内部构建的自定义数据抽象对象。不,我不希望有人熟悉它。它查询数据库并使用查询结果中的值填充其属性。它在尝试从构造函数内部打开 CDS 时挂起。没关系调试器,我想知道为什么它可以从 FormShow 而不是 FormCreate 工作(您可以假设底层数据模块、查询和关联的客户端数据集已经存在 - 否则我会遇到访问冲突)。
  • @Chris Thornton:我不想诊断问题本身。我想了解 FormCreate 和 FormShow 事件之间的细微差别(除了时间)。它在 FormShow 中起作用但在 FormCreate 中不起作用肯定是有原因的(因为它不依赖于 FormCreate 中的任何前面的代码)。

标签: delphi delphi-7


【解决方案1】:

1) 原因是在FormCreate上,还没有创建Form的句柄。

如果您的数据库对象需要表单句柄,请执行以下操作:

Self.HandleNeeded; // 在 FormCreate 上。

2) 另一个原因可能是您的数据库组件需要连接并且它只连接在 DFM 上?

【讨论】:

  • TWinControl.GetHandle(当您尝试检索表单的句柄时会调用它)在返回句柄之前在内部调用 HandleNeeded。此外,如果连接组件在 DFM 中存储了 Connected = True,则在实例化组件时,一旦属性被流入,编译的应用程序就应该连接。唯一不会出现这种情况的情况是,如果您的 IDE 专家强制编译状态为构建的可执行文件中的 Connected = False
  • 问这个问题的人没有说明他使用的是哪个数据库对象。我记得使用 BTrieve for Windows,它不是基于 TDataSet 的并且有这个问题。
  • 不是#2,但你的#1 听起来很合理。这就是我一直在寻找的答案。该对象太大且太复杂,无法进一步深入研究,我知道如果我从 FormShow 调用它,它会正常工作。谢谢,我接受这个答案并支持所有贡献者。
【解决方案2】:

我的第一个猜测是您正在访问的 DataModule 尚未创建。如果您的项目的源代码如下所示:

begin
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.CreateForm(TDataModule1, DataModule1);
    Application.Run;
end.

您的TForm1.FormCreate 如下所示:

begin
    DataModule1.AddUsersToStringList(Self.ComboBox1.Items);
end;

然后FormCreate 将失败,因为它正在作为Application.CreateForm(TForm1, Form1); 行的一部分运行,并且您的数据模块尚未创建。

有两种解决方案:

  1. 将您的处理/初始化推迟到所有表单和数据模块创建完成。
  2. 在创建任何表单之前创建所有数据模块。 Delphi 中应用程序的“主窗体”是Application.CreateForm 创建的第一个TCustomForm 后代,而不是第一个对象。

【讨论】:

  • 但这应该会导致访问冲突...而不是挂起。
  • 在一个简单的场景中,您的答案是正确的.. 但在这种情况下并非如此。我向您保证,在调用此表单的 FormCreate 时,已经创建了数据模块、查询和关联的客户端数据集。它不是应用程序的主要形式。数据模块已创建完毕。
  • @Craig Young:你完全正确。就是这样,它只是挂起(就像一个无限循环!)。
猜你喜欢
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 2012-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多