delphi 未找到类TADOConnection / TADOTable

zqdjd7g9  于 2023-04-11  发布在  其他
关注(0)|答案(5)|浏览(180)

好吧,我的应用程序运行得很好,直到我决定通过创建DataModule窗体并将所有数据库组件移动到它来清理设计时窗体。我使用 Delphi XE2 Update 1和这些组件,TADOConnection,TADOTable,TADOQuery,TADOCommand。当我第一次尝试在DataModule窗体上运行上述组件时,而不是主窗体,现在,当执行DPR中的这一行时,它将返回一个错误:
Application.CreateForm(TDataModule1, DataModule1);
引发的错误是Class TADOCOnnection not found.。现在我删除并重新添加了TADOConnection到DataModule表单,它现在引发了一个不同的错误:Class TADOTable not found.,但我认为这只是因为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.

我甚至尝试从DPR文件中删除创建DataModule的行,并在主窗体中手动执行此操作,但当我收到相同的错误消息时,情况就发生了变化。
除了把所有组件移回主窗体之外,我不知道下一步该做什么。难道DataModule窗体在XE2中的工作方式和以前版本的 Delphi 不一样吗?为什么当组件在主窗体上时,相同的TADOConnection和TADOTable类没有发现引发的消息?
任何想法或见解都非常感谢。
詹姆斯

rwqw0loc

rwqw0loc1#

您可以使用数据集,但没有为此添加任何数据源

but5z9lq

but5z9lq2#

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

uxh89sit

uxh89sit3#

在创建一个新的项目时,它没有任何问题,我终于发现了引入到我自己代码中的问题。
我在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;

希望这对其他人有帮助。
詹姆斯

wbgh16ku

wbgh16ku4#

//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?
aurhwmvo

aurhwmvo5#

这可能是一个迟来的答案,但是你有没有检查相应的数据模块上的ClassGroup?在IDE中打开数据模块,单击它并检查ObjectInspector中的ClassGroup属性。
如果它没有设置为Vcl.Controls.TControl,那么你可能想将它更改为Vcl.Controls.TControl。这里的逻辑是,默认情况下,Datamodule根本没有绑定到任何框架,可以用于两者。因此,System.Classes.TPersistent的ClassGroup意味着你的数据模块是框架/平台独立的(你可以在VCL应用程序和FMX应用程序中使用它)。
ADO组件集是特定于VCL的,不能在FMX应用程序中使用,这意味着您不应使用System.Classes.TPersistent作为数据模块的ClassGroup,而应使用Vcl.Controls.TControl。
也许这就是你问题的根源。

相关问题