Страницы: 1
RSS
Доступ к коллекции собственного класса через default свойство, Доступ к элементу коллекции из класса
 
Уважаемые, здравствуйте.
Как получить элемент коллекции или словаря из класса.
Пример:
Есть классы:
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

Прошу оказать содействие.  
Изменено: Юрий М - 11.11.2022 13:34:49
 
Почитайте классическую статью http://www.cpearson.com/excel/DefaultMember.aspx
Владимир
 
Цитата
написал:
Почитайте классическую статью  http://www.cpearson.com/excel/DefaultMember.aspx
Спасибо за Ваш ответ.
При использовании атрибута возникает другая проблема.
При вызове свойства Rows из класса Table мне ожидаемо возвращается объект Rows для доступа к его методам и свойствам.
Но когда я вызываю конкретный экземпляр коллекции - Table.Rows(1), я хочу вернуть другой объект(в данном случае просто значение) и в свойстве Rows возникает ошибка '424' Object required

Для удобства, приложил файл с примером.
 
Павел,  переформулируйте и предложите новое название темы, из которого будет понятна задача - модераторы поменяют.
И не используйте кнопку цитирования для ответа.
 
Тема: Доступ к коллекции собственного класса через default свойство
 
В примере  из #5 свойство Rows объекта Table должно возвращать объект типа Rows. Однако реализация свойствo Item в объекте Rows  объект не возвращает.
Владимир
 
Цитата
написал:
о когда я вызываю конкретный экземпляр коллекции - 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 - 11.11.2022 14:11:29
 
testuser, спасибо за ваше предложение, но при такой реализации теряю возможность видеть методы и свойства объекта Rows(если пишу " Rows."  <- то нет выпадающего списка с методами). Стремлюсь к реализации как у ListObject(код не рабочий, просто как пример):
Код
    Dim testListObject As ListObject
    testListObject.ListRows (1) '- возвращается строка
    testListObject.ListRows.Add ' - могу увидеть метод в выпадающем списке
Страницы: 1
Наверх