好的,所以我的应用程序工作得很好,直到我决定通过创建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
现在是在表单上创建的第一个对象。
我的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文件中删除行,并在主表单中手动执行,但当我得到相同的错误消息时,这只是改变。
我不知道下一步要做什么,除了将所有组件移回主表单。在XE2中,DataModule表单不像以前的Delphi版本一样工作,为什么当组件在主表单上时,相同的TADOConnection和TADOTable类没有发现消息?
任何想法或见解都非常感谢。
詹姆斯新建一个项目,添加一个DataModule
。在DataModule
上删除TADOConnection
和TADOTable
。保存项目并查看哪些单元被添加到DataModule
的使用中。如果您的项目编译并运行成功,将测试项目中的单元名称复制到工作项目的DataModule
中,然后再试一次。如果这没有帮助,我只能猜测你有一些问题与图书馆路径。我没有Delphi XE2来尝试这个,所以我只是猜测。
在创建新项目时,它没有任何问题,我最终发现了我在我自己的代码中引入的问题。
我在datammodules单元/类中添加了一个特殊的方法。我需要传递一个枚举类型作为参数,所以我在类的作用域中创建了枚举,如下所示:
TDataModule1 = class(TDataModule)
type
TMyEnum = (eOne, eTwo, eThree);
public
ADOConnection1: TADOConnection;
... // more components added to the design window
procedure MyMethod(const Param: TMyEnum);
end;
我将enum添加到类中,因为不需要具有全局作用域。无论如何……您将注意到,我在枚举之后添加了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;
希望这能帮助到别人。
詹姆斯//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?
可能是一个迟来的答案,但是您检查了相应的数据模块上有哪个ClassGroup吗?在IDE中打开数据模块,单击它并检查ObjectInspector中的ClassGroup属性。
如果未设置为Vcl.Controls。TControl,然后你可能想把它改成那个。这里的逻辑是,默认情况下,Datamodule根本不绑定到任何框架,可以同时用于这两个框架。所以一个由System.Classes.TPersistent组成的ClassGroup意味着你的数据模块是独立于框架/平台的(你可以在VCL应用程序和FMX应用程序中使用它)。
ADO组件集是VCL特定的,不能在FMX应用程序中使用,这意味着你不应该使用System.Classes.TPersistent作为你的数据模块的ClassGroup,而是使用VCL . controls . tcontrol。
也许这就是你的问题所在
你可以使用一个数据集,但没有为它添加任何数据源