Collection из своего типа

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Tolking
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 01.08.2005 (Пн) 14:27

Collection из своего типа

Сообщение Tolking » 01.08.2005 (Пн) 14:39

Прошу прощения за вопрос, который описан везде, где только можно, но я туплю:

в Declarations пишу

Код: Выделить всё
Private Type client
id As Long
End Type

Dim cnnct As New Collection


в srv_ConnectionRequest
Код: Выделить всё
  Dim cln As client
  cln.id = requestID
  cnnct.Add cln, requestID


Выдается ошибка: 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

Я же не пытаюсь передавать и возвращать UDT как параметр :(

Спасибо за внимание.

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

Сообщение GSerg » 01.08.2005 (Пн) 14:43

А, по-твоему, Add - не метод, а cln - не параметр? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Tolking
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 01.08.2005 (Пн) 14:27

Сообщение Tolking » 01.08.2005 (Пн) 15:09

:) Логично...

Хорошо... Вынес тип в модуль обозвал его пабликом, там же создал колекцию. Ошибка, та же :(

В колекцию можно собирать UDT или только числа, строки, классы?

И строку
Код: Выделить всё
Dim cln As client
Я вывел опытным путем это правильно? Или есть другой способ создания переменной пользовательского типа?

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

Сообщение Viper » 01.08.2005 (Пн) 15:25

Собственно проблема здесь в том, что коллекции хранят свои элементы в виде типа Variant, а тип Variant не может хранить в себе определенные пользователем типы. Так что вместо UDT юзай класс и будет тебе счастье
Весь мир матрица, а мы в нем потоки байтов!

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

Сообщение GSerg » 01.08.2005 (Пн) 15:32

Variant может хранить в себе что угодно.
Просто для UDT надо, чтобы у него был GUID. А GUID у него появится, если объявить этот UDT как публичный в ActiveX dll или ActiveX exe.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение Viper » 01.08.2005 (Пн) 15:36

Ну да, или так.
Весь мир матрица, а мы в нем потоки байтов!

Tolking
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 01.08.2005 (Пн) 14:27

Сообщение Tolking » 01.08.2005 (Пн) 15:37

Ясно... Спасибо.

Еще вопрос: как VarPtr() обратно в переменную привратить? Типа память копировать?

Tolking
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 01.08.2005 (Пн) 14:27

Сообщение Tolking » 01.08.2005 (Пн) 15:39

GSerg писал(а):А GUID у него появится, если объявить этот UDT как публичный в ActiveX dll или ActiveX exe.


Можно подробнее для таких как я? :)

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

Сообщение GSerg » 01.08.2005 (Пн) 15:41

New project - ActiveX Dll
Объявить public type в модуле класса.
Тогда он передастся в коллекцию.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Tolking
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 01.08.2005 (Пн) 14:27

Сообщение Tolking » 01.08.2005 (Пн) 15:46

Спасибо.

Faust
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 649
Зарегистрирован: 29.12.2003 (Пн) 13:38
Откуда: лаборатория

Сообщение Faust » 03.08.2005 (Ср) 11:52

Tolking писал(а):Еще вопрос: как VarPtr() обратно в переменную привратить? Типа память копировать?

Есть такая полезная API-функция, как RtlMoveMemory. Оч-чень много зависит от того, как ее объявить. К примеру:
Код: Выделить всё

Private Declare Sub StrToStr Lib "kernel32" Alias "RtlMoveMemory" (Dst As Any, Src As Any, ByVal ByteLen As Long)
Private Declare Sub PtrToStr Lib "kernel32" Alias "RtlMoveMemory" (Dst As Any, ByVal pSrc As Long, ByVal ByteLen As Long)
Private Declare Sub StrToPtr Lib "kernel32" Alias "RtlMoveMemory" (ByVal pDst As Long, Src As Any, ByVal ByteLen As Long)
Private Declare Sub PtrToPtr Lib "kernel32" Alias "RtlMoveMemory" (byVal pDst As Long, byVal pSrc As Long, ByVal ByteLen As Long)

Private Type Vec2
  x as single
  y as single
End Type
Const memVec2Len=8

Private Sub Main()
Dim v As vec2,pv as long,w as vec2, pw as long
pv=VarPtr(v)
pw=VarPtr(w)
v.x=1
v.y=2
StrToStr w,v,memVec2Len
Debug.Print w.x, w.y
v.x=3
v.y=4
PtrToStr w,pv,memVec2Len
Debug.Print w.x, w.y
v.x=5
v.y=6
StrToPtr pw,v,memVec2Len
Debug.Print w.x, w.y
v.x=7
v.y=8
PtrToPtr pw,pv,memVec2Len
Debug.Print w.x, w.y
End Sub

ЗЫ. Ежели ничего не слажал, то должно работать...
ЗЗЫ. :shock: А почему это буквосочетание pv так подозрительно выделено подстветкой синтаксиса???
Листинги не горят!


Вернуться в Visual Basic 1–6

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

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

    TopList