System.TVarData
Delphi
TVarData = packed record
case Integer of
0: (VType: TVarType;
case Integer of
0: (Reserved1: Word;
case Integer of
0: (Reserved2, Reserved3: Word;
case Integer of
varSmallInt: (VSmallInt: SmallInt);
varInteger: (VInteger: Integer);
varSingle: (VSingle: Single);
varDouble: (VDouble: Double);
varCurrency: (VCurrency: Currency);
varDate: (VDate: TDateTime);
varOleStr: (VOleStr: PWideChar);
varDispatch: (VDispatch: Pointer);
varError: (VError: HRESULT);
varBoolean: (VBoolean: WordBool);
varUnknown: (VUnknown: Pointer);
varShortInt: (VShortInt: ShortInt);
varByte: (VByte: Byte);
varWord: (VWord: Word);
-1: (VLongWord: Cardinal {deprecated 'use VUInt32'});
varUInt32: (VUInt32: UInt32);
varInt64: (VInt64: Int64);
varUInt64: (VUInt64: UInt64);
varString: (VString: Pointer);
varAny: (VAny: Pointer);
varArray: (VArray: PVarArray);
varByRef: (VPointer: Pointer);
varUString: (VUString: Pointer);
varRecord: (VRecord: TVarRecord);
);
1: (VLongs: array[0..{$IFDEF CPU64BITS}4{$ELSE}2{$ENDIF}] of Integer);
);
2: (VWords: array [0..{$IFDEF CPU64BITS}10{$ELSE}6{$ENDIF}] of Word);
3: (VBytes: array [0..{$IFDEF CPU64BITS}21{$ELSE}13{$ENDIF}] of Byte);
);
1: (RawData: array [0..{$IFDEF CPU64BITS}5{$ELSE}3{$ENDIF}] of Integer);
end;
C++
struct TVarData
{
union
{
uint16_t VType; // Delphi-compatible - Variant Type member
#if defined(VARIANT_NATIVE_SUPPORT)
VARTYPE vt; // tagVARIANT compatible member
#else
uint16_t vt; // Expose a generic 'vt' member
#endif
};
uint16_t Reserved1;
uint16_t Reserved2;
uint16_t Reserved3;
union
{
System::Smallint VSmallint; // iVal
System::Integer VInteger; // lVal
System::Single VSingle; // fltVal
System::Double VDouble; // dblVal
System::CurrencyBase VCurrency; // cyVal
System::TDateTimeBase VDate; // date
System::PWideChar VOleStr; // bstrVal
#ifdef _WIN32
IDispatch* VDispatch; // pdispVal
#else
System::IDispatch* VDispatch; // pdispVal
#endif
System::HResult VError; // scode
System::WordBool VBoolean; // boolVal
IUnknown* VUnknown; // punkVal
System::Byte VByte; // bVal
System::Int8 VShortint; // charVal
System::Int8 VShortInt; // charVal
System::Pointer VString; // ??????
System::PVarArray VArray; // parray
System::Pointer VPointer; // byref
__int64 VInt64; // llVal
unsigned __int64 VUInt64; // ullVal
System::Word VWord; // uiVal
System::LongWord VLongWord; // ulVal
System::TVarRecord VRecord; // struct __tagBRECORD
#if defined(VARIANT_NATIVE_SUPPORT)
LONG lVal;
BYTE bVal;
SHORT iVal;
FLOAT fltVal;
DOUBLE dblVal;
VARIANT_BOOL boolVal;
SCODE scode;
CY cyVal;
DATE date;
BSTR bstrVal;
LONG64 llVal;
ULONG64 ullVal;
IUnknown *punkVal;
IDispatch *pdispVal;
SAFEARRAY *parray;
BYTE *pbVal;
SHORT *piVal;
LONG *plVal;
FLOAT *pfltVal;
DOUBLE *pdblVal;
VARIANT_BOOL *pboolVal;
SCODE *pscode;
CY *pcyVal;
DATE *pdate;
BSTR *pbstrVal;
IUnknown **ppunkVal;
IDispatch **ppdispVal;
SAFEARRAY **pparray;
VARIANT *pvarVal;
PVOID byref;
CHAR cVal;
USHORT uiVal;
ULONG ulVal;
INT intVal;
UINT uintVal;
DECIMAL *pdecVal;
CHAR *pcVal;
USHORT *puiVal;
ULONG *pulVal;
INT *pintVal;
UINT *puintVal;
LONG64 *pllVal;
ULONG64 *pullVal;
#endif
};
};
プロパティ
種類 | 可視性 | ソース | ユニット | 親 |
---|---|---|---|---|
record struct |
public | System.pas systvar.h |
System | System |
説明
TVarData は,バリアントの情報を表します。
TVarData は,バリアントの基本クラスです。
メモ: TVarData で示されたように Variant の内部構造は,OLE と Win32 API で使用される Variant 型と同じです。
struct TVarData
{ union { Word VType; // Delphi 互換 - Variant 型のメンバー VARTYPE vt; // tagVARIANT 互換メンバー }; Word Reserved1; Word Reserved2; Word Reserved3; union { // Delphi 互換 Variant メンバー Smallint VSmallint; // iVal Integer VInteger; // lVal Single VSingle; // fltVal Double VDouble; // dblVal CurrencyBase VCurrency; // cyVal TDateTimeBase VDate; // date PWideChar VOleStr; // bstrVal IDispatch* VDispatch; // pdispVal HResult VError; // scode WordBool VBoolean; // boolVal IUnknown* VUnknown; // punkVal Byte VByte; // bVal Pointer VString; // ?????? PVarArray VArray; // parray Pointer VPointer; // byref // tagVARIANT 互換メンバー(OAIDL.H から) // すべての型が [V] とマークされる(初期化される VARIANT に入る可能性がある) LONG lVal; BYTE bVal; SHORT iVal; FLOAT fltVal; DOUBLE dblVal; VARIANT_BOOL boolVal; SCODE scode; CY cyVal; DATE date; BSTR bstrVal; IUnknown *punkVal; IDispatch *pdispVal; SAFEARRAY *parray; BYTE *pbVal; SHORT *piVal; LONG *plVal; FLOAT *pfltVal; DOUBLE *pdblVal; VARIANT_BOOL *pboolVal; SCODE *pscode; CY *pcyVal; DATE *pdate; BSTR *pbstrVal; IUnknown **ppunkVal; IDispatch **ppdispVal; SAFEARRAY **pparray; VARIANT *pvarVal; PVOID byref; CHAR cVal; USHORT uiVal; ULONG ulVal; INT intVal; UINT uintVal; DECIMAL *pdecVal; CHAR *pcVal; USHORT *puiVal; ULONG *pulVal; INT *pintVal; UINT *puintVal; }; };
TVarData の VType は,下位 12 ビット(varTypeMask によって定義されるビット)にバリアントの型コードを持ちます。
VType が使用できる値は以下のようになります。
#define varEmpty (Byte)(0) #define varNull (ByteByte_Type)(1) #define varSmallint (ByteByte_Type)(2) #define varInteger (ByteByte_Type)(3) #define varSingle (ByteByte_Type)(4) #define varDouble (ByteByte_Type)(5) #define varCurrency (ByteByte_Type)(6) #define varDate (ByteByte_Type)(7) #define varOleStr (ByteByte_Type)(8) #define varDispatch (ByteByte_Type)(9) #define varError (ByteByte_Type)(10) #define varBoolean (ByteByte_Type)(11) #define varVariant (ByteByte_Type)(12) #define varUnknown (ByteByte_Type)(13) #define varByte (ByteByte_Type)(17) #define varString (WordWord_Type)(256) #define varTypeMask (WordWord_Type)(4095) #define varArray (WordWord_Type)(8192) #define varByRef (WordWord_Type)(16384) #define varStrArg (ByteByte_Type)(72) #define vtInteger (ByteByte_Type)(0) #define vtBoolean (ByteByte_Type)(1) #define vtChar (ByteByte_Type)(2) #define vtExtended (ByteByte_Type)(3) #define vtString (ByteByte_Type)(4) #define vtPointer (ByteByte_Type)(5) #define vtPChar (ByteByte_Type)(6) #define vtObject (ByteByte_Type)(7) #define vtClass (ByteByte_Type)(8) #define vtWideChar (ByteByte_Type)(9) #define vtPWideChar (ByteByte_Type)(10) #define vtAnsiString (ByteByte_Type)(11) #define vtCurrency (ByteByte_Type)(12) #define vtVariant (ByteByte_Type)(13)
さらに,varArray ビットがセットされていると,そのバリアントは配列であり,varByRef ビットがセットされていると,そのバリアントには値でなく参照が入っています。
Word Reserved1; Word Reserved2; Word Reserved3;
Reserved1,Reserved2,および Reserved3 は,TVarData では使用されません。
union { Smallint VSmallint; Integer VInteger; Single VSingle; Double VDouble; CurrencyBase VCurrency; TDateTimeBase VDate; PWideChar VOleStr; Ole2::IDispatch* VDispatch; Integer VError; WordBool VBoolean; Ole2::IUnknown* VUnknown; Byte VByte; Pointer VString; PVarArray VArray; Pointer VPointer; };
TVarData の残り 8 ビットの内容は,VType 項目の値によって変わります。varArray ビットと varByRef ビットが両方ともセットされていなければ,バリアントには与えられた型の値が入っています。
varArray がセットされている場合,バリアントは配列の特性を定義した TVarArray 構造体へのポインタを持ちます。各配列の要素型は,VType の varTypeMask によって指定されます。
varByRef がセットされている場合,バリアントは varTypeMask と VType の varArray によって指定された型の値への参照を持ちます。
コード サンプル