Ничего не соответствует типу VB6
Я попробовал все, но все дает мне несоответствие типов:
Type UserType
...
End Type
Dim SomeArray() As UserType
...
If SomeArray() Is Nothing Then <do smth>
If SomeArray() Is Empty Then <do smth>
If SomeArray Is Nothing Then <do smth>
If SomeArray Is Empty Then <do smth>
Я действительно хочу знать, когда в моем массиве пользовательского типа нет элементов! Потому что я не хочу использовать дополнительные переменные, если я могу использовать возможности VB6.
Я буду использовать
Erase SomeArray
когда его размер = 1 (UBound(SomeArray) = 1
) и я хочу удалить последний элемент.
Что я делаю не так? XD
2 ответа
VB6 "Ничего" относится к объектам, а не к массивам VB6.
"Ubound (myarray)" или "Ubound - LBound" - это способ определения текущей длины массива в VB6.
К вашему сведению, использование Коллекции VB6 может быть намного лучше для вас.
Хех, я нашел способ решить эту проблему из VBForums "VB6 - Возврат / Обнаружение пустых массивов". B)
(L / UBound не работает с пустыми массивами - он возвращается за пределы индекса.;))
Так...
Private Declare Function ArrPtr Lib "msvbvm60" Alias "VarPtr" (Ptr() As Any) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Public Function Peek(ByVal lPtr As Long) As Long
Call CopyMemory(Peek, ByVal lPtr, 4)
End Function
Не забудьте объявить свои собственные переменные ДО определения этой подпрограммы! Или это вызовет некоторые странные ошибки (VB неожиданно заменил мою инструкцию Exit Sub на Exit Function!).
Тогда я использовал
If Peek(ArrPtr(SomeArray)) = 0 Then
MsgBox "Looks like empty array SomeArray() before ReDim ^_^"
End If
а также
Erase SomeArray
If Peek(ArrPtr(SomeArray)) = 0 Then
MsgBox "Looks like empty array SomeArray() after Erase ^_^"
End If
и все работает отлично!
Не очень просто, но хорошо.
Спасибо всем, я выучу этот цепной список под названием Коллекция.
Особенно спасибо за VBForums, они действительно гики.