Main Content

クラス MWStruct

MWStruct クラスはコンパイルされたクラス メソッドとの間で Struct 型の受け渡しを行います。このクラスには以下の 7 つのプロパティ/メソッドが含まれています。

Sub Initialize([varDims], [varFieldNames])

このメソッドは特定の数とサイズの次元と特定のフィールド名のリストをもつ構造体配列を割り当てます。

パラメーター

引数説明

varDims

Variant

次元配列 (オプション)

varFieldNames

Variant

フィールド名配列 (オプション)

戻り値

なし。

注意

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 クラスの既定のプロパティです。このプロパティは構造体配列内の特定のインデックスにおけるフィールドの値の設定/取得に使用されます。

パラメーター

引数説明

i0,i1, ..., i31

Variant

インデックス引数 (オプション)。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 オブジェクトのコピーを作成します。

パラメーター

引数説明

ppStruct

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