首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

种模块数组属性 ByRef Variant Index

2012-09-27 
类模块数组属性ByRef Variant Index设置数组属性(ByRef),其中修改了传递的参数值,为何不能够改变被传址数

类模块数组属性 ByRef Variant Index
设置数组属性(ByRef),其中修改了传递的参数值,为何不能够改变被传址数组的值
如何使类的属性既能传递给数组,又能传递给数组的一个元素?


Class1.cls

VB code
Option ExplicitPrivate B() As BytePublic Property Get mArray() As Byte()               'Optional bIndex As Variant  'If IsMissing(bIndex) Then    Let mArray = B()  'Else    'mArray = b(bIndex)  'End IfEnd PropertyRem                                                  如何既能传递数组,又能传递数组的一个元素Public Property Let mArray(ByRef vData() As Byte)    'Optional bIndex As Variant  'If IsMissing(bIndex) Then    Erase B()    Let B() = vData()  'Else    'b(bIndex) = vData(vIndex)  'End If    On Error GoTo ErrCancel:  If CStr((LBound(vData()))) <> "" Then    vData(LBound(vData())) = 123                     '测试 Byref 是否能够改变被传址数组的值  End If  Stop  Exit PropertyErrCancel:  On Error GoTo 0End PropertyPublic Property Let Test(ByRef mString As String, mStart As Long, Optional mLength As Variant, vData As String)  If IsMissing(mLength) Then    Mid(mString, mStart) = vData  Else    Mid(mString, mStart, mLength) = vData  End IfEnd PropertyPublic Property Get Test(mString As String, mStart As Long, Optional mLength As Variant) As String  If IsMissing(mLength) Then    Test = Mid(mString, mStart)  Else    Test = Mid(mString, mStart, mLength)  End IfEnd Property


Form1.frm
VB code
Option ExplicitPrivate Sub Command1_Click()  Dim Cls1 As Class1  Set Cls1 = New Class1  Dim B() As Byte  ReDim B(30) As Byte    Rem 测试1  Dim S As String  S = "abcdefg"  Cls1.Test(S, 1, 3) = "12"  Debug.Print Cls1.Test(S, 1, 3)      'Byref 起到作用  '__________________________________________  Debug.Print      Rem 测试2  B(LBound(B())) = 234  Let B() = Cls1.mArray()  On Error Resume Next  Debug.Print B(LBound(B()))         'Cause an error  ReDim B(10) As Byte  Let Cls1.mArray() = B()            'Byref 没有起到作用  Debug.Print B(LBound(B()))  StopEnd Sub


[解决办法]
对啊

只有 Property Let 类属性中才会这样 

只能用 Sub 或 Function ( ) 才有办法用 ByRef 喔


[解决办法]
Property Let 与 Functiont 和 Sub 不同之处就
1是没有返回值
2是只能用于属性表达式或Let语句的左边

也就是你示例代码中:Let Cls1.mArray() = B() 这一行,对表达式右边的数组B没有作用,也就是B不作为返回值返回你的修改...
作为参数,数组缺省就是ByRef,但属性的参数(你代码中的vData)是由赋值表达式的右边传递的,这就是与 Functiont 和 Sub 的参数不同之处...所以只能说你代码中第二个Property Let似是而非,改变的并非与属性相关的vData....
[解决办法]
你这是写的什么呀。
很简单的:

Public Property Get mArray() As Byte()
mArray = B
End Property

Public Property Let mArray(vData() As Byte) 
b=vdata
End Property

'给单个元素赋值
Public Property Let item(index as long, v as byte) 
b(index)=v
End Property

热点排行