Класс TADOConnection / TADOTable не найден - PullRequest
1 голос
/ 23 октября 2011

Хорошо, так что мое приложение работало нормально, пока я не решил немного очистить форму времени разработки, создав форму DataModule и переместив в нее все компоненты базы данных. Я использую Delphi XE2 Update 1 и эти компоненты, TADOConnection, TADOTable, TADOQuery, TADOCommand. Как только я попытался запустить приложение в первый раз с вышеназванными компонентами в форме DataModule, вместо основной формы, теперь оно возвращает ошибку при выполнении этой строки из DPR:

Application.CreateForm(TDataModule1, DataModule1);

Возникла ошибка: Класс TADOCOnnection не найден. . Теперь, когда я удалил и повторно добавил TADOConnection в форму DataModule, теперь возникает другая ошибка: Класс TADOTable не найден. , но я думаю, что это только потому, что порядок создания в DataModule изменился и TADOTable теперь является первым объектом, созданным в форме.

Мое предложение uses из модуля данных:

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 не находят сообщения, возникающие, когда компоненты находятся в главной форме?

Любые мысли или идеи очень ценятся.

Джеймс

Ответы [ 4 ]

2 голосов
/ 23 октября 2011

Начните новый проект и добавьте к нему DataModule.Бросьте TADOConnection и TADOTable на DataModule.Сохраните проект и посмотрите, какие юниты добавляются в DataModule.Если ваш проект компилируется и запускается успешно, скопируйте имена модулей из этого тестового проекта в DataModule вашего рабочего проекта и попробуйте снова.Если это не поможет, я могу только догадываться, что у вас есть некоторые проблемы с путями к библиотекам.У меня нет Delphi XE2, чтобы попробовать это, поэтому я просто догадываюсь.

1 голос
/ 25 октября 2011

При создании нового проекта, который работал без каких-либо проблем, я, наконец, обнаружил проблему, которую I ввел в мой собственный код.

Я добавил специальный метод в модуль / класс 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;

Надеюсь, это поможет кому-то еще.

Джеймс

0 голосов
/ 15 мая 2012

Возможно, будет поздний ответ, но вы проверили, какая у вас ClassGroup в соответствующем модуле данных?Откройте модуль данных в вашей среде IDE, щелкните по нему и проверьте свойство ClassGroup в ObjectInspector.

Если для него не установлено значение Vcl.Controls.TControl, возможно, вы захотите изменить его на это.Логика здесь заключается в том, что по умолчанию модуль данных вообще не связан ни с одним фреймворком и может использоваться для обоих.Поэтому ClassGroup System.Classes.TPersistent означает, что ваш модуль данных не зависит от платформы / платформы (вы можете использовать его в приложении VCL и в приложении FMX).

Набор компонентов ADO зависит от VCL ине может использоваться в приложении FMX, что означает, что вы не должны использовать System.Classes.TPersistent в качестве ClassGroup для вашего модуля данных, но вместо этого используйте Vcl.Controls.TControl.

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

0 голосов
/ 16 апреля 2012
//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?
...