Класс 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.

Может быть, это может быть источником вашей проблемы?

вы можете использовать набор данных, но не добавили для этого какой-либо источник данных

Другие вопросы по тегам