カスタム バリアントのコピーと消去

提供: Appmethod Topics
移動先: 案内検索

カスタム バリアントの定義:インデックス への移動


演算子の型キャストおよび実装に加え、カスタム Variant 型の払いアンとをコピーおよび消去する方法を指定しなければなりません。

バリアントの値のコピー方法を指定するには、System.Variants.TCustomVariantType.Copy メソッドを実装します。 バリアントの値を保持するために使用する、クラスや構造体のためのメモリを確保することを覚えておかなければなりませんが、大抵これは、簡単なオペレーションとなります。

Object Pascal:
 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 メソッドと同様、これを行う上で唯一煩雑な点は、バリアントのデータを格納するために確保されたあらゆるリソースを、必ず解放しなければならない点です。

Object Pascal:
 procedure TComplexVariantType.Clear(var V: TVarData);
 begin
   V.VType := varEmpty;
   FreeAndNil(TComplexVarData(V).VComplex);
 end;

IsClear メソッドもまた実装しなければなりません。 この方法で、無効な値または「空の」データを表す特殊な値を、検知することができます。

Object Pascal:
 function TComplexVariantType.IsClear(const V: TVarData): Boolean;
 begin
   Result := (TComplexVarData(V).VComplex = nil) or
   TComplexVarData(V).VComplex.IsZero;
 end;

関連項目