好的,所以我的应用程序工作正常,直到我决定通过创建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类消息?
非常感谢任何想法或见解。
詹姆斯
答案 0 :(得分:2)
启动一个新项目并添加DataModule
。在TADOConnection
上删除TADOTable
和DataModule
。保存项目并查看哪些单元已添加到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代替
也许这可能是你问题的根源?