powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сохранить объект в TAG
11 сообщений из 11, страница 1 из 1
Сохранить объект в TAG
    #38767942
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так не работает:
Код: 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
Сохранить объект в TAG
    #38768020
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
Сохранить объект в TAG
    #38768058
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Сохранить объект в TAG
    #38768072
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Сохранить объект в TAG
    #38768091
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy[/src]ОМГ, а просто Set ..Ctrl.Tag = VB_PictureBox1 не труЪ?[/quot]

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

Код: vbnet
1.
        Set VB_PictureBox1.Ctrl.Tag = VB_PictureBox1   '<---- ошибка
...
Рейтинг: 0 / 0
Сохранить объект в TAG
    #38768098
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tag вообще то Variant
с чего вы решили, что туда можно сам Object запихнуть? ссылку конечно вы туда запихнёте, но само содержимое объекта чтобы запихнуть, вам нужно его сериализовать, а при вытаскивании десериализолвать обратно в объект. так что думайте дальше
...
Рейтинг: 0 / 0
Сохранить объект в TAG
    #38768114
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Onetag вообще то VariantА действительно, у этого Tag не реализован Set. Это в дотнете Tag работает как полагается.
...
Рейтинг: 0 / 0
Сохранить объект в TAG
    #38768118
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Сохранить объект в TAG
    #38768128
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Сохранить объект в TAG
    #38768132
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, автор ее уже нашел.
...
Рейтинг: 0 / 0
Сохранить объект в TAG
    #38768208
AntonariyУже сто лет как обратная функция написана.Есть момент: надо увеличивать счётчик ссылок или нет. Впрочем, это можно решить, введя такой флаг в параметры функции, будет более универсальная.

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


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