2011-10-23 51 views
1

好的,所以我的应用程序工作得很好,直到我决定通过创建DataModule表单并将所有数据库组件移动到它来清理设计时表单。我正在使用Delphi XE2 Update 1和这些组件,TADOConnection,TADOTable,TADOQuery,TADOCommand。当我试图运行应用程序首次与DataModule的形式在上述指定部件,而不是主要形式,它现在返回时,执行这条线从DPR的错误:TADOConnection/TADOTable类没有找到

Application.CreateForm(TDataModule1, DataModule1);

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

uses从DataModule的条款是:

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

我读其他职位,据说包括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类相同的消息?

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

詹姆斯

回答

1

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

我在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

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

+0

如果所有的OP都移动了一些组件,那么datamodule的使用子句丢失的单元实际上就是错误信息的原因。 –

+0

你的建议'LightBulb',虽然不是答案,但有助于追踪这个问题。我按照你的建议做了,并从头开始创建了一个新的项目,这确实奏效。我会发布完整的答案并解释。 +1为您的建议。 –

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? 
+1

问题不在于是否创建了DataModule,而是因为它的属性没有正确发布,所以RTTI找不到它们。看到以前的答案,看看我的意思。 –

+0

至于你的问题 - ADOConnection需要一个有效的连接字符串。您可以使用属性编辑器,它提供了各种向导。使用Microsoft Jet OLE DB提供程序,它将允许您选择一个Access数据库。当然,ODBC Jet驱动程序需要与Access 2010数据库兼容,否则它将无法工作。一旦可以连接ADOConnection,则将ADOTable链接到连接,并且TableName属性将列出Access数据库中的可用表。选择MS Jet OLE提供程序后,它非常直观... –

0

可能是一个迟到的回答,但你检查哪些ClassGroup你有相应的数据模块?在IDE中打开数据模块,点击它并检查ObjectInspector中的ClassGroup属性。

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

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

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

+0

良好的反馈@Steffan,但问题是我将类声明的组件部分的范围更改为public,而不是默认的发布范围,因此组件未包含在RTTI中,并且在运行时无法通过EXE找到。 –