カスタム バリアント型を操作するユーティリティの作成

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

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


カスタム バリアント型を実装するための TCustomVariantType の下位クラスを作成したら、アプリケーションでその新しい Variant 型を使用できるようになります。 ただし、これを簡単に使用できるようにするには、いくつかユーティリティが必要となります。

良い方法の 1 つとしては、アプリケーションの値、またはその値のセットから、カスタム バリアント型のインスタンスを作成するメソッドを作成しておくといいでしょう。 この関数または関数のセットは、作成したカスタム バリアントのデータを、定義した構造体に格納します。 たとえば、以下の関数は、複素数バリアントを作成するために使用できます:

Object Pascal:
 function VarComplexCreate(const AReal, AImaginary: Double): Variant;
 begin
   VarClear(Result);
 TComplexVarData(Result).VType := ComplexVariantType.VarType;
 TComplexVarData(ADest).VComplex := TComplexData.Create(ARead, AImaginary);
 end;
この関数は実際には VarCmplx ユニットに存在しておらず、例を分かりやすくするために、実際に存在するメソッド群をまとめたものです。 返されるバリアントは、TVarData 構造体(TComplexVarData)にマッピングするために、定義済みレコードにキャストされ、その後、値が設定されます。

その他作成しておくと便利なユーティリティには、新しい Variant 型の型コードを返すものが挙げられます。 この型コードは定数ではありません。 TCustomVariantType の下位クラスをインスタンス化した際に、これは自動的に生成されます。 このため、自分のカスタム バリアント型の型コードを、簡単に判別するための方法を提供すると便利になります。 VarCmplx ユニットからの次の関数は、これを記述方法を表しています。これはシンプルに、TCustomVariantType 下位クラスの VarType プロパティを返します:

Object Pascal:
 function VarComplex: TVarType;
 begin
 Result := ComplexVariantType.VarType;
 end;

大抵のカスタム バリアントに対して用意する標準なユーティリティには、あと 2 つあり、指定されたバリアントがカスタム型であるかどうかチェックし、任意のバリアントを新しいカスタム型にキャストします。 次は、VarCmplx ユニットからの、これらユーティリティの実装です:

Object Pascal:
 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 ユニットは、複素数値バリアントに対する数理演算を実装するため、大量の関数を定義しています。

関連項目