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:
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 arepublic
, but that is wrong. They arepublished
. Changing the scope identifier topublished
fixed the problem, because now the components are included in the RTTI, which is needed when a form is created at runtime.Hope this helps someone else.
James