クラス MWStruct
MWStruct
クラスはコンパイルされたクラス メソッドとの間で Struct
型の受け渡しを行います。このクラスには以下の 7 つのプロパティ/メソッドが含まれています。
Sub Initialize([varDims], [varFieldNames])
このメソッドは特定の数とサイズの次元と特定のフィールド名のリストをもつ構造体配列を割り当てます。
パラメーター
引数 | 型 | 説明 |
---|---|---|
|
| 次元配列 (オプション) |
|
| フィールド名配列 (オプション) |
戻り値
なし。
注意
MWStruct
オブジェクトは、作成されたときには次元は 1 行 1 列で、フィールドはありません。Initialize
メソッドは配列の次元を設定し、一連の名前付きフィールドを各要素に追加します。同じオブジェクトで Initialize
を呼び出すたびに、再度次元が設定されます。varDims
引数を指定しない場合、配列の次元の既存の数とサイズは変更されません。varFieldNames
引数を指定しない場合、既存のフィールドのリストは変更されません。Initialize
を引数なしで呼び出すと配列は変更されません。
例
以下の Visual Basic® コードは Initialize
メソッドを使用した構造体配列の次元の設定を示しています。
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
プロパティは構造体配列内の次元数を返します。
Property Dims As Variant
読み取り専用 Dims
プロパティは、構造体配列の各次元のサイズを含む、長さが 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