我正在为传出消息设计一个动态缓冲区。数据结构采用具有字节数组缓冲区作为成员的节点队列的形式。不幸的是,在 VBA 中,数组不能是类的公共成员。
例如,这是一个禁忌,不会编译:
'clsTest
Public Buffer() As Byte
您将收到以下错误:“常量、固定长度字符串、数组、用户定义类型和 Declare 语句不允许作为对象模块的公共成员”
好吧,没关系,我只需将其设为具有公共属性访问器的私有成员...
'clsTest
Private m_Buffer() As Byte
Public Property Let Buffer(buf() As Byte)
m_Buffer = buf
End Property
Public Property Get Buffer() As Byte()
Buffer = m_Buffer
End Property
...然后在模块中进行一些测试以确保其正常工作:
'mdlMain
Public Sub Main()
Dim buf() As Byte
ReDim buf(0 To 4)
buf(0) = 1
buf(1) = 2
buf(2) = 3
buf(3) = 4
Dim oBuffer As clsTest
Set oBuffer = New clsTest
'Test #1, the assignment
oBuffer.Buffer = buf 'Success!
'Test #2, get the value of an index in the array
' Debug.Print oBuffer.Buffer(2) 'Fail
Debug.Print oBuffer.Buffer()(2) 'Success! This is from GSerg's comment
'Test #3, change the value of an index in the array and verify that it is actually modified
oBuffer.Buffer()(2) = 27
Debug.Print oBuffer.Buffer()(2) 'Fail, diplays "3" in the immediate window
End Sub
测试#1 工作正常,但测试 #2 中断,Buffer
突出显示,并且错误消息是“参数数量错误或属性分配无效”
测试 #2 现在有效!GSerg指出,为了Property Get Buffer()
正确调用并引用缓冲区中的特定索引, 需要两组括号:oBuffer.Buffer()(2)
测试#3 失败 - 原始值 3 打印到立即窗口。GSerg 在他的评论中指出,Public Property Get Buffer()
只返回一个副本而不是实际的类成员数组,因此修改会丢失。
如何解决第三个问题,使类成员数组按预期工作?
(我应该澄清一般问题是“VBA 不允许数组成为类的公共成员。我怎样才能解决这个问题,让一个类的数组成员表现得好像它用于所有实际目的,包括:# 1 分配数组,#2 从数组中获取值,#3 在数组中分配值,#4 直接在调用中使用数组CopyMemory
(#3 和#4 几乎等效)?)”