2011-10-23 1 views
1

DataModuleフォームを作成し、すべてのデータベースコンポーネントをそれに移動することで、設計時のフォームを少し整理するまで、アプリケーションがうまくいきました。私はDelphi XE2 Update 1とこれらのコンポーネント、TADOConnection、TADOTable、TADOQuery、TADOCommandを使用しています。すぐに私が代わりにメインフォームのDataModuleのフォームに上記の名前のコンポーネント、と初めてアプリケーションを実行しようとしたとして、それは今DPRからこの行が実行されたエラーを返します:クラスTADOConnection/TADOTableが見つかりません

Application.CreateForm(TDataModule1, DataModule1);

エラーが発生しましたクラスTADOCOnnectionが見つかりません。。これで、TADOConnectionを削除してDataModuleフォームに再追加したので、別のエラーが発生するようになりました。クラスTADOTableが見つかりません。ですが、これは、作成順序がDataModule上で変更され、TADOTableがフォーム上に作成された最初のオブジェクトになったからです。 DataModuleのから

マイuses句は次のとおりです。

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

私はこのエラーを克服するためのuses節にADODBとDBを含めると言わ他の記事を読んで、それは助けていないようです。

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. 

は私もDataModuleのを作成し、DPRファイルから行を削除し、手動でメインフォームでこれをやってみましたが、私は同じエラーを取得するとき、それはちょうど変更:

マイフルDPRファイルがありますメッセージ。

すべてのコンポーネントをメインフォームに戻すのではなく、次に試すものがわかりません。 DataModuleフォームは、以前のバージョンのDelphiと同じようにXE2で動作します。また、コンポーネントがメインフォームにあるときに同じTADOConnectionおよびTADOTableクラスが見つからないのはなぜですか?

どのような考えや洞察力も大変ありがとうございます。

ジェームズ

答えて

1

問題なく動く新しいプロジェクトを作成すると、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; 

を範囲。とにかく...列挙の後に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を追加

DataModuleに、TADOConnectionTADOTableを入れてください。プロジェクトを保存し、どのユニットがDataModuleの用途に追加されているかを確認します。プロジェクトがコンパイルされて正常に実行された場合は、そのテストプロジェクトのユニット名を作業中のプロジェクトのDataModuleにコピーして、もう一度やり直してください。それでも問題が解決しない場合は、ライブラリパスに関するいくつかの問題があるとしか推測できません。私はこれを試すためにDelphi XE2を持っていないので、私はちょうど推測しています。

+0

すべてのOPがいくつかのコンポーネントを移動した場合、実際にdatamoduleのuses節sh /から抜けているユニットがエラーメッセージの原因になります。 –

+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が作成されているかどうかではなく、そのプロパティが正しく公開されていないため、RTTIがそれらを見つけることができませんでした。前の答えを見て、私の言いたいことを見てください。 –

+0

質問には、ADOConnectionに有効な接続文字列が必要です。ソートのウィザードを提供するプロパティエディタを使用できます。 Accessデータベースを選択できるMicrosoft Jet OLE DBプロバイダを使用します。もちろん、ODBC JetドライバはAccess 2010データベースと互換性がなければ動作しません。そうしないと動作しません。 ADOConnectionを接続すると、ADOTableを接続にリンクし、TableNameプロパティはAccessデータベースの使用可能なテーブルを一覧表示します。 Microsoft Jet OLEプロバイダを選択するとかなり直感的です。 –

0

は後半の答えかもしれませんが、あなたは、対応するDataModuleのに持って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

良いフィードバック@Steffan、しかし問題は、公開されたデフォルトスコープの代わりにクラス宣言のコンポーネントセクションのスコープをpublicに変更したことです。コンポーネントRTTIに含まれておらず、実行時にEXEによって検出されなかった。 –

関連する問題