私は、formA と FormB の 2 つのフォームで使用されるDelphi6
データ モジュールを使用しています。ADO
DataSet
各フォームにはDataset.Open()
inOnCreate
とDataset.Close()
in がありOnClose
ます。両方のフォームが同時に開いていて、formB が閉じている場合、データセットは formA で閉じられます。これを防ぐにはどうすればよいですか。基本的に、フォームごとにデータセットの個別のインスタンスが必要ですが、同時にデータモジュールを使用します。
4 に答える
おそらく、フォームごとにデータモジュールから個別のインスタンスが必要になるでしょう。
両方のフォームから同じデータモジュール インスタンスを本当に使用したい場合は、参照カウント メカニズムを追加して、データモジュールからデータセットを開いたり閉じたりする必要があります。
典型的には、データセットを開くためのプロシージャと、データモジュールでデータセットを閉じるためのプロシージャ、およびオープンとクローズの呼び出しをカウントする整数を用意することで、これを行います。データセットを開く手順は、実際には最初の呼び出しでのみ開き、その後の呼び出しではカウンターをインクリメントするだけです。クローザー プロシージャは、呼び出しごとにカウンターをデクリメントし、カウンター値が 0 に戻るとデータベースを閉じます。
目的を達成する最も簡単な方法は、フォームごとにデータ モジュールのインスタンスを作成し、それをフォームに渡して、フォームを閉じたときに解放できるようにすることです。
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;
DataModule の Name を空の文字列に設定するのは、データ認識コントロールをデータソース/データセットに接続するための VCL のロジックが、最初のインスタンスではなく、新しく作成されたインスタンスを使用して実行されるようにするためです。
フォームの OnClose ハンドラ (またはそのデストラクタ) で、データ モジュールを解放してください。
あなたが別のインスタンスが必要だと言ったように、私の解決策は、各フォーム宣言に Datamodule 変数を持つことです:
TForm1 = class(TForm)
...
private
fDatamodule : TDatamodule1;
...
end;
procedure TForm1.FormCreate(Sender : TObject)
begin
fDatamodule := TDatamodule1.Create(self);
MyDatasource.Dataset := fDatamodule.MyDataset;
end;
(Form2などについて繰り返します)
同じデータモジュールが 2 回インスタンス化されているため、互いに完全に分離されていますが、各フォームで同じビジネス ロジックを使用しています。
この件については、データモジュール コードがどちらの形式も参照しないようにしてください。これは悪い習慣です。
異なるデータを表示しながら、同時に FormA と FormB から同じデータセットにアクセスしようとしていますか? その場合:
TClientDataSet と TDataSetProvider を使用して、ADO データセットからデータをロードします。次に、ClientDataSet.CloneCursor を使用してカーソルを複製すると、同じデータへの別のカーソルが得られます。次に、それらをフォームに渡すか、FormA のコントロールを ClientDataSetA に、FormB のコントロールを複製の ClientDataSetB に割り当てます。両方のフォームからの読み取り、書き込み、および更新により、基になるデータセットが変更され、後で DataSetProviders ApplyUpdates を介して ADO データセットを介してデータベースに更新を適用できます。
http://www.podgoretsky.com/ftp/docs/Delphi/D5/dg/5_ds3.html または、Cary Jenson による非常に優れた本があります: http://www.jensendatasystems.com/ cdsbook/ (無料のプラグインですが、よく読んでいます)