ComObjArray()

提供: AutoHotkey Wiki
移動: 案内検索

実行制御 | 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]