Не перечисляются элементы коллекции

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Не перечисляются элементы коллекции

Сообщение GSerg » 16.05.2003 (Пт) 14:29

Мне нужно триангуляцию Делоне провести, и ещё фишки всякие потом... Сделал два класса - Point и Edge (соответственно отчка данных и ребро треугольника). На основе этих классов при помощи Class Builder создал коллекции Points и Edges. Всё прекрасно, только вот коллекция Points работает через For Each, а Edges выдаёт ошибку на строке For Each drawEdge in myEdges: мол, объект не поддерживает метод/свойство... Фигня очень странная... Property NewEnum создана КлассБилдером, в Points работает, а здесь вот такая гадость. Вот кусок кода:

REBRO - это User Type
Ошибка на второй строке от 'LAST STEP
myPoints заполнена точками, там всё правильно, проверял
Рёбра в коллекцию добавляются.
Код: Выделить всё
Private Sub Delonay()
  'Draws Delonay triangles
  Dim tmpEdge As REBRO, drawEdge As Edge
 
  'STEP 1 ================
  'Choose any point and draw first edge to closest point
  Set myEdges = Nothing
  Set myEdges = New Edges
  Set myEdges.AssocPoints = myPoints
  tmpEdge.StartID = 1 'just take first point in collection
  tmpEdge.ID = 1    'edge unique ID
  tmpEdge.EndID = myPoints.ClosestPoint(1)
  tmpEdge.State = Active
  myEdges.Add tmpEdge
 
  'ЗДЕСЬ ДОЛЖЕН БЫТЬ КОД, НО ЕГО ОТСУТСТВИЕ СЕЙЧАС НЕ ПРИНЦИПИАЛЬНО
  'ЭТОТ КОД ТОЛЬКО ДОБАВЛЯЕТ РЕБРА В КОЛЛЕКЦИЮ EDGES
 
 
  'LAST STEP =============
  'Draw all of edges
  For Each drawEdge In myEdges
    IsoPic.Line (myPoints(CStr(drawEdge.StartID)).X, myPoints(CStr(drawEdge.StartID)).Y)-(myPoints(CStr(drawEdge.EndID)).X, myPoints(CStr(drawEdge.EndID)).Y)
  Next
End Sub




Большой Зелёный Смайл тому, кто знает, в чём фишка :(
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 16.05.2003 (Пт) 15:11

В классе Edges выбери меню Tools/Procedure Attributes...
В появившемся окне выбери в DropDown "Name" имя NewEnum
Наступи на "Advanced>>"
"Procedure Id" установи в -4
В Attributes отметь checkbox "Hide this member"
Наступай на "OK"
Проверь, напиши что получилось

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 16.05.2003 (Пт) 16:14

Ага! Не могу не поделиться своим знанием, почему именно -4.
Это значение COM-константы DISPID_NEWENUM. Без нее VB считает, что For Each коллекцией не поддерживается, о чем и сообщает.

И VB-программерам приходится помнить это значение наизусть :lol:

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

Сообщение GSerg » 17.05.2003 (Сб) 8:00

:shock: :shock: :shock:

2 skiperski: :mrgreen:
2 Rainbow: :mrgreen:


Челы, вы лучшие! Никогда бы не догадался!
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 07.08.2003 (Чт) 19:44

Rainbow писал(а):И VB-программерам приходится помнить это значение наизусть :lol:


Хе-хе, и не только VB :). Часто в разных SDK встречалось, что DISPID_NEWENUM не объявляют. И что за дискриминация?
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 07.08.2003 (Чт) 20:27

gaidar писал(а):
Rainbow писал(а):И VB-программерам приходится помнить это значение наизусть :lol:


Хе-хе, и не только VB :). Часто в разных SDK встречалось, что DISPID_NEWENUM не объявляют. И что за дискриминация?


Шо це, таке? :lol:
DISPID_NEWENUM в смысле... :shock:
Там явно пост удалили:)
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

GoGosha
Постоялец
Постоялец
 
Сообщения: 642
Зарегистрирован: 02.08.2002 (Пт) 9:14
Откуда: Russia

Сообщение GoGosha » 07.08.2003 (Чт) 20:48

Короче минус четвёртая процедура обычно так выглядит


Код: Выделить всё
Function NewEnum() As IUnknown
    Set NewEnum = colObject.[_NewEnum]
End Function


P.S. Код я скопировал из какогото класса, А -4 я правдп наизусть помню :D
http://poetry.mooo.com
http://poetry.myboard.info
«Человек есть нечто, что до́лжно превзойти» (Ф. Ницше)


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

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

Сейчас этот форум просматривают: PetalBot и гости: 4

    TopList