クラス MWStruct
MWStruct クラスはコンパイルされたクラス メソッドとの間で Struct 型の受け渡しを行います。このクラスには以下の 7 つのプロパティ/メソッドが含まれています。
Sub Initialize([varDims], [varFieldNames])
このメソッドは特定の数とサイズの次元と特定のフィールド名のリストをもつ構造体配列を割り当てます。
パラメーター
| 引数 | 型 | 説明 |
|---|---|---|
|
|
| 次元配列 (オプション) |
|
|
| フィールド名配列 (オプション) |
戻り値
なし。
注意
MWStruct オブジェクトは、作成されたときには次元は 1 行 1 列で、フィールドはありません。Initialize メソッドは配列の次元を設定し、一連の名前付きフィールドを各要素に追加します。同じオブジェクトで Initialize を呼び出すたびに、再度次元が設定されます。varDims 引数を指定しない場合、配列の次元の既存の数とサイズは変更されません。varFieldNames 引数を指定しない場合、既存のフィールドのリストは変更されません。Initialize を引数なしで呼び出すと配列は変更されません。
例
以下の Visual Basic® コードは Initialize メソッドを使用した struct 配列の次元の設定を示しています。
Sub foo ()
Dim x As MWStruct
Dim y As MWStruct
On Error Goto Handle_Error
'Create 1X1 struct arrays with no fields for x, and y
Set x = new MWStruct
Set y = new MWStruct
'Initialize x to be 2X2 with fields "red", "green",
' and "blue"
Call x.Initialize(Array(2,2), Array("red", "green", "blue"))
'Initialize y to be 1X5 with fields "name" and "age"
Call y.Initialize(5, Array("name", "age"))
'Re-dimension x to be 3X3 with the same field names
Call x.Initialize(Array(3,3))
'Add a new field to y
Call y.Initialize(, Array("name", "age", "salary"))
Exit Sub
Handle_Error:
MsgBox(Err.Description)
End Sub
Property Item([i0], [i1], ..., [i31]) As MWField
Item プロパティは MWStruct クラスの既定のプロパティです。このプロパティは構造体配列内の特定のインデックスにおけるフィールドの値の設定/取得に使用されます。
パラメーター
| 引数 | 型 | 説明 |
|---|---|---|
|
|
| インデックス引数 (オプション)。0 から 32 個のインデックス引数を入力できます。配列の要素を参照するには、フィールド名およびすべてのインデックスを指定します。 |
注意
このプロパティを介して名前付きフィールドにアクセスするときには、フィールド名および要求するフィールドのすべての次元を指定しなければなりません。このプロパティは常に単一のフィールド値を返し、無効または不完全なインデックス リストを指定すると、不適切なインデックス エラーを生成します。インデックス引数には次の 4 つの基本形式があります。
フィールド名のみ
この形式は 1 行 1 列の構造体配列の場合のみ使用でき、名前付きフィールドの値を返します。以下に例を示します。
x("red") = 0.2 x("green") = 0.4 x("blue") = 0.6この例では、
Itemプロパティの名前は省略されました。これが可能な理由は、ItemプロパティがMWStructクラスの既定のプロパティであるためです。この場合、次の 2 つのステートメントは等価です。x.Item("red") = 0.2 x("red") = 0.2単一インデックスおよびフィールド名
この形式は単一の添字表記を介して配列要素にアクセスします。フィールド名が後に続く単一の数値インデックス n は、配列を列優先の順序で線形に移動し、n 番目の配列要素の名前付きフィールドを返します。たとえば、フィールド "red"、"green" および "blue" が変数 x に格納されている 2 行 2 列の構造体配列を考えてみましょう。次の 2 つのステートメントは等価です。
y = x(2, "red") y = x(2, 1, "red")
すべてのインデックスとフィールド名
この形式は n 個のインデックスを指定することで多次元配列の配列要素にアクセスします。次のステートメントは前の例にある 4 個すべての配列要素にアクセスします。
For I From 1 To 2
For J From 1 To 2
r(I, J) = x(I, J, "red")
g(I, J) = x(I, J, "green")
b(I, J) = x(I, J, "blue")
Next
Next
インデックス配列とフィールド名
この形式ではインデックスの配列とフィールド名を渡すことで配列要素にアクセスします。次の例では、インデックス配列を使用して前の例を書き換えています。
Dim Index(1 To 2) As Integer
For I From 1 To 2
Index(1) = I
For J From 1 To 2
Index(2) = J
r(I, J) = x(Index, "red")
g(I, J) = x(Index, "green")
b(I, J) = x(Index, "blue")
Next
Next
これら 4 つの形式により、Item プロパティは構造体配列に対する非常に柔軟なインデックス操作の方法を提供します。
最後の 2 つのインデックス形式を組み合わせることができます。スカラーまたは配列形式のいずれかで指定されるいくつかのインデックス引数は、連結され 1 つのインデックス セットを形成します。次元数に到達すると連結は停止します。以下に例を示します。
Dim Index1(1 To 2) As Integer Dim Index2(1 To 2) As Integer Index1(1) = 1 Index1(2) = 1 Index2(1) = 3 Index2(2) = 2 x(Index1, Index2, 2, "red") = 0.5
最後のステートメントは次のように解釈されます。
x(1, 1, 3, 2, 2, "red") = 0.5
フィールド名はリスト内の最後のインデックスでなければなりません。次のステートメントはエラーを生成します。
y = x("blue", 1, 2)フィールド名は大文字と小文字を区別します。
Property NumberOfFields As Long
読み取り専用の NumberOfFields プロパティは構造体配列内のフィールド数を返します。
Property NumberOfDims As Long
読み取り専用の NumberOfDims プロパティは struct 配列内の次元数を返します。
Property Dims As Variant
読み取り専用 Dims プロパティは、struct 配列の各次元のサイズを含む、長さが NumberOfDims の配列を返します。
Property FieldNames As Variant
読み取り専用 FieldNames プロパティは、構造体配列の要素のフィールド名を含む、長さが NumberOfFields の配列を返します。
例
次の Visual Basic コード サンプルでは、2 次元構造体配列において、フィールド名と次元のサイズが事前に不明な場合にフィールドへのアクセス方法を示しています。
Sub foo ()
Dim x As MWStruct
Dim Dims as Variant
Dim FieldNames As Variant
On Error Goto Handle_Error
'
'... Call a method that returns an MWStruct in x
'
Dims = x.Dims
FieldNames = x.FieldNames
For I From 1 To Dims(1)
For J From 1 To Dims(2)
For K From 1 To x.NumberOfFields
y = x(I,J,FieldNames(K))
' ... Do something with y
Next
Next
Next
Exit Sub
Handle_Error:
MsgBox(Err.Description)
End Sub
Sub Clone(ppStruct As MWStruct)
MWStruct オブジェクトのコピーを作成します。
パラメーター
| 引数 | 型 | 説明 |
|---|---|---|
|
|
| コピーを受け取るために、初期化されていない |
戻り値
なし
注意
Clone は新規 MWStruct オブジェクトを割り当て、オブジェクトの内容のディープ コピーを作成します。既存のオブジェクト参照の共有コピーではなく、別のオブジェクトが必要な場合はこの関数を呼び出します。
例
次の Visual Basic の例は MWStruct オブジェクトの Clone と割り当ての違いを示しています。
Sub foo ()
Dim x1 As MWStruct
Dim x2 As MWStruct
Dim x3 As MWStruct
On Error Goto Handle_Error
Set x1 = new MWStruct
x1("name") = "John Smith"
x1("age") = 35
'Set reference of x1 to x2
Set x2 = x1
'Create new object for x3 and copy contents of x1 into it
Call x1.Clone(x3)
'x2's "age" field is
'also modified 'x3's "age" field unchanged
x1("age") = 50
.
.
.
Exit Sub
Handle_Error:
MsgBox(Err.Description)
End Sub