Класс TADOConnection / TADOTable не найден
Итак, мое приложение работало очень хорошо, пока я не решил немного очистить форму времени разработки, создав форму DataModule и переместив в нее все компоненты базы данных. Я использую Delphi XE2 Update 1 и эти компоненты, TADOConnection, TADOTable, TADOQuery, TADOCommand. Как только я впервые попытался запустить приложение с вышеназванными компонентами в форме DataModule, вместо основной формы, теперь возвращается ошибка при выполнении этой строки из DPR:
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.
Я даже попытался удалить строку из файла DPR, который создает модуль DataModule, и сделать это вручную в главной форме, но это просто меняется, когда я получаю те же сообщения об ошибках.
Я не уверен, что попробовать дальше, кроме перемещения всех компонентов обратно в основную форму. Разве формы DataModule не работают в XE2 так же, как в предыдущих версиях Delphi, и почему те же классы TADOConnection и TADOTable не находят сообщения, возникающие, когда компоненты находятся в главной форме?
Любые мысли или идеи очень ценятся.
Джеймс
5 ответов
При создании нового проекта, который работал без каких-либо проблем, я наконец нашел проблему, которую я ввел в свой собственный код.
Я добавил специальный метод в блок / класс 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;
Я добавил 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;
Надеюсь, это поможет кому-то еще.
Джеймс
Начать новый проект и добавить к нему DataModule
, Капля TADOConnection
а также TADOTable
на DataModule
, Сохраните проект и посмотрите, какие модули добавляются в использование DataModule
, Если ваш проект компилируется и выполняется успешно, скопируйте имена модулей из этого тестового проекта в ваш рабочий проект DataModule
и попробуй еще раз. Если это не поможет, я могу только догадываться, что у вас есть некоторые проблемы с путями к библиотекам. У меня нет Delphi XE2, чтобы попробовать это, поэтому я просто догадываюсь.
//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, щелкните по нему и проверьте свойство ClassGroup в ObjectInspector.
Если он не установлен на Vcl.Controls.TControl, вы можете изменить его на это. Логика здесь заключается в том, что по умолчанию модуль данных вообще не связан ни с одним фреймворком и может использоваться для обоих. Таким образом, ClassGroup System.Classes.TPersistent означает, что ваш модуль данных не зависит от платформы / платформы (вы можете использовать его в приложении VCL и в приложении FMX).
Набор компонентов ADO специфичен для VCL и не может использоваться в приложении FMX, что означает, что вы не должны использовать System.Classes.TPersistent в качестве ClassGroup для вашего модуля данных, а вместо этого использовать Vcl.Controls.TControl.
Может быть, это может быть источником вашей проблемы?
вы можете использовать набор данных, но не добавили для этого какой-либо источник данных