カスタム バリアントのコピーと消去
カスタム バリアントの定義:インデックス への移動
演算子の型キャストおよび実装に加え、カスタム Variant 型の払いアンとをコピーおよび消去する方法を指定しなければなりません。
バリアントの値のコピー方法を指定するには、System.Variants.TCustomVariantType.Copy メソッドを実装します。 バリアントの値を保持するために使用する、クラスや構造体のためのメモリを確保することを覚えておかなければなりませんが、大抵これは、簡単なオペレーションとなります。
Delphi:
procedure TComplexVariantType.Copy(var Dest: TVarData; const Source: TVarData; const Indirect: Boolean);
begin
if Indirect and VarDataIsByRef(Source) then
VarDataCopyNoInd(Dest, Source)
else
with TComplexVarData(Dest) do
begin
VType := VarType;
VComplex := TComplexData.Create(TComplexVarData(Source).VComplex);
end;
end;
- メモ:
Copy
メソッドのIndirect
パラメータは、データへの間接参照だけをバリアントが保持しているときのケースを考慮すべきことを示しています。
- ヒント: カスタム バリアント型が、データを保持するためのメモリを確保していない場合(データが完全に
TVarData
レコードに収まっている場合)、Copy メソッドの実装は、単純に SimplisticCopy メソッドを呼び出します。
バリアントの値のクリア方法を指定するには、Clear メソッドを実装します。 Copy メソッドと同様、これを行う上で唯一煩雑な点は、バリアントのデータを格納するために確保されたあらゆるリソースを、必ず解放しなければならない点です。
Delphi:
procedure TComplexVariantType.Clear(var V: TVarData);
begin
V.VType := varEmpty;
FreeAndNil(TComplexVarData(V).VComplex);
end;
IsClear メソッドもまた実装しなければなりません。 この方法で、無効な値または「空の」データを表す特殊な値を、検知することができます。
Delphi:
function TComplexVariantType.IsClear(const V: TVarData): Boolean;
begin
Result := (TComplexVarData(V).VComplex = nil) or
TComplexVarData(V).VComplex.IsZero;
end;