powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Копирование коллекции
3 сообщений из 28, страница 2 из 2
Копирование коллекции
    #32415342
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗЫ вот еще раз перечитал набор сообщений - есть подозрение, что КОПИРОВАНИЕ коллекций Вам в действительности не нужно.

Можно обойтись и без него, но нужно. Именно независимая копия.


Ok. Обсудим более конкретные примеры:
В данном случае используя библиотеку типов для доступа к IUnknown получим раннее связывание.
На основе этого кода, можно сделать свою коллекцию, сохраняя пойнтеры и контролируя их через IUnknown.

Public Sub 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 Sub


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


' To Delete The Object:
Public Sub 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 Sub


Точно так же, используя библиотеку типов , можно получить раннее связывание и для IMalloc.
С его помощью резервировать память под обьекты, ссылки на которые хранить в массиве.

Public Function SaveToMemory(ByRef b() as Byte) As Long
Dim lSize As Long
Dim lPtr As Long

On Error Resume Next ' Error checking: UBound/LBound can fail.
lSize = UBound(b) - LBound(b)
If Err.Number=0 Then
lSize = lSize + 1
Else
' No Data:
lSize = 0
End If

On Error Goto 0
lPtr = isMalloc.Alloc(lSize + 4)
If Not (lPtr=0) Then
' Store the size of the array:
CopyMemory ByVal lPtr, lSize, 4
If lSize > 0 Then
' Store the array:
CopyMemory ByVal lPtr + 4, b(0), lSize
End If
End If

' Return the Value of lPtr
SaveToMemory = lPtr
End Function

' To Restore the array from the Pointer lPtr:
Public Sub RestoreFromMemory(ByVal lPtr As Long, ByRef b() as Byte)
Dim lSize As Long

Erase b
If Not (lPtr = 0) Then
' Get the size of the array:
CopyMemory lSize, ByVal lPtr, 4
If lSize > 0 Then
ReDim b(0 To lSize-1) As Byte
CopyMemory b(0), ByVal lPtr, lSize
End If
End If

End Sub









Magnus
...
Рейтинг: 0 / 0
Копирование коллекции
    #32415695
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне трудно придумать ситуацию, когда использование IUnknown как инстумента упраления счетчиком ссылок приносит внятную пользу в программах, написанных на VB, для объектов порожденных в VB. И когда я говорил об этом, я имел ввиду сказать, что (как правило) в его использовании (почти) нет необходимости. Может быть найдется польза для управления Ком-объектами, порождаемыми внешними процессами.

Приведенный Вами код при следущем его использовании

Dim obj1 As MyClass
Dim obj2 As MyClass

Dim lngPtr as Long

set obj1 = New MyClass

lngPtr = Strore(obj1)

set obj2 = ObjectFromPtr(lngPtr)

НЕОТЛИЧИМ
от

Dim obj1 As MyClass
Dim obj2 As MyClass

Dim lngPtr as Long

Set obj1 = New MyClass
Set obj2 = obj1

И поэтому Store и ObjFromPtr для простых случаев - мусор.
Применительно к теме копирования - Вам решать...

По поводу IMalloc - удобно, если акуратно. Однако практика (моя) показывает, что в содержательных случаях не выигрывает перед Redim или String$, привнося потребность слежения за освобождением памяти.

Пользу от IMalloc можно попробовать получить при программировании IO через API (каналы, сокеты, почтовые слоты, файлы, ком порты). Мне почти всегда Redim хватало.

Правда есть еще одна специальная задачка, где полезно - преобразование указателя на строку к массиву заданного целочисленного типа (байт, целое, длинное целое) БЕЗ КОПИРОВАНИЯ байтов строки ( в задачах типа MIME кодирования)

В точки зрения оптимизации скорости при выполнении операции копирования массив представляется (мне) наиболее удобной конструкцией, какой бы смысл вы не вкладывали в термин "копирование"

PS все вышесказанное - всего лишь скромное мнение.
специально для волков - возможно ошибочное.
...
Рейтинг: 0 / 0
Копирование коллекции
    #32415719
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщем то , мне хотелось получить простой ответ, можно или нет? Если да то как?
Резюмируя, можно сказать так: простого способа нет.
Применительно к копированию: более быстрый доступ к элементам коллекции.

Источник кода:
http://www.vbaccelerator.com/codelib/imalloc/objstore.htm


Magnus
...
Рейтинг: 0 / 0
3 сообщений из 28, страница 2 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Копирование коллекции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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