0

データを A TClientDataSet から B にコピーする関数を作成しました。

本番環境では、コードは次のように TClientDataSet を動的に埋めます。

procedure LoadClientDataSet(const StringSql: String; ParamsAsArray: array of Variant; CdsToLoad: TClientDataSet);
begin
  //There is a shared TClientDataSet that retrieves 
  //all data from a TRemoteDataModule in here.

  //the following variables (and code) are here only to demonstration of the algorithm;
  GlobalMainThreadVariable.SharedClientDataSet.CommandText := StringSql;
  //Handle Parameters
  GlobalMainThreadVariable.SharedClientDataSet.Open;


  CdsToLoad.Data:= GlobalMainThreadVariable.SharedClientDataSet.Data;

  GlobalMainThreadVariable.SharedClientDataSet.Close; 
end;    

それは言った:

  • そうしても安全ですか?(安全とは、どのような例外が予想され、どのように対処すればよいのでしょうか?)
  • 「.Data」のメモリを解放するにはどうすればよいですか?
4

2 に答える 2

2

Data プロパティの背後にあるデータ ストレージは参照カウントされます。したがって、わざわざリリースする必要はありません。

TClientDataSet の組み込みをさらに深く掘り下げたい場合は、Cary Jensen の非常に優れた本を読むことをお勧めします: Delphi in Depth: ClientDataSets

于 2014-03-14T12:46:45.257 に答える
1

あなたがしたようにプロパティを割り当てることによりData、レコードが複製されます。TClientDatasetこれで、まったく同じ構造、同じ行数、同じフィールド値を持つ 2 つの異なるレコード セットを持つ 2つの異なるインスタンスができました。

受信側にTClientDataset以前に定義されたフィールド構造がない場合、または既存の構造がData割り当てられているものと互換性がある場合は、これを行っても安全です。ただし、膨大な数のレコードについて話している場合、割り当てに時間がかかる場合があり、極端な状況では、コンピューターのメモリを使い果たす可能性があります (すべてコンピューターの構成に依存します)。

データを解放するには、データセットを閉じるだけです。

TClientDatasetレコードのインスタンスを 2 つ、インスタンスを 1 つにしたい場合はTClientDataset.CloneCursor、データをコピーする代わりに、別のデータセットでデータへの参照を割り当てる方法を使用することをお勧めします。この場合、2 つの異なるデータセット間で共有されるまったく同じデータです。

于 2014-03-17T11:04:31.093 に答える