Vb6 array with -1 for upper bound

Some functions, such as Split(), return an array with -1 for the upper bound and zero for the lower bound if the array has no elements, for example:

Dim s() As String
s = Split("", ",")
Debug.Print UBound(s)
Debug.Pring LBound(s)

In this case, UBound (s) will be -1, and LBound (s) will be 0. I have a fair amount of code checking -1 at the top border to see if the array has values ​​or not. This works great.

The problem is that now I want to change the data type of the array from a string to long. I cannot create an array of longs with an upper bound of -1 and a lower bound of 0, and the functions Split()and Join()only work with string arrays.

I would like to be able to return a long array with an upper bound of -1. Is it possible?

+5
source share
4 answers

I do not think you can do this in VB6. However, if you want to use the Windows API function SafeArrayCreateVector , you can do this:

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)

If you need to do this for other data types, you can change the vt parameter.

Please note that I initially learned about this from Vi2's answer to this discussion .

+4
source

You can write your own split function to do this:

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
+1
source

VB6 , ( ) . , , ; , . ​​ - Variant Variant to Empty . , ​​ If VarType (v) = vbEmpty...

0

Another way is a strongly typed factory function:

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

I think this also works with integer types.

0
source

All Articles