Variantクラス
Variant クラスは、COMで用いられるVARIANT型をラップするクラスです。
クラスの機能
公開メソッド
コンストラクタ
Variantを構築します。
Sub Variant()
内容を空として初期化します。内部処理形式はVT_EMPTYになります。
Sub Variant(y As Variant) Sub Variant(y As VARIANT)
yの複製で初期化します。内部処理形式はyと同一になります。
Sub Variant(n As SByte) Sub Variant(n As Byte) Sub Variant(n As Integer) Sub Variant(n As Word) Sub Variant(n As Long) Sub Variant(n As DWord) Sub Variant(n As Int64) Sub Variant(n As QWord) Sub Variant(n As Single) Sub Variant(n As Double)
nの値で初期化します。内部処理形式は引数の型に対応したものになります。
Sub Variant(bs As BString)
bsの文字列の複製で初期化します。内部処理形式はVT_BSTRになります。
Sub Variant(p As *IUnknown) Sub Variant(p As *IDispatch)
pで初期化します。内部処理形式はそれぞれVT_UNKNOWNとVT_DISPATCHになります。
Sub Variant(b As Boolean)
bがTrueならVARIANT_TRUE、FalseならVARIANT_FALSEで初期化します。内部処理形式はVT_BOOLになります。
Sub Variant(s As String)
sをBSTRへ変換したもので初期化します。内部処理形式はVT_BSTRになります。
デストラクタ
内容の解放を行います。
Sub ~Variant()
Clearを呼びます。
Clear
内容を空にします。
Sub Clear()
メモリを確保するオブジェクトを保持していた場合、そのメモリは解放されます。
Assgin
オブジェクトの複製を割り当てます。
Sub Assign(from As Variant) Sub Assign(ByRef from As VARIANT)
- from
- 複製元
Attachと違い、複製を割り当てるため、Assginを呼んだ後もfromの内容は変化しません。
AssginInd
オブジェクトの複製を割り当てます。参照オブジェクトの場合その先のオブジェクトまで辿ります。
Sub Assign(ByRef from As VARIANT)
- from
- 複製元
内部ではVariantCopyIndを呼び出しており、Attachと違い、例えばfromがVT_BYREF | VT_I4のようにVT_BYREFを含む場合、参照先の値を取り出し、このVariantオブジェクトはVT_I4となります。
Attach
オブジェクトを割り当てます。
Sub Attach(ByRef from As VARIANT)
- from
- 元となるVARIANT
Assginと違い、fromが保持していたオブジェクトはこのVariantへ移され、Attachの後fromの内容は空 (VT_EMPTY)となります。
Copy
オブジェクトの複製を返します。
Const Function Copy() As VARIANT
基本的に戻り値のVARIANTオブジェクトはVariantClearで解放処理をする必要があります。
Detach
内部のVARIANTオブジェクトをこのVariantの管理下から外します。
Function Detach() As VARIANT
基本的に戻り値のVARIANTオブジェクトはVariantClearで解放処理をする必要があります。
冪算演算子
Const Function Operator ^(y As Variant) As Variant
正符号演算子
Const Function Operator +() As Variant
Thisの複製を返します。
負符号演算子
Const Function Operator -() As Variant
このオブジェクトの保持する値の符号を反転させた値を返します。
乗算演算子
Const Function Operator *(y As Variant) As Variant
除算演算子
Const Function Operator /(y As Variant) As Variant
整数除算演算子
Const Function Operator \(y As Variant) As Variant
剰余算演算子
Const Function Operator Mod(y As Variant) As Variant
加算演算子
Const Function Operator +(y As Variant) As Variant
数値同士の場合はThis + yを返します。文字列同士の場合はThisとyの文字列を連結したものを返します。一方が数値で、もう一方が文字列の場合、文字列が数値として認識できるものであれば、数値へ変換して加算を行います。
文字列同士の連結でも連結演算子 &の利用をお勧めます。
例
Dim x As Variant(12) Dim y As Variant("48") Dim z = x + y MessageBox(0, ToTCStr(z.ToString), "", MB_OK)
メッセージボックスには60と出力されます。
減算演算子
Const Function Operator -(y As Variant) As Variant
連結演算子
文字列を連結します。
Const Function Operator &(y As Variant) As Variant
片方が文字列でない場合、文字列へ変換した上で連結します。
例
Dim x As Variant(42) Dim y As Variant("abc") Dim z = x & y MessageBox(0, ToTCStr(z.ToString), "", MB_OK)
メッセージボックスには42abcと出力されます。
比較演算子
比較演算を行います。
Const Function Operator ==(y As Variant) As Boolean Const Function Operator <>(y As Variant) As Boolean Const Function Operator <(y As Variant) As Boolean Const Function Operator >(y As Variant) As Boolean Const Function Operator <=(y As Variant) As Boolean Const Function Operator >=(y As Variant) As Boolean
- 戻り値
- そうでなければ比較演算の結果が真ならTure、偽ならFalse。
演算対象の内、一方でもNullであればFalseとなります。
論理否定演算子
論理否定演算を行います。
Const Function Operator Not() As Variant
結果は次の真理値表に従います。
This | 結果 |
---|---|
True | False |
False | True |
Null | Null |
また、ビット演算としても機能し、その場合各ビットは次の真理値表に従います。
This | 結果 |
---|---|
0 | 1 |
1 | 0 |
論理積演算子
論理積演算を行います。
Const Function Operator And(y As Variant) As Variant
結果は次の真理値表に従います。
This | y | 結果 |
---|---|---|
True | True | True |
True | False | False |
True | Null | Null |
False | True | False |
False | False | False |
False | Null | False |
Null | True | Null |
Null | False | False |
Null | Null | Null |
また、ビット演算としても機能し、その場合各ビットは次の真理値表に従います。
This | y | 結果 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
論理和演算子
Const Function Operator Or(y As Variant) As Variant
結果は次の真理値表に従います。
This | y | 結果 |
---|---|---|
True | True | True |
True | False | True |
True | Null | True |
False | True | True |
False | False | False |
False | Null | Null |
Null | True | True |
Null | False | False |
Null | Null | Null |
また、ビット演算としても機能し、その場合各ビットは次の真理値表に従います。
This | y | 結果 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
排他的論理和演算子
排他的論理和を計算します。
Const Function Operator Xor(y As Variant) As Variant
結果は次の真理値表に従います。なおxまたはyにどちらか一方でもNullが含まれている場合、結果はNullになります。
This | y | 結果 |
---|---|---|
True | True | False |
True | False | True |
False | True | True |
False | False | False |
また、ビット演算としても機能し、その場合各ビットは次の真理値表に従います。
This | y | 結果 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
Imp
論理包括演算を行います。
Static Function Imp(x As Variant, y As Variant) As Variant
結果は次の真理値表に従います。
x | y | 結果 |
---|---|---|
True | True | True |
True | False | False |
True | Null | Null |
False | True | True |
False | False | True |
False | Null | True |
Null | True | True |
Null | False | Null |
Null | Null | Null |
また、ビット演算としても機能し、その場合各ビットは次の真理値表に従います。
x | y | 結果 |
---|---|---|
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 0 |
1 | 1 | 1 |
なお、(Not x) Or yとも等価です。
Eqv
論理等価演算を行います。
Static Function Eqv(x As Variant, y As Variant) As Variant
結果は次の真理値表に従います。なおxまたはyにどちらか一方でもNullが含まれている場合、結果はNullになります。
x | y | 結果 |
---|---|---|
True | True | True |
True | False | False |
False | True | False |
False | False | True |
また、ビット演算としても機能し、その場合各ビットは次の真理値表に従います。
x | y | 結果 |
---|---|---|
0 | 0 | 1 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
なお、Not (x Xor y)と同じです。
Abs
絶対値を返します。
Const Function Abs() As Variant
Fix
実数を整数にします。
Const Function Fix() As Variant
- 戻り値
- 0方向へ向かって最も近い整数を返します。
Int
実数を整数にします。
Const Function Int() As Variant
- 戻り値
- 与えられた値を越えない最大の整数を返します。
Round
実数を整数に丸めます。
Const Function Round(cDecimals As Long) As Variant Const Function Round() As Variant
- cDecimals
- 丸める小数点位置を指定します。省略すると0を指定したことになり、整数へ丸められます。
- 戻り値
- 丸められた値を返します。
VarType
内部データ型の種類を返します。
Const Function VarType() As VARTYPE
- 戻り値
- 内部のVARIANTのvtメンバの値
Compare
比較を行います。
Static Function Compare(x As Variant, y As Variant, lcid As LCID, flags As DWord) As HRESULT Static Function Compare(x As Variant, y As Variant) As HRESULT
- 戻り値
- xがyより大きいときにはVARCMP_LT、等しいときにはVARCMP_EQ、yがxより大きいときにはVARCMP_GT、xまたはyのどちらかにNullが含まれていた場合はVARCMP_NULLが返ります。
このメソッドはVarCmp関数を内部で呼び出します。
ChangeType
内部データ型を変換します。
Const Function ChangeType(vt As VARTYPE, flags As Word) As Variant Const Function ChangeType(vt As VARTYPE) As Variant Const Function ChangeType(ByRef ret As VARIANT, flags As Word, vt As VARTYPE) As HRESULT Const Function ChangeType(ByRef ret As Variant, flags As Word, vt As VARTYPE) As HRESULT
- vt
- 変換したい型
- flags
- 変換のオプション
- ret
- 結果を受け取るオブジェクト
- 戻り値
- Variant型の場合は変換後のオブジェクト。HRESULT型の場合は変換が成功したかどうかを表すエラー値。
この関数は内部でVariantChangeTypeを呼びます。
ToString
文字列へ変換します。
Override Function ToString() As String
GetHashCode
ハッシュ値を求めます。
Override Function GetHashCode() As Long
公開プロパティ
ValUI1
符号無し1バイト整数として読み書きします。
Const Function ValUI1() As Byte Sub ValUI1(x As Byte)
ValUI2
符号無し2バイト整数として読み書きします。
Const Function ValUI2() As Word Sub ValUI2(x As Word)
ValUI4
符号無し4バイト整数として読み書きします。
Const Function ValUI4() As DWord Sub ValUI4(x As DWord)
ValUI8
符号無し8バイト整数として読み書きします。
Const Function ValUI8() As QWord Sub ValUI8(x As QWord)
ValI1
符号有り1バイト整数として読み書きします。
Const Function ValI1() As SByte Sub ValI1(x As SByte)
ValI2
符号有り2バイト整数として読み書きします。
Const Function ValI2() As Integer Sub ValI2(x As Integer)
ValI4
符号有り4バイト整数として読み書きします。
Const Function ValI4() As Long Sub ValI4(x As Long)
ValI8
符号有り8バイト整数として読み書きします。
Const Function ValI8() As Int64 Sub ValI8(x As Int64)
ValR4
単精度実数として読み書きします。
Const Function ValR4() As Single Sub ValR4(x As Single)
ValR8
倍精度実数として読み書きします。
Const Function ValR8() As Double Sub ValR8(x As Double)
ValBool
ブール値として読み書きします。
Const Function ValBool() As VARIANT_BOOL Sub ValBool(x As VARIANT_BOOL)
ValError
エラーコード値として読み書きします。
Const Function ValError() As SCODE Sub ValError(x As SCODE)
ValCy
日付時刻の値として読み書きします。
Const Function ValCy() As Currency Sub ValCy(x As Currency)
ValDate
日付時刻の値として読み書きします。
Const Function ValDate() As Date Sub ValDate(x As Date)
ValStr
文字列として読み書きします。
Const Function ValStr() As BString Sub ValStr(x As BString)
ValUnknown
不明なオブジェクトとして読み書きします。
Const Function ValUnknown() As *IUnknown Sub ValUnknown(x As *IUnknown)
このプロパティのシグネチャは将来変更される可能性があります。
ValObject
オートメーションオブジェクトとして読み書きします。
Const Function ValObject() As VBObject Sub ValObject(x As VBObject)
ValDecimal
十進浮動小数点数値として読み書きします。
Const Function ValObject() As Decimal Sub ValObject(x As Decimal)
PtrToVariant
内部で保持しているVARIANTへのポインタを返します。
Function PtrToVariant() As *VARIANT
備考
Variantの内部型
Variantの基となるVARIANTでは、特殊な種類のデータを保持できます。ここではそれについて説明します。
Empty
Emptyは、初期化されていないことを意味し、VarTypeはVT_EMPTYとなります。数値として解釈されるべき文脈では0、文字列として解釈されるべき文脈では""(空文字列)として扱われます。
Null
Nullは、有効なデータを持たないことを意味し、VarTypeはVT_NULLとなります。Nullを持つVariant型のオブジェクトに対する演算の結果はほとんどの場合Nullとなります(2項演算子で片方だけがNullであった場合もそうです)。
Dim v As VARIANT v.vt = VT_NULL Dim x As Variant(v) Dim y As Variant(v) If x = y Then MessageBox(0, "True", "", MB_OK) Else MessageBox(0, "False", "", MB_OK) End If
メッセージボックスにはFalseが出力されます。これはNull同士の比較の結果がNullとなり、それをBooleanに変換するとFalseになるためです。
動作環境
全ての演算子多重定義及びImp, Eqv, Abs, Fix, Int, Round, Compareの各メソッドは、内部で呼び出しているAPI関数の動作環境がWindows 98, Windows NT 4.0 SP4以上またはDCOM95 1.2以上をインストールしたWindows 95となっています。このためこれらのメソッドも同様に動作環境の制限が付きます。
最新のDCOM95及びWindows NT 4 Service Packは次の場所から入手できます。