カスタム バリアント型を操作するユーティリティの作成
カスタム バリアントの定義:インデックス への移動
カスタム バリアント型を実装するための TCustomVariantType の下位クラスを作成したら、アプリケーションでその新しい Variant 型を使用できるようになります。 ただし、これを簡単に使用できるようにするには、いくつかユーティリティが必要となります。
良い方法の 1 つとしては、アプリケーションの値、またはその値のセットから、カスタム バリアント型のインスタンスを作成するメソッドを作成しておくといいでしょう。 この関数または関数のセットは、作成したカスタム バリアントのデータを、定義した構造体に格納します。 たとえば、以下の関数は、複素数バリアントを作成するために使用できます:
function VarComplexCreate(const AReal, AImaginary: Double): Variant;
begin
VarClear(Result);
TComplexVarData(Result).VType := ComplexVariantType.VarType;
TComplexVarData(ADest).VComplex := TComplexData.Create(ARead, AImaginary);
end;
TVarData
構造体(TComplexVarData
)にマッピングするために、定義済みレコードにキャストされ、その後、値が設定されます。
その他作成しておくと便利なユーティリティには、新しい Variant 型の型コードを返すものが挙げられます。 この型コードは定数ではありません。 TCustomVariantType
の下位クラスをインスタンス化した際に、これは自動的に生成されます。 このため、自分のカスタム バリアント型の型コードを、簡単に判別するための方法を提供すると便利になります。 VarCmplx ユニットからの次の関数は、これを記述方法を表しています。これはシンプルに、TCustomVariantType
下位クラスの VarType
プロパティを返します:
function VarComplex: TVarType;
begin
Result := ComplexVariantType.VarType;
end;
大抵のカスタム バリアントに対して用意する標準なユーティリティには、あと 2 つあり、指定されたバリアントがカスタム型であるかどうかチェックし、任意のバリアントを新しいカスタム型にキャストします。 次は、VarCmplx ユニットからの、これらユーティリティの実装です:
function VarIsComplex(const AValue: Variant): Boolean;
begin
Result := (TVarData(AValue).VType and varTypeMask) = VarComplex;
end;
function VarAsComplex(const AValue: Variant): Variant;
begin
if not VarIsComplex(AValue) then
VarCast(Result, AValue, VarComplex)
else
Result := AValue;
end;
TVarData
レコードおよび VarCast
関数の VType
メンバー --- を使用している点に注目してください。これらは、データをキャストするために TCustomVariantType 下位クラスで実装されているメソッドであるため、機能します。
上で言及した標準ユーティリティに加え、自分の新しいカスタム バリアント型に特化したユーティリティを、必要なだけ記述することができます。 たとえば、、VarCmplx ユニットは、複素数値バリアントに対する数理演算を実装するため、大量の関数を定義しています。