1

さて、DataModuleフォームを作成し、すべてのデータベースコンポーネントをそこに移動して、デザイン時のフォームを少しクリーンアップすることを決定するまで、アプリケーションは正常に機能していました。Delphi XE2 Update 1と、これらのコンポーネント、TADOConnection、TADOTable、TADOQuery、TADOCommandを使用しています。メインフォームではなく、DataModuleフォームで上記の名前のコンポーネントを使用してアプリを初めて実行しようとするとすぐに、DPRからのこの行が実行されたときにエラーが返されるようになりました。

Application.CreateForm(TDataModule1, DataModule1);

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

usesDataModuleからの私の句は次のとおりです。

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

このエラーを克服するためにuses句に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.

DataModuleを作成するDPRファイルから行を削除して、メインフォームで手動で実行しようとしましたが、同じエラーメッセージが表示されると変更されます。

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

どんな考えや洞察も大歓迎です。

ジェームズ

4

4 に答える 4

2

新しいプロジェクトを開始し、それにDataModule. とにドロップTADOConnectionします。プロジェクトを保存し、どのユニットが の使用に追加されるかを確認します。プロジェクトが正常にコンパイルおよび実行された場合は、ユニット名をそのテスト プロジェクトから作業中のプロジェクトにコピーして、もう一度試してください。それでも解決しない場合は、ライブラリ パスに問題があると推測できます。私はこれを試すための Delphi XE2 を持っていないので、推測にすぎません。TADOTableDataModuleDataModuleDataModule

于 2011-10-23T07:49:37.993 に答える
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;

グローバル スコープを持つ必要がなかったため、クラスに 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;

これが他の誰かに役立つことを願っています。

ジェームズ

于 2011-10-25T00:03:45.830 に答える
0

遅い答えかもしれませんが、対応する Datamodule にどの ClassGroup があるかを確認しましたか? IDE でデータ モジュールを開き、それをクリックして、ObjectInspector で ClassGroup プロパティを確認します。

Vcl.Controls.TControl に設定されていない場合は、それに変更することをお勧めします。ここでのロジックは、デフォルトでは、Datamodule はどのフレームワークにもまったくバインドされておらず、両方に使用できるということです。したがって、System.Classes.TPersistent の ClassGroup は、データ モジュールがフレームワーク/プラットフォームに依存しないことを意味します (VCL アプリと FMX アプリで使用できます)。

コンポーネントの ADO セットは VCL 固有であり、FMX アプリでは使用できません。つまり、データ モジュールの ClassGroup として System.Classes.TPersistent を使用せず、代わりに Vcl.Controls.TControl を使用してください。

それがあなたの問題の原因かもしれませんか?

于 2012-05-15T09:59:15.270 に答える
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?
于 2012-04-16T06:39:58.557 に答える