2016-02-04 31 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“Is Nothing”适用于对象,而不是VB6 arrays

“Ubound(myarray)”或“Ubound - LBound”是确定VB6中数组当前长度的方法。

仅供参考,使用VB6 Collection可能对您更好。

+0

收集不适用于用户类型。它写了类似于“你被强迫的混蛋吸我的造!链接自己在公共预编译模块,迟到的败类!”。我唯一懂的 - “败类”。这是非常进攻的。 不止这些!我甚至无法将简单的String添加到Collection中! O_O – 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语句!)。

然后我用

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,他们真的是怪人。