ComboBox и объекты

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
GB826
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 312
Зарегистрирован: 04.08.2005 (Чт) 0:58
Откуда: Планета #3

ComboBox и объекты

Сообщение GB826 » 08.08.2006 (Вт) 9:34

А возможно ли как-нить исхитриться и запихнуть в List комбо ссылки на объекты, а не строки? То есть .List(.ListIndex) - будет ссылка на объект? Или в ItemData? А может есть скрытые возможности комбо?
Пора уже всем хорошим людям собраться и убить всех плохих людей.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.08.2006 (Вт) 9:50

Низя. Зато можно ObjPtr в ItemData, а оттуда с шаманскими плясками обратно вытаскивать объект.
Изображение

GB826
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 312
Зарегистрирован: 04.08.2005 (Чт) 0:58
Откуда: Планета #3

Сообщение GB826 » 08.08.2006 (Вт) 9:57

Значит можно :о)) Бугага, седня будет бессоная ночь...
2tyomitch Как я понял основная проблема в обратную сторону все вернуть... Скажите хоть куда искать? Буду очень благодарен!
Пора уже всем хорошим людям собраться и убить всех плохих людей.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 08.08.2006 (Вт) 10:27

GB826 писал(а):Скажите хоть куда искать? Буду очень благодарен!
Да, я бы с удовольствием посмотрел на такой шаманский ритуал, когда по указателю на объект в VB мы сможем обращаться к его методам и свойствам... У меня есть кой-какие мысли на этот счет, но хотелось бы сначала услышать твоего, tyomitch, мнения и совета. А тема действительно интересная.
А я все практикую лечение травами...

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

Сообщение GSerg » 08.08.2006 (Вт) 10:29

Гы гы.

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

GB826
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 312
Зарегистрирован: 04.08.2005 (Чт) 0:58
Откуда: Планета #3

Сообщение GB826 » 08.08.2006 (Вт) 10:44

Мужики, получилось :о))) Вот так, тока объясните дурачку зачем второй вызов, CopyMemory?

Код: Выделить всё
  Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
  (Destination As Any, Source As Any, ByVal Length As Long)

  Private Function ObjectFromPtr(ByVal lPtr As Long) As Object
       Dim objT As Object
       ' Bruce McKinney's code for getting an Object from the
       ' object pointer:

       CopyMemory objT, lPtr, 4
       Set ObjectFromPtr = objT
       CopyMemory objT, 0&, 4
       
   End Function

Private Sub Form_Load()
   
   
   Dim objT As Object
   Set objT = ObjectFromPtr(ObjPtr(Command1))
   objT.Enabled = False
End Sub
Пора уже всем хорошим людям собраться и убить всех плохих людей.

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

Сообщение GSerg » 08.08.2006 (Вт) 10:47

Затем, что всё, что ты скопировал в объектную переменную, ты же и должен обнулить. А всё, что присвоил через set - не должен.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение Viper » 08.08.2006 (Вт) 10:51

Примерно так:

Код: Выделить всё
Dim MyClass1 As New CMyClass
Dim MyClass2 As New CMyClass
CopyMemory ObjPtr(MyClass2), ObjPtr(MyClass1),4


И с этого места MyCLass2 полная копия MyClass1.
Весь мир матрица, а мы в нем потоки байтов!

GB826
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 312
Зарегистрирован: 04.08.2005 (Чт) 0:58
Откуда: Планета #3

Сообщение GB826 » 08.08.2006 (Вт) 10:51

GSerg
Понятненько, спасибо за ликбез.


http://www.vbaccelerator.com/home/VB/Code/Techniques/Dealing_with_Circular_References/article.asp

Отсюда взял, а ссылку нашел на на этом форуме. :о)) Нет, я щаз напьюсь от счастья...

ЗЫ Скажите про минусы этого метода, кто может.
Пора уже всем хорошим людям собраться и убить всех плохих людей.

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

Сообщение Viper » 08.08.2006 (Вт) 10:58

Главное в этой методе не забыть обнулить объект. Ибо самостоятельно он не удалится поскольку не является ссылкой, и, соответственно, механизм подсчета ссылок в данном случае не сработает.
Весь мир матрица, а мы в нем потоки байтов!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.08.2006 (Вт) 11:00

GSerg писал(а):Да собственно, искать в сторону единственного вызова GetMem4.

GetMemObj лучше. После него не нужно обнулять руками, т.к. он сам вызывает AddRef.
Последний раз редактировалось tyomitch 08.08.2006 (Вт) 11:02, всего редактировалось 1 раз.
Изображение

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

Сообщение GSerg » 08.08.2006 (Вт) 11:00

!Viper! писал(а):Ибо самостоятельно он не удалится поскольку не является ссылкой, и, соответственно, механизм подсчета ссылок в данном случае не сработает.

Он очень даже является ссылкой, и прекрасно удалится, если его оставить. Просто тогда количество удалений объекта будет больше на 1, чем надо.

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

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.08.2006 (Вт) 11:04

Ещё раз замечу, что при использовании GetMemObj весь код ObjectFromPtr вырождается в одну строчку.
Изображение

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

Сообщение Viper » 08.08.2006 (Вт) 11:08

GSerg писал(а):Он очень даже является ссылкой, и прекрасно удалится, если его оставить. Просто тогда количество удалений объекта будет больше на 1, чем надо.

А если ты про переменную типа long, то её тем более не надо обнулять.


Переменную типа Long естественн обнулять не надо, а вот с таким образом сотворенным объектом могут на мой взгляд произойти неприятности, если его не обнулить.

Попробую поискать пример кода, где без обнуления все слетало напрочь.
З.Ы. Только давно это было, могу и не найти
Весь мир матрица, а мы в нем потоки байтов!

GB826
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 312
Зарегистрирован: 04.08.2005 (Чт) 0:58
Откуда: Планета #3

Сообщение GB826 » 08.08.2006 (Вт) 11:11

!Viper!
А не надо искать, закомментировал я строку с обнулением и упал даже VB.
tyomitch Щаз попробую GetMemObj
Пора уже всем хорошим людям собраться и убить всех плохих людей.

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

Сообщение GSerg » 08.08.2006 (Вт) 11:11

GSerg писал(а):Просто тогда количество удалений объекта будет больше на 1, чем надо.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GB826
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 312
Зарегистрирован: 04.08.2005 (Чт) 0:58
Откуда: Планета #3

Сообщение GB826 » 08.08.2006 (Вт) 11:16

Падает VB
Код: Выделить всё
Private Declare Sub CopyObject Lib "MSVBVM60.DLL" Alias "GetMemObj" _
  (ByVal Source As Long, Dest As Object)
Private Sub Form_Load()
   
   
   Dim objT As Object
   CopyObject ObjPtr(Command1), objT
   objT.Move 0, 0
End Sub
Пора уже всем хорошим людям собраться и убить всех плохих людей.

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

Сообщение Viper » 08.08.2006 (Вт) 11:29

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

GB826
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 312
Зарегистрирован: 04.08.2005 (Чт) 0:58
Откуда: Планета #3

Сообщение GB826 » 08.08.2006 (Вт) 11:31

!Viper!
http://bbs.vbstreets.ru/viewtopic.php?p=44536
Объявление взял отсюда, и из кода видно, что не перепутал...
Падает на вызове CopyObject...
Пора уже всем хорошим людям собраться и убить всех плохих людей.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.08.2006 (Вт) 12:02

GB826, убери из объявления ByVal -- заработает.
Изображение

GB826
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 312
Зарегистрирован: 04.08.2005 (Чт) 0:58
Откуда: Планета #3

Сообщение GB826 » 08.08.2006 (Вт) 12:41

2tyomitch
Угу, теперь вообще блеск, СПАСИБО! :о)) Только почему там объява с байвалом?
Пора уже всем хорошим людям собраться и убить всех плохих людей.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.08.2006 (Вт) 12:54

Потому что там ожидают получить не ObjPtr(obj), а VarPtr(obj).
Только не вздумай исправлять в своём коде ObjPtr на VarPtr ;-)
Изображение


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

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

Сейчас этот форум просматривают: Yandex-бот и гости: 38

    TopList