2011-08-17 37 views
5

Algunas funciones como Split() devolverá un array con -1 para el límite superior y cero para el límite inferior si la matriz no tiene elementos, por ejemplo:array VB6 con -1 para límite superior

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

En este caso UBound (s) equivaldrá a -1 y LBound (s) equivaldrá a 0. Tengo una buena cantidad de comprobación de código para -1 en el límite superior para ver si la matriz tiene valores o no. Esto funciona genial

El problema es que ahora quiero cambiar el tipo de datos de matriz de cadena a larga. Parece que no puedo crear una matriz de longs con un límite superior de -1 y un límite inferior de 0, y las funciones Split() y Join() solo funcionan en matrices de cadenas.

Me gustaría poder devolver una matriz larga con un límite superior de -1. es posible?

+2

Puede haber perdido su punto aquí, pero puede crear una matriz de Long con 'upperbound' -1:' Dim lngArray (-1 a -1) Tan largo' –

+0

@Matt @bugtussle Bugtussle, probablemente debería explicar en ¡Su pregunta es que quiere un ** límite inferior de cero ** así como un límite superior de -1! De lo contrario, debe conocer muy bien el comportamiento de 'Split '. Voy a editar su pregunta en consecuencia – MarkJ

Respuesta

4

No creo que pueda hacerlo en VB6. Sin embargo, si usted está dispuesto a utilizar la función de API de Windows SafeArrayCreateVector puede hacerlo:

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) 

Si lo que necesita hacer para otros tipos de datos que puede cambiar el parámetro vt.

Tenga en cuenta, creo que originalmente me enteré de esto desde la respuesta de Vi2 a este discussion.

+0

¡Muy buen truco! – wqw

+0

Esto crea una matriz con lbound 0 y ubound -1 que se comporta exactamente como la función de división cuando 's = Split (" ",", ")'. Gracias – bugtussle

0

Un problema con VB6 es que no hay manera de crear o detectar con fiabilidad una matriz vacía (o no inicializada). A veces, es posible detectar una matriz no inicializada comprobando si el límite superior es mayor que el límite inferior; sin embargo, esto no es elegante ni documentado. La mejor manera de lograrlo correctamente es encerrar la matriz en una Variante y configurar la Variante en Vacío para desinicializar la matriz. A continuación, puede utilizar un cheque como If VarType (v) = vbEmpty ...

+0

Creo que es elegante. Puedes considerarlo como el patrón de objeto nulo – MarkJ

1

Se podría escribir su propia función de división para hacer esto:

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

Estaba buscando 'redim lng (-1 a -1)'. Gracias. Creo que solo intenté 'ReDim (-1)' y 'ReDim (0 a -1)' y recibí un error: P – bugtussle

0

Otra forma es una función fuertemente tipado "fábrica":

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 

Creo que esto también funciona con tipos enteros.

Cuestiones relacionadas