主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

类 MWStruct

MWStruct 类向已编译的类方法传递 Struct 类型,或者从已编译的类方法接收 Struct 类型。此类包含七个属性/方法:

Sub Initialize([varDims], [varFieldNames])

该方法分配一个具有指定数量和大小的维数以及指定的字段名称列表的结构体数组。

参数

参量类型描述

varDims

Variant

可选维度数组

varFieldNames

Variant

可选的字段名称数组

返回值

无。

备注

创建后,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 类的默认属性。此属性用于设置/获取结构体数组中特定索引处的字段的值。

参数

参量类型描述

i0,i1, ..., i31

Variant

可选的索引参量。可以输入 0 到 32 个索引参量。要引用数组的元素,请指定所有索引以及字段名称。

备注

通过此属性访问命名字段时,必须提供所请求字段的所有维度以及字段名称。此属性始终返回单个字段值,如果您提供的索引列表无效或不完整,则会生成错误索引错误。索引参量有四种基本格式:

  • 仅限字段名称

    此格式仅适用于 1×1 结构体数组的情况,并返回命名字段的值。例如:

    x("red") = 0.2
    x("green") = 0.4
    x("blue") = 0.6
    

    在此示例中,Item 属性的名称被忽略了。这是可能的,因为 Item 属性是 MWStruct 类的默认属性。在这种情况下,这两个语句是等效的:

    x.Item("red") = 0.2
    x("red") = 0.2
    
  • 单个索引和字段名称

此格式通过单个下标符号访问数组元素。单个数字索引 n 后跟字段名称,返回第 n 个数组元素上的命名字段,按列主顺序线性导航数组。例如,考虑一个 2×2 的结构体数组,其中字段 "red""green""blue" 存储在变量 x 中。这两个语句是等效的:

y = x(2, "red")
y = x(2, 1, "red")
  • 所有索引和字段名称

此格式通过指定 n 索引来访问多维数组的数组元素。这些语句访问上例中数组的所有四个元素:

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

通过这四种格式,Item 属性为结构体数组提供了非常灵活的索引机制。

  • 您可以组合最后两种索引格式。以标量或数组格式提供的几个索引参量被连接起来形成一个索引集。当达到维数时,合并就会停止。例如:

    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 代码示例说明在事先不知道字段名称和维度大小的情况下如何访问二维结构体数组的字段。

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 示例说明了 Clone 对象的赋值和 MWStruct 之间的区别。

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