カスタム バリアント型のデータの格納
カスタム バリアントの定義:インデックス への移動
バリアントのデータは TVarData レコード型に格納されます。 この型は 16 バイトのレコードです。 最初のワードはバリアントの種類を示し、残りの 14 バイトはデータの格納に使用できます。 新規のバリアント型で TVarData
レコードを直接操作することもできますが、新規のバリアント型にとって意味のある名前をメンバ名とするレコード型を定義し、その新しい型を TVarData
レコード型にキャストする方が通常は簡単です。
たとえば、VarConv ユニットには、測定値を表すカスタム バリアント型が定義されています。この型のデータには測定単位(TConvType
)と値(Double 型)が含まれています。VarConv ユニットでは、このような値を表す独自の型を定義しています。
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
オブジェクトの参照が含まれています。
TComplexVarData = packed record
VType: TVarType;
Reserved1, Reserved2, Reserved3: Word;
VComplex: TComplexData;
Reserved4: LongInt;
end;
オブジェクト参照は実際にはポインタ(2 ワード)なので、この型は TVarData
レコードと同じサイズになります。前述と同様に、カスタム複素数バリアント(またはその TVarData
レコード)は TComplexVarData
にキャストすることができ、このカスタム バリアント型では TVarData
レコードを TComplexVarData
型であるかのように扱います。