2011-10-23 21 views
1

DataModule 양식을 만들고 모든 데이터베이스 구성 요소를 이동하여 디자인 타임 양식을 정리하기로 결정하기 전까지는 제 응용 프로그램이 정상적으로 작동했습니다. Delphi XE2 Update 1과 TADOConnection, TADOTable, TADOQuery, TADOCommand를 사용하고 있습니다.클래스 TADOConnection/TADOTable을 찾을 수 없음

Application.CreateForm(TDataModule1, DataModule1);

: 마자 대신 주요 형태의 데이터 모듈 양식에 위에 언급 된 구성 요소가 처음으로 응용 프로그램을 실행하려고, 그것은 지금 조선 민주주의 인민 공화국에서이 라인이 실행되는 오류가 반환

제기 된 오류는 TADOCOnnection 클래스가 없습니다.. 이제 TADOConnection을 제거하고 DataModule 폼에 다시 추가 했으므로 이제는 다른 오류가 발생합니다. 클래스 TADOTable을 찾을 수 없습니다.,하지만 그 생각은 DataModule에서 작성 순서가 변경되고 TADOTable이 양식에 작성된 첫 번째 오브젝트이기 때문입니다.

uses System.SysUtils, System.Classes, Data.Win.ADODB, Data.DB;

내가이 오류를 극복하기 위해 uses 절에 ADODB와 DB를 포함했다 다른 게시물을 읽어, 그러나 그 도움이 될 것 같지 않습니다 다음 데이터 모듈에서

uses 절입니다.

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 파일에서 라인을 제거하고 수동으로 기본 폼에 그 일을했지만, 내가 같은 오류를 얻을 때 그것은 단지 변경 :

내 전체 DPR 파일입니다 메시지.

모든 구성 요소를 다시 주 양식으로 옮기는 것 외에 다음에 무엇을 시도해야할지 모르겠습니다. DataModule 폼은 이전 버전의 Delphi와 마찬가지로 XE2에서 똑같이 작동합니까? 그리고 구성 요소가 기본 폼에있을 때 동일한 TADOConnection 및 TADOTable 클래스가 발견되지 않는 이유는 무엇입니까?

모든 의견이나 통찰력을 매우 높이 평가합니다.

제임스

답변

1

아무런 문제없이 작업 한 새 프로젝트를 만들 때 이 내 자신의 코드에 추가 된 문제를 발견했습니다.

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; 

을 범위. 어쨌든 ... 열거 형 뒤에 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; 

희망이 있으면 다른 사람에게 도움이됩니다.

제임스

2
새 프로젝트를 시작하고 그것을 DataModule에 추가

. DataModuleTADOConnectionTADOTable을 입력하십시오. 프로젝트를 저장하고 어떤 유닛이 DataModule의 용도에 추가되는지 확인하십시오. 프로젝트가 성공적으로 컴파일되어 실행되면 해당 테스트 프로젝트의 유닛 이름을 작업 프로젝트 DataModule으로 복사하고 다시 시도하십시오. 도움이되지 않으면 라이브러리 경로에 문제가있는 것만 추측 할 수 있습니다. 이 문제를 해결하기 위해 Delphi XE2가 없으므로 추측하고 있습니다.

+0

모든 OP가 일부 구성 요소를 이동 한 경우 데이터 모듈의 uses 절에서 누락 된 단위가 오류 메시지의 원인이됩니다. –

+0

귀하의 제안 'LightBulb'는 대답이 아니지만 문제를 추적하는 데 도움이되었습니다. 나는 당신이 제안하고 처음부터 새로운 프로젝트를 만들 때했는데, 그것은 효과가있었습니다. 전체 답변을 게시하고 설명하겠습니다. 귀하의 제안에 +1하십시오. –

0
//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? 
+1

문제는 DataModule이 생성되고 있는지, RTF가 해당 속성을 제대로 찾을 수 없기 때문입니다. 내가 의미하는 바를 보시려면 이전 대답을보십시오. –

+0

질문에 대해서는 ADOConnection에 유효한 연결 문자열이 필요합니다. 정렬 마법사를 제공하는 속성 편집기를 사용할 수 있습니다. Microsoft Jet OLE DB 공급자를 사용하면 Access 데이터베이스를 선택할 수 있습니다. 물론 ODBC Jet 드라이버는 Access 2010 데이터베이스와 호환되어야하며 그렇지 않으면 작동하지 않습니다. ADOConnection에 연결하면 ADOTable을 연결로 연결하고 TableName 속성은 Access 데이터베이스에서 사용 가능한 테이블을 나열합니다. 당신이 MS Jet OLE 프로 바이더를 선택하면 꽤 직관적입니다. –

0

늦은 대답을 될 수 있지만, 해당 데이터 모듈에 당신이 ClassGroup있는 확인 했습니까? IDE에서 데이터 모듈을 열고 클릭 한 다음 ObjectInspector에서 ClassGroup 속성을 확인하십시오.

Vcl.Controls.TControl로 설정되어 있지 않으면이를로 변경하고 싶을 수 있습니다. 여기서 논리는 기본적으로 Datamodule이 모든 프레임 워크에 바인딩되어 있지 않음을 의미합니다. 따라서 System.Classes.TPersistent의 ClassGroup은 데이터 모듈이 프레임 워크/플랫폼 독립적이라는 것을 의미합니다 (VCL 앱과 FMX 앱에서 사용할 수 있음).

ADO 구성 요소 집합은 VCL 전용이며 FMX 응용 프로그램에서 사용할 수 없습니다. 즉, System.Classes.TPersistent를 데이터 모듈의 ClassGroup으로 사용하지 말고 Vcl.Controls.TControl 대신.

어쩌면 문제의 원인 일 수 있습니까?

+0

좋은 의견 @ 스탄,하지만 문제는 클래스 선언의 구성 요소 섹션의 범위를 게시 된 기본 범위 대신 public으로 변경했기 때문에 구성 요소 RTTI에 포함되지 않았으며 런타임에 EXE에서 찾을 수 없습니다. –