未找到类TADOConnection / TADOTable

时间:2011-10-23 07:17:06

标签: delphi ado datamodule adoconnection tadotable

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

Application.CreateForm(TDataModule1, DataModule1);

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

DataModule中的uses子句是:

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 个答案:

答案 0 :(得分:2)

启动一个新项目并添加DataModule。在TADOConnection上删除TADOTableDataModule。保存项目并查看哪些单元已添加到DataModule的使用中。如果您的项目已成功编译并运行,请将该测试项目中的单元名称复制到工作项目DataModule中,然后重试。如果这没有帮助,我只能猜测你有一些库路径问题。我没有Delphi XE2试试这个,所以我只是在猜测。

答案 1 :(得分: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;

希望这有助于其他人。

詹姆斯

答案 2 :(得分: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?

答案 3 :(得分: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代替

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