Уважаемые, здравствуйте. Как получить элемент коллекции или словаря из класса. Пример: Есть классы: Table
Код
Option Explicit
Private obgRows As Rows
Public Property Get Rows(Optional Index As Long) As Rows
Set Rows = obgRows
End Property
Public Property Let Rows(Optional Index As Long, rows_ As Rows)
Set obgRows = rows_
End Property
Private Sub Class_Initialize()
Set obgRows = New Rows
End Sub
Rows
Код
Option Explicit
Private Coll_ As New Collection
Public Property Get Item(Index_ As Long) As Long
Index = Coll_(CStr(Index_))
End Property
Public Function Add(Index_ As Long)
Coll_.Add Index_, CStr(Index_)
End Function
Модуль с процедурой
Код
Sub test()
Dim cl As New Table
Dim value As Variant
Call cl.Rows.Add(1)
Call cl.Rows.Add(2)
value = cl.Rows.Item(1)
End Sub
Сейчас я получаю значение из коллекции в классе Rows через свойство Item. А хотелось бы получать нужный item напрямую из Rows: value = cl.Rows(1)
Пробовал решить задачу через атрибут(разместил его в Item) но проблема в том, что в свойство item не приходит значение. Например: cl.Rows(1) -> в Table.Rows Index=1, затем переходим в Rows.Item. а здесь уже Index=0
Спасибо за Ваш ответ. При использовании атрибута возникает другая проблема. При вызове свойства Rows из класса Table мне ожидаемо возвращается объект Rows для доступа к его методам и свойствам. Но когда я вызываю конкретный экземпляр коллекции - Table.Rows(1), я хочу вернуть другой объект(в данном случае просто значение) и в свойстве Rows возникает ошибка '424' Object required
Павел, переформулируйте и предложите новое название темы, из которого будет понятна задача - модераторы поменяют. И не используйте кнопку цитирования для ответа.
написал: о когда я вызываю конкретный экземпляр коллекции - Table.Rows(1), я хочу вернуть другой объект(в данном случае просто значение) и в свойстве Rows возникает ошибка '424' Object required
Функция Property Get в обоих классах мжет возвращать либо объект либо значение, поэтому нужна проверка в обоих классах что/как возвращать
Код
Public Property Get Rows(Optional value As Variant = 0) 'As Rows
If value = 0 Then
Set Rows = obgRows
Else
If IsObject(obgRows(value)) Then
Set Rows = obgRows(value)
Else
Rows = obgRows(value)
End If
End If
End Property
testuser, спасибо за ваше предложение, но при такой реализации теряю возможность видеть методы и свойства объекта Rows(если пишу " Rows." <- то нет выпадающего списка с методами). Стремлюсь к реализации как у ListObject(код не рабочий, просто как пример):
Код
Dim testListObject As ListObject
testListObject.ListRows (1) '- возвращается строка
testListObject.ListRows.Add ' - могу увидеть метод в выпадающем списке