1

好的,所以我的应用程序工作得很好,直到我决定通过创建一个 DataModule 表单并将所有数据库组件移动到它来稍微清理设计时表单。我正在使用 Delphi XE2 Update 1 和这些组件,TADOConnection、TADOTable、TADOQuery、TADOCommand。当我第一次尝试使用 DataModule 表单上的上述命名组件而不是主表单运行应用程序时,它现在在执行 DPR 的此行时返回错误:

Application.CreateForm(TDataModule1, DataModule1);

引发的错误是找不到类 TADOConnection。. 现在我删除并重新添加了 TADOConnection 到 DataModule 表单,它现在引发了一个不同的错误:找不到类 TADOTable。,但我认为这只是因为 DataModule 上的创建顺序发生了变化,TADOTable现在 a 是在表单上创建的第一个对象。

uses在 DataModule 中的条款是:

uses System.SysUtils, System.Classes, Data.Win.ADODB, Data.DB;

我阅读了其他帖子,说在 uses 子句中包含 ADODB 和 DB 以克服此错误,但这似乎没有帮助。

我的完整 DPR 文件是:

program Project1;

uses
  Vcl.Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {DataModule1: TDataModule};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TDataModule1, DataModule1);
  Application.Run;
end.

我什至尝试从创建 DataModule 的 DPR 文件中删除该行并在主窗体中手动执行此操作,但是当我收到相同的错误消息时,它只会改变。

除了将所有组件移回主窗体之外,我不确定接下来要尝试什么。DataModule 表单在 XE2 中的工作方式与 Delphi 的先前版本不同,为什么当组件位于主表单上时,没有出现相同的 TADOConnection 和 TADOTable 类未找到消息?

非常感谢任何想法或见解。

詹姆士

4

4 回答 4

2

启动一个新项目并添加一个DataModule. 放下TADOConnectionTADOTable放在DataModule. 保存项目并查看哪些单元被添加到DataModule. 如果您的项目编译并成功运行,请将该测试项目中的单元名称复制到您的工作项目中DataModule,然后重试。如果这没有帮助,我只能猜测您对库路径有一些问题。我没有 Delphi XE2 来尝试这个,所以我只是猜测。

于 2011-10-23T07:49:37.993 回答
1

在创建一个没有任何问题的新项目时,我终于发现了在自己的代码中引入的问题。

我在 DataModules 单元/类中添加了一个特殊方法。我需要传递一个枚举类型作为参数,所以我在类的范围内创建了枚举,如下所示:

TDataModule1 = class(TDataModule)
type
  TMyEnum = (eOne, eTwo, eThree);
public
  ADOConnection1: TADOConnection;
  ... // more components added to the design window
  procedure MyMethod(const Param: TMyEnum);
end;

我将枚举添加到类中,因为它不需要具有全局范围。无论如何...您会注意到我public在枚举之后添加了范围标识符。那是我的错误。我假设表单上的组件是public,但这是错误的。他们是published。更改范围标识符以published解决问题,因为现在组件包含在 RTTI 中,这是在运行时创建表单时需要的。

TDataModule1 = class(TDataModule)
type
  TMyEnum = (eOne, eTwo, eThree);
published // <- this fixes the "Class Not Found" at Runtime Error
  ADOConnection1: TADOConnection;
  ... // more components added to the design window
  procedure MyMethod(const Param: TMyEnum);
end;

希望这对其他人有帮助。

詹姆士

于 2011-10-25T00:03:45.830 回答
0
//You should begin creating the dataModule, so change your code like this:
'Application.Initialize; '
'Application.MainFormOnTaskbar := True;'
'Application.CreateForm(TDataModule1, DataModule1);'
'Application.CreateForm(TForm1, Form1); '

//There is a question I have:
//How do I use ADOConnection / ADOTable in combination with an access2010-database?
于 2012-04-16T06:39:58.557 回答
0

可能是一个迟到的答案,但是您是否检查了相应 Datamodule 上的哪个 ClassGroup ?在 IDE 中打开数据模块,单击它并检查 ObjectInspector 中的 ClassGroup 属性。

如果它未设置为 Vcl.Controls.TControl,那么您可能需要将其更改为该值。这里的逻辑是,默认情况下,Datamodule 根本不绑定到任何框架,两者都可以使用。因此 System.Classes.TPersistent 的 ClassGroup 意味着您的数据模块是框架/平台独立的(您可以在 VCL 应用程序和 FMX 应用程序中使用它)。

ADO 组件集是 VCL 特定的,不能在 FMX 应用程序中使用,这意味着您不应使用 System.Classes.TPersistent 作为数据模块的 ClassGroup,而应使用 Vcl.Controls.TControl。

也许这可能是您问题的根源?

于 2012-05-15T09:59:15.270 回答