1

私はこのコードを継承しました:

var
  FSavedRecords : Variant;  { actually, a private property in an ancestor }
  lFieldsArray  : Variant;
  lClientDataSet: TClientDataSet;

  FSavedRecords := VarArrayCreate([0, lCount], varVariant);

  for lRow := 0 to lCount do
  begin
    FSavedRecords[lRow] := VarArrayCreate([0, lClientDataSet.FieldCount-1], varVariant);
    with lClientDataSet do
      begin
        lFieldsArray := FSavedRecords[lRow];
        if <SomeCondition> then
           put lClientDataSet field values into lFieldsArray

条件が常に真であるとは限らないため、最終的に FSavedRecords の要素は lCount(+1) よりも少なくなります。
もちろん、それらを数えることはできますが(lNrOutputなど)、SetLength(FSavedRecords,lNrOutput)(「定数オブジェクトをvarパラメーターとして渡すことはできません」)はできません。

SetLength() を使用できない場合は、DynArrayFromVariant を使用してバリアント配列を動的な「バリアントの配列」に変換し、その上で SetLength を使用できると仮定しますが、これには余分なコピー操作という欠点があります。同じ目的でプログラムの他の場所で使用されている先祖フォームからのプライベート FSavedRecords を再利用したいと思います。

もっと良い方法はありますか?

4

1 に答える 1

2

SetLength動的配列と長い文字列のサイズを変更するために使用されます。バリアント配列のサイズを変更するには、 を使用しますVarArrayRedim

もう 1 つのオプションは、 type の一時的なコンテナーに要素のリストを作成することTList<T>です。終了したら、Countそのコンテナーのプロパティを使用して、バリアント配列のサイズを完全に変更できます。そして、実際の値をコピーします。

どちらのアプローチを使用してもほとんど違いはないと思います。

于 2013-11-01T13:54:08.800 に答える