2011-08-17 17 views
5

Alcune funzioni come Split() restituirà un array con -1 per il limite superiore e zero per il limite inferiore se l'array contiene elementi, ad esempio:matrice vb6 con -1 per limite superiore

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

In questo caso UBound (s) sarà uguale a -1 e LBound (s) sarà uguale a 0. Ho una buona quantità di controllo del codice per -1 sul limite superiore per vedere se l'array ha valori o meno. Funziona alla grande

Il problema è che ora desidero modificare il tipo di dati dell'array da stringa a lunga. Non riesco a creare un array di long con un limite superiore di -1 e un limite inferiore di 0, e le funzioni Split() e Join() funzionano solo su array di stringhe.

Mi piacerebbe essere in grado di restituire un array lungo con limite superiore di -1. È possibile?

+2

Forse ho mancato il punto qui, ma puoi creare un array di Long con 'upperbound' -1:' Dim lngArray (-1 To -1) As Long' –

+0

@Matt @bugtussle Bugtussle, dovresti probabilmente spiegare in la tua domanda che vuoi un ** limite inferiore di zero ** e un limite superiore di -1! Altrimenti devi conoscere bene il comportamento di 'Split'. Modificherò la tua domanda di conseguenza – MarkJ

risposta

4

Non penso che si possa farlo in VB6 da solo. Tuttavia, se siete disposti ad utilizzare la funzione API di Windows SafeArrayCreateVector si può fare:

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) 

Se avete bisogno di farlo per gli altri tipi di dati è possibile modificare il parametro vt.

Si prega di notare, penso di aver originariamente scoperto questo dalla risposta di Vi2 a questo discussion.

+0

Very nice hack! – wqw

+0

Questo crea un array con lbound 0 e ubound -1 che si comporta esattamente come la funzione split quando 's = Split (" ",", ")'. Grazie – bugtussle

0

Un problema con VB6 è che non esiste alcun modo per creare o rilevare in modo affidabile una matrice vuota (o non inizializzata). A volte, è possibile rilevare un array non inizializzato controllando se il limite superiore è maggiore del limite inferiore; tuttavia, questo non è né elegante né documentato. Il modo migliore per eseguire correttamente una cosa del genere è racchiudere la matrice in una variante e impostare Variant su Empty per deinitializzare la matrice. È quindi possibile utilizzare un controllo come Se VarType (v) = vbEmpty ...

+0

Penso che sia elegante. Puoi considerarlo come il modello di oggetto nullo – MarkJ

1

Si potrebbe scrivere la propria funzione di divisione per fare questo:

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

Stavo cercando 'redim lng (-1 a -1)'. Grazie. Penso di aver provato solo 'ReDim (-1)' e 'ReDim (da 0 a -1)' e ho ricevuto un errore: P – bugtussle

0

Un altro modo è una funzione di "fabbrica" ​​fortemente tipizzato:

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 

Penso che questo funziona anche con i tipi integrali.

Problemi correlati