1

バリアント配列(doubleの配列ですが、私が推測するものであれば何でもかまいません)を動的配列に変換しようとしています。私は通常、DynArrayFromVariantプロシージャとDynArrayToVariantプロシージャを使用しますが、この場合、バリアント配列は1ベースです。これらの2つの関数は、0ベースの配列でのみ機能するようです。必要なことをどのように行うことができるか考えていますか?

4

1 に答える 1

8

配列要素のタイプがわかっている場合は、より効率的な(一般的ではありませんが)コードを記述できます。

function DoubleDynArrayFromVarArray(const V: Variant): TDoubleDynArray;
var
  P: Pointer;
  Count: Integer;
begin
  Result := nil;
  if not VarIsArray(V) or (VarType(V) and varTypeMask <> varDouble) or
    (VarArrayDimCount(V) <> 1) then
    raise EVariantInvalidArgError.Create(SVarInvalid);

  Count := VarArrayHighBound(V, 1) - VarArrayLowBound(V, 1) + 1;
  if Count = 0 then
    Exit;

  P := VarArrayLock(V);
  try
    SetLength(Result, Count);
    Move(P^, Result[0], Count * SizeOf(Double));
  finally
    VarArrayUnlock(V);
  end;
end;
于 2012-07-03T11:49:12.367 に答える