2014-11-23 4 views
0

Может ли кто-нибудь объяснить, почему я получаю эту ошибку в строке 12? Это явно массив. Почему я не могу получить значение в позиции индекса 0 таким образом? Мне действительно нужна эта дополнительная переменная (arr)?Неверное количество аргументов или недопустимое присвоение свойств с использованием классов

Option Explicit 

Dim obj 
Set obj = new ClsTest 

obj.singleval = "test" 
MsgBox obj.singleval      ' test 

obj.repeatingval = split ("a,b,c", ",") 
MsgBox IsArray(obj.repeatingval)   ' true 
MsgBox UBound(obj.repeatingval)   ' 2 
MsgBox obj.repeatingval(0)    ' Wrong number of arguments or invalid 
             ' property assignment: 'repeatingval' 
Dim arr : arr = obj.repeatingval 
MsgBox IsArray(arr)      ' true 
MsgBox UBound(arr)      ' 2 
MsgBox arr(0)       ' a 

Class ClsTest 
    Private m_singleval 
    Private m_repeatingval 

    Public Property Get singleval() 
     singleval = m_singleval 
    End Property 

    Public Property Let singleval(w) 
     m_singleval = w 
    End Property 

    Public Property Get repeatingval() 
     repeatingval = m_repeatingval 
    End Property 

    Public Property Let repeatingval(w) 
     m_repeatingval = w 
    End Property 
End Class 

ответ

0

Если вы хотите, чтобы индексированный доступ к свойству (array) repeatingval, вам нужно изменить определение свойства, чтобы включить индекс. Остерегайтесь, однако, что геттер и сеттер должны быть определены так:

Class ClsTest 
    ... 
    Public Property Get repeatingval(i) 
     repeatingval = m_repeatingval(i) 
    End Property 

    Public Property Let repeatingval(i, w) 
     m_repeatingval(i) = w 
    End Property 
End Class 

Вы не можете иметь свойство где сеттер принимает массив и геттер возвращает элемент массива. Чтобы иметь возможность назначать массив и извлекать элемент из этого массива, вам нужны два разных свойства:

Class ClsTest 
    ... 
    Public Property Get repeatingval(i) 
     repeatingval = m_repeatingval(i) 
    End Property 

    Public Property Let repeatingval(i, w) 
     m_repeatingval(i) = w 
    End Property 

    Public Property Get repeatingarr 
     repeatingval = m_repeatingval 
    End Property 

    Public Property Let repeatingarr(w) 
     m_repeatingval = w 
    End Property 
End Class 

Set obj = New ClsTest 

obj.repeatingarr = Split("a,b,c", ",") 
MsgBox IsArray(obj.repeatingarr) 
MsgBox UBound(obj.repeatingarr) 
MsgBox obj.repeatingval(0) 
0
Dim thing 
For Each thing in obj.repeatingval 
    msgbox thing 
Next 

Это даст вам доступ к нему.

Смежные вопросы

 Смежные вопросы