ComObjArray()
実行制御 | GUI表示 | 演算・変数 | メモリ・DLL操作 | 文字列操作 |
キーボード | マウス | シェル | ウィンドウ | ウィンドウグループ
ステータスバー | コントロール | サウンド | ファイル | INIファイル |
レジストリ | 環境変数 | AutoHotkey | その他 | 設定関係 | オブジェクト
ComObjArray() [v1.0.91+][編集]
AHKL COMで利用する SAFEARRAY を生成する。
ArrayObj := ComObjArray(VarType, Count1 [, Count2, ... Count8])
Parameters[編集]
引数名 | 説明 |
---|---|
VarType | 配列のベースとなる型(配列の各要素の型)を指定する。VARTYPEはバリアント型のサブセットでなければならない。VT_ARRAY、VT_BYREF フラグのいずれもセットできない。VT_EMPTY および VT_NULL は配列のベースの型としては有効とならない。その他の型は通常利用が可能である。
利用可能な値は、ComObjType()を参照。 |
CountN | 各次元の要素数。配列には8次元まで格納可能。 |
ArrayObj | SAFEARRAY を格納したラッパーオブジェクト。 |
Methods[編集]
配列ラッパーオブジェクトは以下のメソッドをサポートする:
Array.MaxIndex(n) | n 番目の次元の上限を返す。 n を省略時は 1 。
|
Array.MinIndex(n) | n 番目の次元の下限を返す。n を省略時は 1 。
|
Array.Clone() | [v1.0.96.00+]: 配列のコピーを返す。 |
Array._NewEnum() | [v1.0.96.00+]: 通常、スクリプトによって呼び出されることはない。Forループは Safearray を利用できる。 |
Remarks[編集]
配列ラッパーオブジェクトは、COMのメソッドや ComObjActive() の戻り値となることもある。以下のようにすることで、スクリプトで値が配列かどうかを判断することができる。
If ComObjType(obj) & 0x2000 MsgBox % "Array subtype: " . ComObjType(obj) & 0xfff Else MsgBox Not an array.
配列ラッパーオブジェクトに対して以下の操作が可能:
- 8次元までの配列要素のセット・取得が可能。
- 各次元の 最大/最小要素数を定義。
- 適切に利用すれば、ラッパーが解放される時点で自動的に元の配列は破棄される。
Arrays with up to 8 dimensions are supported.
Since SafeArrays are not designed to support multiple references, when one SafeArray is assigned to an element of another SafeArray, a separate copy is created. However, this only occurs if the wrapper object has the F_OWNVALUE flag, which indicates it is responsible for destroying the array. This flag can be removed by using ComObjFlags.
Related[編集]
ComObjType(), ComObjValue(), ComObjActive(), ComObjFlags(), Array Manipulation Functions (MSDN)
Example(s)[編集]
; Example #1: Simple usage.
arr := ComObjArray(VT_VARIANT:=12, 3)
arr[0] := "Auto"
arr[1] := "Hot"
arr[2] := "key"
Loop % arr.MaxIndex() + 1
t .= arr[[[Variables#A_Index|A_Index]]-1]
MsgBox % t
; Example #2: Multiple dimensions.
arr := ComObjArray(VT_VARIANT:=12, 3, 4); Get the number of dimensions:
dim := DllCall("oleaut32\SafeArrayGetDim", "ptr", ComObjValue(arr)); Get the bounds of each dimension:
Loop %dim% dims .= arr.MinIndex(A_Index) " .. " arr.MaxIndex(A_Index) "`n" MsgBox %dims%; Simple usage:
Loop 3 { x := A_Index-1 Loop 4 { y := A_Index-1 arr[x, y] := x * y } } MsgBox % arr[2, 3]