Проблема доступа к Default Property в VB6

Для неординарных вопросов. Если вы опытный программист, попавший в трудную ситуацию, — вам сюда.

Модератор: gaidar

Правила форума
Этот раздел не предназначен для того, чтобы вы адресовали свою проблему профессионалам.
Этот раздел предназначен для профессионалов, которые столкнулись с проблемой и не могут решить ее самостоятельно.
Если вы считаете себя профессионалом, а свою проблему сложной — вам сюда.
Если модератор посчитает, что вы ошиблись, то на первый раз он перенесет ваше сообщение в основной раздел без последствий для автора. Во второй раз тема будет закрыта, а автору будет выписано нарушение. В третий раз автор будет забанен.
uncle_gm
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 27.02.2007 (Вт) 18:31

Проблема доступа к Default Property в VB6

Сообщение uncle_gm » 27.02.2007 (Вт) 18:43

Пусть имеется класс (например, ArrayClass), полем которого является массив:


Код: Выделить всё
Private mArr(24, 24) As Boolean

Public Property Get Arr(x As Byte, y As Byte) As Variant
Arr = mArr(x, y)
End Property

Public Property Let Arr(x As Byte, y As Byte, ByVal vNewValue As Variant)
Let mArr(x, y) = vNewValue
End Property


Причем, свойство Arr - Default Property

Тогда код,типа :

Код: Выделить всё
Dim tmp As New ArrayClass

tmp(0, 0) = True
tmp(1, 1) = True

Debug.Print "tmp(0, 0) =" & tmp(0, 0)
Debug.Print "tmp(1, 1) =" & tmp(1, 1)


работает без проблем. Т.е. без проблем производится присвоение и чтение элементов массива посредством Default Property - Arr.

Если же мы включаем ArrayClass в качестве поля данных в другой класс, например(ContClass):

Код: Выделить всё
Public mArrayClass As New ArrayClass


то попытка присвоения, типа:

Код: Выделить всё
Dim tmp As New ContClass

tmp.mArrayClass(0, 0) = True


вызывает ошибку времени во время исполнения "Wrong number of arguments or invalid property assignment".

Хотя чтение происходит без проблем:

Код: Выделить всё
debug.print "tmp.mArrayClass(0, 0)=" & tmp.mArrayClass(0, 0)


Проблема решается путем явного указания свойства:

Код: Выделить всё
tmp.mArrayClass.Arr(0, 0) = True


Но код при этом теряеи свою читабельность.

Это особенно заметно при большем уровне вложенности классов.

Кто-нибудь может подсказать способ решения данной проблемы?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 27.02.2007 (Вт) 19:40

Код: Выделить всё
Let mArr(x, y) = vNewValue

:shock:
Я думал, столь крепко держащихся за прошлое нет :roll:

Не знаю, стоит ли оставлять подобный вопрос в этом разделе :roll:
Ладно, пусть будет, хотя конечно да :neutral:
Сделай в своём ContClass
Код: Выделить всё
Private mArrayClass As New ArrayClass

Public Property Get ArrayClass() As ArrayClass
  Set ArrayClass = mArrayClass
End Property
и пометь её как default.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

uncle_gm
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 27.02.2007 (Вт) 18:31

Сообщение uncle_gm » 28.02.2007 (Ср) 11:00

Оно бы конечно так, но если ContClass содержит несколько полей, аналогичных, ArrayClass, то где взять столько Default Properties ? :).

На счет Let - проглотил. Понравилось.

Взялся он в коде после автоматической замены Set. Естественно ведь было попробовать, сохраняется ли проблема при использовании Property Set вместо Property Let ...
Так вот: проблема сохраняется...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.02.2007 (Ср) 11:23

uncle_gm писал(а):Оно бы конечно так, но если ContClass содержит несколько полей, аналогичных, ArrayClass, то где взять столько Default Properties ? :)

Аздиваисси, али как?
Вообще не назначай дефолтов тогда :roll:
ContClass
Код: Выделить всё
Option Explicit

Private mArrayClass1 As New ArrayClass
Private mArrayClass2 As New ArrayClass
Private mArrayClass3 As New ArrayClass

Public Property Get Foo1() As ArrayClass
  Set Foo1 = mArrayClass1
End Property

Public Property Get Foo2() As ArrayClass
  Set Foo2 = mArrayClass2
End Property

Public Property Get Foo3() As ArrayClass
  Set Foo3 = mArrayClass3
End Property


Код: Выделить всё
Private Sub Form_Load()
  Dim c As New ContClass
 
  c.Foo1(4, 4) = True
  c.Foo2(5, 5) = True
  c.Foo3(6, 6) = True
 
  MsgBox c.Foo1(4, 4)
  MsgBox c.Foo2(5, 5)
  MsgBox c.Foo3(6, 6)
 
End Sub



uncle_gm писал(а):Естественно ведь было попробовать, сохраняется ли проблема при использовании Property Set вместо Property Let ...

Неееет, совершенно не естественно было попробовать Set для boolean... Это, однако, извращение...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

uncle_gm
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 27.02.2007 (Вт) 18:31

Сообщение uncle_gm » 01.03.2007 (Чт) 22:26

Да, действительно, если пользоваться свойствами во включаюжщем классе, то все работает.

Спасибо за совет.


Вернуться в Раздел для Профессионалов

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

    TopList