2011-07-20 10 views
2

私はDelphi6を使用しており、ADODataSetのデータモジュールを持ち、フォームAとフォームBの2つのフォームで使用されています。各フォームは、Dataset.Open()OnCreateDataset.Close()OnCloseにあります。両方のフォームが同時に開いていて、formBが閉じていると、データセットはformAで閉じられます。これを防ぐには基本的に、フォームごとにデータセットのインスタンスを個別に作成する必要がありますが、同時にデータモジュールを使用する必要があります。デルファイでデータモジュールを使用する個別のデータセットインスタンス

+0

データセットを静的として定義しましたか? –

+0

データセットはデータモジュール上にあり、そのカーソルタイプはスタティックに設定されています – mem100

+0

データモジュールはどこに作成されていますか?フォームは独自のインスタンスを作成するか、セントラルインスタンスを使用しますか? –

答えて

3

必要なものを実現する最も簡単な方法は、各フォームのデータモジュールのインスタンスを作成し、フォームにフォームが閉じているときに、それを解放することができますので:自分のデータソース/データセットに認識してコントロールをデータをフックのためのVCLのロジックがあることを確認するために行われている空の文字列にDataModuleの者の名前を設定

var 
    Data: TDataModule; 
begin 
    Data := T<YourDataModule>.Create(Self); 
    try 
    Form := T<YourForm>.Create(Self); 
    Form.DataModule := Data; 
    Data.Name := ''; 
    except 
    Data.Free; 
    raise; 
    end; 

    Form.Show; 
end; 

初めて作成されたインスタンスではなく、新しく作成されたインスタンスを使用して行われます。

フォームのOnCloseハンドラ(またはそのデストラクタ)で、データモジュールを解放してください。

あなたからデータをロードするためにTClientDataSetのとTDataSetProviderを使用してデータセットをADO:そうは場合

+0

申し訳ありませんが、私は "form.datamodule = data"という代入を理解していません。 form.datamoduleはフォームのプロパティですか? – mem100

+0

@ mem100:「すぐに」存在するものではなく、あなた自身のフォームにそれを追加する必要があります。アプリケーション内のすべての単一フォームに対してこれを実行したくない場合は、基本フォームの作成、そのプロパティの追加、およびすべてのアプリケーションのフォームをその基本フォームから降りることを検討できます。あなたがそれについてのより多くの情報を必要とするなら、それは全く別の質問になるでしょう:...-) –

+0

ok私は理解しますが、私は別の説明をします。フォーム上のデータソースはどうですか?データソースは、自動作成されたデータモジュール上のデータセットにバインドされます。どのようにして新しく作成されたインスタンスを使用するようにデータソースを変更するのですか?フォームを作成するイベント内で新しく作成されたインスタンスのデータセットにアクセスするにはどうすればいいですか? – mem100

2

おそらく、各フォームのデータモジュールとは別のインスタンスが必要です。

あなたはが本当にがフォームに両方フォームを同じDataModuleのインスタンスを使用する場合は、いくつかの参照カウント機構を追加する、DataModuleのからのデータセットを開閉する必要があります。

データセットを開くための手順と、データモジュールで閉じるための手順と、開いている呼び出しと閉じた呼び出しを数えるための整数を持つことができます。データセットを開くプロシージャは、実際に最初の呼び出し時にのみ開きます。後続の呼び出しでカウンタをインクリメントします。より近いプロシージャは、各呼び出しでカウンタをデクリメントし、カウンタ値が0に戻ったときにデータベースを閉じます。

0

あなたは、さまざまなデータを表示しながら、同時にフォームAとFormBから同じデータセットにアクセスしようとしています。 ClientDataSet.CloneCursorを使用してカーソルをクローンすると、同じデータに別のカーソルが表示されます。フォームに渡すか、FormAのコントロールをClientDataSetAとFormBに割り当て、ClientDataSetBのクローンに割り当てます。両方のフォームからの読み取り、書き込み、および更新により、基になるデータセットが変更され、後でDataSetProviders ApplyUpdatesを介してADOデータセットを介してデータベースに更新を適用できます。 http://www.podgoretsky.com/ftp/docs/Delphi/D5/dg/5_ds3.html それともケーリージェンソンことで本当に良い本があります:いくつかの助けのためにここに

ルックhttp://www.jensendatasystems.com/cdsbook/ (無料プラグが、それは良いの読み取りです)

0

あなたは私のそれから、あなたは別々のインスタンスを必要と言ったように解決策は、各フォームの宣言でDataModuleの変数を持っているだろう:

TForm1 = class(TForm) 
... 
private 
    fDatamodule : TDatamodule1; 
... 
end; 

procedure TForm1.FormCreate(Sender : TObject) 
begin 
    fDatamodule := TDatamodule1.Create(self); 
    MyDatasource.Dataset := fDatamodule.MyDataset; 
end; 

(Form2のなどのために繰り返す)

あなたは同じDataModuleのを持って、二回インスタンス化し、目私たちはお互いに完全に離れていますが、それぞれのフォームで同じビジネスロジックを利用しています。

件名では、データモジュールコードがいずれの形式も参照していないことを確認してください。これは悪い習慣です。

+0

あなたの答えをありがとう。これは私がやったことですが、答えを投稿する前に私はそれをしました。私のコメントをmarjanの答えに見てください。 – mem100

+0

ああ、申し訳ありませんが、それを逃した必要があります。あなたがあなたの解決策を得てうれしい。 – Stuart

関連する問題