- Код: Выделить всё
Public Sub EmptyArray(a, Optional Dims As Long = 1)
Dim ArrayVar As Long, ArrayDesc As Long, Bounds As SAFEARRAYBOUND
ArrayVar = Mem(VarPtr(a) + 8)
ArrayDesc = Mem(ArrayVar)
If ArrayDesc = 0 Then
Mem(ArrayVar) = SafeArrayCreate(VarType(a) And (Not vbArray), Dims, Bounds)
Else
SafeArrayRedim ArrayDesc, Bounds
End If
End Sub
Можно прописать для отдельных типов:
- Код: Выделить всё
Public Sub EmptyByteArray(a() As Byte, Optional Dims As Long = 1)
Dim ArrayVar As Long, ArrayDesc As Long, Bounds As SAFEARRAYBOUND
ArrayVar = ArrPtr(a)
ArrayDesc = Mem(ArrayVar)
If ArrayDesc = 0 Then
Mem(ArrayVar) = SafeArrayCreate(vbByte, Dims, Bounds)
Else
SafeArrayRedim ArrayDesc, Bounds
End If
End Sub
Пояснения:
Mem(VarPtr(a) + 8 ) - чтение адреса переменной из типа Variant, смещение = 8 байтам
Mem(ArrayVar) - чтение адреса структуры SAFEARRAY, 0 - если массив не инициализирован
VarType(a) And (Not vbArray) - возращает тип элементов массива
Bounds As SAFEARRAYBOUND - .cElements = 0, .lLbound = 0