2016-02-04 5 views
0

Я попробовал все, но все дает мне тип несоответствие:ли тип Ничего несоответствие 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 arrays.

«Ubound (myarray)», или «Ubound - LBound» - это способ определения текущей длины массива в VB6.

FYI, используя VB6 Collection, может быть намного лучше для вас.

+0

Collection не работает с пользовательскими типами. Он пишет что-то вроде «вы принужденный ублюдок сосать мой make! Link yorself в публичном предварительно скомпилированном модуле, позднейшей отбросе!». Единственное, что я понимаю - «сволочь». Это очень обидно. Больше, чем это! Я даже не могу добавить простую строку в коллекцию! О_О – upitanniy

0

Хе-хе, я нашел способ решить эту проблему от 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 statement функцией Exit!).

Тогда я использовал

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 

и все работает отлично!

Не очень простой, но прекрасный.

Thx everyone, я узнаю этот прикованный список под названием Collection.

Особо спасибо VBForums, они действительно выдуманные.

Смежные вопросы