カスタム バリアント型のデータの格納

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

RTL の使用:インデックス への移動

バリアントのデータは TVarData レコード型に格納されます。この型は 16 バイトのレコードです。最初のワードはバリアントの種類を示し、残りの 14 バイトはデータの格納に使用できます。新規のバリアント型で TVarData レコードを直接操作することもできますが、新規のバリアント型にとって意味のある名前をメンバ名とするレコード型を定義し、その新しい型を TVarData レコード型にキャストする方が通常は簡単です。

たとえば、VarConv ユニットには、測定値を表すカスタム バリアント型が定義されています。この型のデータには測定単位(TConvType)と値(Double 型)が含まれています。VarConv ユニットでは、このような値を表す独自の型を定義しています。

Object Pascal の場合:
 TConvertVarData = packed record
   VType: TVarType;
   VConvType: TConvType;
   Reserved1, Reserved2: Word;
   VValue: Double;
 end;

この型は TVarData レコードとまったく同じサイズです。この新しい型のカスタム バリアントを操作するとき、そのバリアント(またはその TVarData レコード)は TConvertVarData にキャストすることができ、このカスタム バリアント型では TVarData レコードをただ TConvertVarData 型であるかのように扱います。

メモ: このように TVarData レコードにマッピングされるレコードを定義するときは、必ず packed record として定義します。

新しいカスタム バリアント型のデータを格納するのに 14 バイトでは足りない場合は、ポインタまたはオブジェクト インスタンスを含んだ新しいレコード型を定義できます。たとえば、VarCmplx ユニットでは、TComplexData クラスのインスタンスを使用して、複素数バリアントのデータを表しています。定義されているレコード型は、TVarData と同じサイズで、中に TComplexData オブジェクトの参照が含まれています。

Object Pascal の場合:
 TComplexVarData = packed record
   VType: TVarType;
   Reserved1, Reserved2, Reserved3: Word;
   VComplex: TComplexData;
   Reserved4: LongInt;
 end;

オブジェクト参照は実際にはポインタ(2 ワード)なので、この型は TVarData レコードと同じサイズになります。前述と同様に、カスタム複素数バリアント(またはその TVarData レコード)は TComplexVarData にキャストすることができ、このカスタム バリアント型では TVarData レコードを TComplexVarData 型であるかのように扱います。

関連項目