私はこのコードを継承しました:
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 を再利用したいと思います。
もっと良い方法はありますか?