从模块访问公共变体数组
Posted
技术标签:
【中文标题】从模块访问公共变体数组【英文标题】:Accessing Public Variant Array from Module 【发布时间】:2014-11-10 12:12:58 【问题描述】:假设我在 Visual Basic 6 项目中有两个文件 Form1.frm 和 Module1.bas。
Form1.frm:
Public myArray As Variant
Private Sub Form_Load()
ReDim myArray(2)
Call PopulateArrays
End Sub
模块1.bas:
Public Sub PopulateArrays()
Form1.myArray(0) = Array(1, 2, 3)
Form1.myArray(1) = Array(4, 5, 6)
Form1.myArray(2) = Array(7, 8, 9)
End Sub
问题是一旦代码运行,'myArray' 仍然是空的。 如果我将 PopulateArrays Sub 放在主 Form1.frm 中,则数组会填充。 有什么想法吗?
【问题讨论】:
代码是否只发布了不起作用的变体? 通常在表单中有公共数组时会出现问题,“...数组,...不允许作为对象模块的公共成员”。我很惊讶你没有遇到它。既然这应该是个问题,或许可以尝试将数组移动到模块中。 【参考方案1】:我看到您使用了一种解决方法来让您的 Form1 保存一个公共数组。但是,我认为更好的解决方案是:(A) 将数组移动到模块并使其公开 (B) 为其创建 accessor/mutator functions。
如果您不同时保留多个表单实例,那么 (A) 是最简单的解决方案。
这是我为 (A) 测试的代码, 表格:
Private Sub UserForm_Initialize()
Call PopulateArrays
Call displayArray
End Sub
Private Sub displayArray()
Dim v1 As Variant
Dim s As String
For Each v1 In myArray
s = s + Join(v1, ", ") + vbNewLine
Next v1
MsgBox s
End Sub
模块:
Dim form1 As UserForm1
Public myArray As Variant
Public Sub start()
Set form1 = New UserForm1
End Sub
Public Sub PopulateArrays()
ReDim myArray(2)
myArray(0) = Array(1, 2, 3)
myArray(1) = Array(4, 5, 6)
myArray(2) = Array(7, 8, 9)
End Sub
【讨论】:
【参考方案2】:有些东西你不能在对象模块中声明(用户窗体只是特殊的对象模块),其中之一是数组。如果你声明了
Public myArray() As Variant
然后你会得到一个编译错误,它说的很多并且会知道。但是由于您声明为 Variant,编译器没有抱怨,但赋值不起作用。
一种选择是使 Variant 数组私有并使用属性语句(这是 VBA,但对于 VB6 应该相同)。在用户表单中
Private mmyArray() As Variant
Public Property Get myArray() As Variant
myArray = mmyArray
End Property
Public Property Let myArray(lmyArray As Variant)
mmyArray = lmyArray
End Property
Private Sub UserForm_Click()
MsgBox Join(Me.myArray(0), "_")
End Sub
Private Sub UserForm_Initialize()
ReDim mmyArray(2)
PopulateArrays
End Sub
在标准模块中
Public Sub PopulateArrays()
Dim ar(0 To 2) As Variant
ar(0) = Array(1, 2, 3)
UserForm1.myArray = ar
End Sub
【讨论】:
以上是关于从模块访问公共变体数组的主要内容,如果未能解决你的问题,请参考以下文章
如何在 javascript 中访问多维 PHP 数组作为 json 编码的变体?