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

类模块数组属性 ByRef Variant Index,该如何解决

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

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


Class1.cls

Option Explicit

Private B() As Byte

Public Property Get mArray() As Byte()               'Optional bIndex As Variant
  'If IsMissing(bIndex) Then
    Let mArray = B()
  'Else
    'mArray = b(bIndex)
  'End If
End Property

Rem                                                  如何既能传递数组,又能传递数组的一个元素
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 Property
ErrCancel:
  On Error GoTo 0
End Property


Public 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 If
End Property

Public 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 If
End Property


Form1.frm
Option Explicit

Private 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()))
  Stop
End 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

热点排行