Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сохранить объект в TAG / 11 сообщений из 11, страница 1 из 1
06.10.2014, 14:59
    #38767942
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранить объект в TAG
Вот так не работает:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
'КЛАСС VB_PictureBox
Option Explicit
Public WithEvents Ctrl As VB.PictureBox
Public Index As Long

Private Sub Ctrl_Click()
  MsgBox "hwnd=" & Ctrl.hWnd
End Sub
 



Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Option Explicit
Private Sub Form_Load()
         Dim VB_PictureBox1 As New VB_PictureBox
         Set VB_PictureBox1.Ctrl = Form1.Controls.Add("VB.PictureBox", "pic1")
         Set VB_PictureBox1.Ctrl.Tag = VB_PictureBox1   '<---- ошибка
           
End Sub



Ссылку запомнить можно:
Код: vbnet
1.
VB_PictureBox1.Ctrl.Tag = ObjPtr(VB_PictureBox1)   



И потом восстановить объект:
Код: vbnet
1.
2.
Dim VB_PictureBox2 As VB_PictureBox
CopyMemory VB_PictureBox2, CLng(VB_PictureBox1.Ctrl.Tag), 4




Но как сохранить сам объект VB_PictureBox1 ? Когда он уйдет из области видимости.
Без сохранения его во глобальных коллекциях.
...
Рейтинг: 0 / 0
06.10.2014, 15:37
    #38768020
Сохранить объект в TAG
Eolt,
1) Зачем хаки, если есть UserControl-ы?
2) Если всё-таки хачить, то вручную управлять счётчиком ссылок:
Код: vbnet
1.
2.
3.
4.
5.
Dim VB_PictureBox1 As New VB_PictureBox
Set VB_PictureBox1.Ctrl = Form1.Controls.Add("VB.PictureBox", "pic1")
VB_PictureBox1.Ctrl.Tag = ObjPtr(VB_PictureBox1)
...
CopyMemory VB_PictureBox1, 0&, 4 'хак - не вызывается IUnknown::Release()

И потом восстановить объект:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Dim VB_PictureBox2 As VB_PictureBox
CopyMemory VB_PictureBox2, CLng(VB_PictureBox1.Ctrl.Tag), 4
...
'если сделать Set VB_PictureBox2 = Nothing, или
'VB_PictureBox2 выйдет из области видимости,
'счётчик ссылок уменьшится, и объект может быть уничтожен.
'Если этого (пока) не нужно делать, то опять тот же хак:
CopyMemory VB_PictureBox2, 0&, 4 'хак - не вызывается IUnknown::Release()



P.S. пишу по памяти, без проверки.
...
Рейтинг: 0 / 0
06.10.2014, 15:53
    #38768058
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранить объект в TAG
13-й квартал,

Спасибо, у вас как всегда очень ценные советы!
Про UserControl`ы мне и в голову не пришло, учту на будущее.

авторЕсли всё-таки хачить, то вручную управлять счётчиком ссылок:

Точно, погуглил и нашел готовое решение со счетчиком ссылок на вбакселераторе

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
   Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
       lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
   ' To Store An Object to a Long:
   Public Function Store(objThis As Object) As Long
      Dim iU As IShellFolderEx_TLB.IUnknown
      Set iU = objThis
      iU.AddRef
      Set iU = Nothing
      Store = ObjPtr(objThis)
      ' objThis cannot terminate until we call iU.Release on it
   End Function

   ' To Retrieve the Object From the Long Value:
   Public 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

   ' To Delete The Object:
   Public Function Delete(ByVal lPtr As Long) As Long
      Dim objThis As Object
      Set objThis = ObjectFromPtr(lPtr)
      Dim iU As IShellFolderEx_TLB.IUnknown
      Set iU = objThis
      iU.Release
      Set iU = Nothing
      Set objThis = Nothing
      ' objThis now terminates if there are no other external
      ' references to it.
   End Function
...
Рейтинг: 0 / 0
06.10.2014, 15:57
    #38768072
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранить объект в TAG
EoltСсылку запомнить можно:
Код: vbnet
1.
VB_PictureBox1.Ctrl.Tag = ObjPtr(VB_PictureBox1)   




И потом восстановить объект:
Код: vbnet
1.
2.
Dim VB_PictureBox2 As VB_PictureBox
CopyMemory VB_PictureBox2, CLng(VB_PictureBox1.Ctrl.Tag), 4

ОМГ, а просто Set ..Ctrl.Tag = VB_PictureBox1 не труЪ?
...
Рейтинг: 0 / 0
06.10.2014, 16:02
    #38768091
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранить объект в TAG
Antonariy[/src]ОМГ, а просто Set ..Ctrl.Tag = VB_PictureBox1 не труЪ?[/quot]

Конечно было бы тру, если бы работало. Но видимо при реализации свойства Tag в VB6 были допущены ошибки, и оно не может хранить объекты.

Код: vbnet
1.
        Set VB_PictureBox1.Ctrl.Tag = VB_PictureBox1   '<---- ошибка
...
Рейтинг: 0 / 0
06.10.2014, 16:05
    #38768098
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранить объект в TAG
tag вообще то Variant
с чего вы решили, что туда можно сам Object запихнуть? ссылку конечно вы туда запихнёте, но само содержимое объекта чтобы запихнуть, вам нужно его сериализовать, а при вытаскивании десериализолвать обратно в объект. так что думайте дальше
...
Рейтинг: 0 / 0
06.10.2014, 16:14
    #38768114
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранить объект в TAG
Konst_Onetag вообще то VariantА действительно, у этого Tag не реализован Set. Это в дотнете Tag работает как полагается.
...
Рейтинг: 0 / 0
06.10.2014, 16:15
    #38768118
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранить объект в TAG
Konst_Onetag вообще то Variant
с чего вы решили, что туда можно сам Object запихнуть? ссылку конечно вы туда запихнёте

Да мне собственно и надо ссылку запихнуть, но не выходит, бага в Tag...
А в обычном Variante ссылки на объекты прекрасно сохраняются.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Option Explicit

Private Sub Form_Load()

  Dim VB_PictureBox1 As VB.PictureBox
  Set VB_PictureBox1 = Form1.Controls.Add("VB.PictureBox", "pic1")
  
  '---------------------------------
  Dim Var1 As Variant
  Set Var1 = VB_PictureBox1
  '---------------------------------
 
  Dim VB_PictureBox2 As VB.PictureBox
  Set VB_PictureBox2 = Var1
  MsgBox VB_PictureBox2.Name
End Sub
...
Рейтинг: 0 / 0
06.10.2014, 16:19
    #38768128
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранить объект в TAG
13-й кварталИ потом восстановить объект:Уже сто лет как обратная функция написана.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Public Function ObjFromPtr(lObjPtr As Long) As Object
Dim LoTmp As Object
    If lObjPtr <> 0 Then
        CopyMemory LoTmp, lObjPtr, 4
        Set ObjFromPtr = LoTmp
        CopyMemory LoTmp, 0&, 4
    End If
End Function
...
Рейтинг: 0 / 0
06.10.2014, 16:20
    #38768132
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранить объект в TAG
А, автор ее уже нашел.
...
Рейтинг: 0 / 0
06.10.2014, 17:05
    #38768208
Сохранить объект в TAG
AntonariyУже сто лет как обратная функция написана.Есть момент: надо увеличивать счётчик ссылок или нет. Впрочем, это можно решить, введя такой флаг в параметры функции, будет более универсальная.

Свойство Tag у VB-шных эл-тов упр-я строковое. Это у некоторых Common Control-овских классов Variant, там да, Set работает.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сохранить объект в TAG / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]