如果数组中没有元素,Split()
等函数将返回一个上界为-1,下界为零的数组,例如:
Dim s() As String
s = Split("", ",")
Debug.Print UBound(s)
Debug.Pring LBound(s)
在这种情况下,UBound(s)将等于-1,LBound(s)将等于0。我有相当多的代码检查-1的上界,看看数组是否有值。这很有效。
问题是我现在想把数组的数据类型从string改为long。我似乎不能创建一个上界为-1下界为0的长数组,Split()
和Join()
函数只对字符串数组进行操作。
我希望能够返回一个上界为-1的长数组。这可能吗?
我不认为你可以在VB6它自己。然而,如果你愿意使用Windows API函数SafeArrayCreateVector,你可以这样做:
Private Declare Function LongSplitEmulator Lib "OLEAUT32.DLL" Alias "SafeArrayCreateVector" _
(Optional ByVal vt As VbVarType = vbLong, _
Optional ByVal low As Long = 0, _
Optional ByVal count As Long = 0) As Long()
Dim a() As Long
a = LongSplitEmulator()
MsgBox UBound(a)
如果您需要为其他数据类型执行此操作,您可以更改vt参数。
请注意,我想我最初是从Vi2对这个讨论的回答中发现的。
您可以编写自己的split函数:
Private Sub SplitLongs(ByVal strData As String, ByRef lng() As Long)
Dim i As Integer
Dim s() As String
s = Split(strData, ",")
If UBound(s) = -1 Then
ReDim lng(-1 To -1)
Else
ReDim lng(LBound(s) To UBound(s))
For i = LBound(s) To UBound(s)
If IsNumeric(s(i)) Then lng(i) = s(i)
Next
End If
End Sub
VB6的一个问题是没有办法可靠地创建或检测空(或未初始化)数组。有时,可以通过检查上界是否大于下界来检测未初始化的数组;然而,这既不优雅,也没有文档。正确完成这种事情的最佳方法是将数组包含在一个Variant中,并将Variant设置为Empty以取消对数组的初始化。然后,您可以使用如下检查:If VarType(v) = vempty…
另一种方法是使用强类型"工厂"函数:
Private Declare Function SafeArrayRedim Lib "oleaut32.dll" (ByVal ArrayPtr As Long, ByRef DataPtr As tagSAFEARRAYBOUND) As Long
Private Type tagSAFEARRAYBOUND
cElements As Long
lLbound As Long
End Type
Public Type Feed
ID As String
Name As String
Active As Boolean
BasePath As String
End Type
Public Sub EmptyFeedArray(ByRef Arr() As Feed)
Dim Data As tagSAFEARRAYBOUND
Dim lngErr As Long
'Redim to one item
ReDim Arr(0 To 0)
'Reset the safe array to empty
lngErr = SafeArrayRedim(Not Not Arr, Data)
'Raise any errors
If lngErr <> 0 Then Err.Raise lngErr
End Sub