Variantクラス

提供: AB開発Wiki
2007年8月5日 (日) 11:28時点におけるEgtra (トーク | 投稿記録)による版 (ページ Variant クラスVariantクラス へ移動: #127)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動検索に移動

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は次の場所から入手できます。