Okay, so my application was working just fine until I decided to clean up the design-time form a bit by creating a DataModule form and moving all database components to it. I'm using Delphi XE2 Update 1 and these components, TADOConnection, TADOTable, TADOQuery, TADOCommand. As soon as I tried to run the app for the first time with the above named components on the DataModule form, instead of the main form, it now returns an error when this line from the DPR is executed:
Application.CreateForm(TDataModule1, DataModule1);
The error raised is Class TADOCOnnection not found.. Now that I removed and re-added the TADOConnection to the DataModule form, it now raises a different error: Class TADOTable not found., but I think that is just because the create order has changed on the DataModule and a TADOTable
is now the first object that is created on the form.
My uses
clause from the DataModule is:
uses System.SysUtils, System.Classes, Data.Win.ADODB, Data.DB;
I read other posts that said to include ADODB and DB in the uses clause to overcome this error, but that doesn't seem to help.
My full DPR file is:
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.
I even tried removing the line from the DPR file that creates the DataModule and doing that manually in the main form, but that just changes when I get the same error message(s).
I'm not sure what to try next, aside from moving all the components back to the main form. Don't DataModule forms work the same in XE2 as prior versions of Delphi, and why aren't the same TADOConnection and TADOTable class not found messages raised when the components are on the main form?
Any thoughts or insights are very much appreciated.
James
In creating a new project, which worked without any issues, I finally found the problem that I introduced into my own code.
I had added a special method in the DataModules unit / class. I needed to pass an enumerated type as the parameter, so I created the enumeration in the scope of the class, like this:
TDataModule1 = class(TDataModule)
type
TMyEnum = (eOne, eTwo, eThree);
public
ADOConnection1: TADOConnection;
... // more components added to the design window
procedure MyMethod(const Param: TMyEnum);
end;
I added the enum to the class because it did not need to have global scope. Anyway... You'll notice that I added the public
scope identifier after the enum. That was my mistake. I assumed that components on a form are public
, but that is wrong. They are published
. Changing the scope identifier to published
fixed the problem, because now the components are included in the RTTI, which is needed when a form is created at runtime.
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;
Hope this helps someone else.
James