Vb6数组,上界为-1



如果数组中没有元素,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

相关内容

  • 没有找到相关文章

最新更新