UDT в коллекции

Программирование на Visual Basic for Applications
fanat1234
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 30.08.2011 (Вт) 21:04

UDT в коллекции

Сообщение fanat1234 » 30.08.2011 (Вт) 21:20

Уважаемые господа!

Вопрос следующий:
Создаю собственный класс. В классе одним из свойств задаю коллекцию. В соседнем модуле объявлен UDT. Проблема в том, что при попытка добавления в коллекцию элемента UDT выдается сообщение типа: Only public user defined types defined in public object modules can be used as parameters or return types for public procedures of class modules or as fields of public user defined types

Уже все перепробовал. Помогите!

Diamock
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 388
Зарегистрирован: 26.10.2009 (Пн) 4:19
Откуда: Кемерово

Re: UDT в коллекции

Сообщение Diamock » 31.08.2011 (Ср) 4:23

Только UDT объявленные в модуле, как Public, могут использоваться в качестве параметров или возвращаемого значения для Public процедур модуля класса или как поля Public UDT.
In der Beschrankung zeigt sich erst der Meister
Графоманю...

fanat1234
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 30.08.2011 (Вт) 21:04

Re: UDT в коллекции

Сообщение fanat1234 » 31.08.2011 (Ср) 13:01

Код: Выделить всё
Public Type FuckingType
    FirstFuck As Long
    SecondFuck As Long
End Type
Public ColOfFucks As New Collection

Public Sub LetsFuck()
Dim HeIs As FuckingType

HeIs.FirstFuck = "20"
HeIs.SecondFuck = "30"

ColOfFucks.Add HeIs

End Sub



Вот этот код выдает ошибку. Скажите что не так?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: UDT в коллекции

Сообщение Viper » 31.08.2011 (Ср) 18:22

fanat1234 писал(а):Вот этот код выдает ошибку. Скажите что не так?
Если код находится в классе смотри первый ответ в этой теме.
Весь мир матрица, а мы в нем потоки байтов!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: UDT в коллекции

Сообщение Хакер » 01.09.2011 (Чт) 1:56

fanat1234 писал(а):Скажите что не так?

Использовать тип можно только в том случае, если его типоописание попадёт в TLB. Необходимым условием для этого является то, что UDT публично, и класс тоже публичен.

Если хочется использовать UDT, но специфика проекта не позволяет поиметь публичный класс (например Standard EXE в VB6 не позволяет создать такой, уверен, что в VBA похожая ситуация), то проблема решается всего лишь изготовлением собственной внешней TLB-шки с описанием нужного UDT.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

fanat1234
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 30.08.2011 (Вт) 21:04

Re: UDT в коллекции

Сообщение fanat1234 » 01.09.2011 (Чт) 8:59

Хакер писал(а):
fanat1234 писал(а):Скажите что не так?

Использовать тип можно только в том случае, если его типоописание попадёт в TLB. Необходимым условием для этого является то, что UDT публично, и класс тоже публичен.

Если хочется использовать UDT, но специфика проекта не позволяет поиметь публичный класс (например Standard EXE в VB6 не позволяет создать такой, уверен, что в VBA похожая ситуация), то проблема решается всего лишь изготовлением собственной внешней TLB-шки с описанием нужного UDT.


Где почитать про изготовление TLB(TypeLibrary)? Поправьте, если неправильно расшифровал...
Последний раз редактировалось fanat1234 01.09.2011 (Чт) 10:03, всего редактировалось 1 раз.

fanat1234
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 30.08.2011 (Вт) 21:04

Re: UDT в коллекции

Сообщение fanat1234 » 01.09.2011 (Чт) 9:01

Viper писал(а):Если код находится в классе смотри первый ответ в этой теме.

Представленный код находится в модуле...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: UDT в коллекции

Сообщение Хакер » 01.09.2011 (Чт) 11:00

fanat1234 писал(а):Где почитать про изготовление TLB(TypeLibrary)?

http://ru.wikipedia.org/wiki/Type_library
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: UDT в коллекции

Сообщение alibek » 01.09.2011 (Чт) 11:12

А есть ли необходимость в UDT?
Классы со свойствами более гибки.
Lasciate ogni speranza, voi ch'entrate.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: UDT в коллекции

Сообщение Хакер » 01.09.2011 (Чт) 11:21

С классами со свойствами можно нарваться на дырявую абстракцию, заключающуюся в том, что свойство выглядит как член-поле UDT, но ведёт себя совершенно иначе, например, при передачи его ByRef оно, в отличие от поля UDT, не изменит своё значение, если внутри функции была такая попытка.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: UDT в коллекции

Сообщение alibek » 01.09.2011 (Чт) 14:14

Так надо передавать не свойство byref, а ссылку на объект.
Lasciate ogni speranza, voi ch'entrate.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: UDT в коллекции

Сообщение Хакер » 01.09.2011 (Чт) 18:02

alibek писал(а):Так надо передавать не свойство byref, а ссылку на объект.

Могут быть функции с уже зафиксированным прототипами, нотация которых или давно устоялась в проекте, или вообще не может быть изменена. И тут дело в том, что при переходе от такого UDT:
Код: Выделить всё
Type Vector
    x as Double
    y as Double
    z as Double
End Type


к такому классу:
Код: Выделить всё
Public x as Double
Public y as Double
Public z as Double

всё поменяется, хотя это совсем не очевидно.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

fanat1234
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 30.08.2011 (Вт) 21:04

Re: UDT в коллекции

Сообщение fanat1234 » 07.09.2011 (Ср) 14:27

Всем спасибо за ответы. Забил я на типы. Воспользовался классами. В моем случае, так нужно было делать с самого начала :)


Вернуться в VBA

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

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

    TopList