类 MWStruct
MWStruct 类向已编译的类方法传递 Struct 类型,或者从已编译的类方法接收 Struct 类型。此类包含七个属性/方法:
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 个索引参量。要引用数组的元素,请指定所有索引以及字段名称。 |
备注
通过此属性访问命名字段时,必须提供所请求字段的所有维度以及字段名称。此属性始终返回单个字段值,如果您提供的索引列表无效或不完整,则会生成错误索引错误。索引参量有四种基本格式:
仅限字段名称
此格式仅适用于 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 对象的副本。
参数
| 参量 | 类型 | 描述 |
|---|---|---|
|
|
| 引用未初始化的 |
返回值
无
备注
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