Newsgroup: it.comp.lang.visual-basic
Titolo: Caricamento Array

posto il seguente codice (è in VB5 con una funzione splitVB5 che
simula la split di VB6...)
Public Sub colora(rtb As RichTextBox, sText As String)
    If sText = "" Then Exit Sub
 
    Dim arCode() As String
 
    arCode = SplitVB5(sText, vbCrLf)
	.....eccetera....
perchè quando eseguo la sub si blocca su 
arCode = SplitVB5(sText, vbCrLf) restituendo l'errore:
"Impossibile asegnare la matrice..."
in VB6 la sub funziona... come va dichiarata la arCode in VB5?
grazie a tutti e ciao.
palmiro

 (è in VB5 con una funzione splitVB5 che simula la split di VB6...)
La vediamo?

in VB6 la sub funziona... come va dichiarata la arCode in VB5?
Se non ricordo male, in vb5 non puoi restituire una matrice:
forse te la cavi restituendo una Variant.
Eventualmente puoi restituire la matrice con un argomento out
nella funzione:
Sub SplitVB5(ByVal sText As String, _
			ByVal sSep As String, _
			ByRef retArray() As String _
		)
-- 
hth, hal

posto la funzione splitVB5:
Public Function SplitVB5(Expression As String, Optional ByVal
Delimiter As String = "  ", Optional ByVal Limit As Long = -1,
Optional ByVal Compare As CompareMethod = BinaryCompare) As Variant
'Expression:    The string to split.
'Delimiter:     The delimiter used for the split.
'Limit:         The max number of elements to return (-1 = all
elements).
'Compare:       The compare method (binary or text).
'Returns:       A zero-based variant array of substrings or
'               entire expression as element(0) if no delimiter found.
Dim lPos1   As Long
Dim lPos2   As Long
Dim lIdx    As Long
Dim lCnt    As Long
Dim saTmp() As String
    'Initialize the variables
    lCnt = 0
    lPos1 = 1
    ReDim saTmp(99)
 
    'Search for the delimiter.
    lPos2 = InStr(1, Expression, Delimiter, Compare)
    While lPos2 > 0 And ((lCnt <= Limit) Or (Limit = -1))
        'Delimiter found, extract the substring between the
delimiters.
        saTmp(lCnt) = Mid$(Expression, lPos1, lPos2 - lPos1)
        lCnt = lCnt + 1
        If (lCnt Mod 100) = 0 Then
            'Increase array size if needed.
            ReDim Preserve saTmp(UBound(saTmp) + 100)
        End If
        'Move to end of last delimiter found.
        lPos1 = lPos2 + Len(Delimiter)
        'Search for the next delimiter.
        lPos2 = InStr(lPos1, Expression, Delimiter, Compare)
    Wend
 
    If lPos1 < Len(Expression) Then
        'Extract last substring.
        saTmp(lCnt) = Mid$(Expression, lPos1)
        lCnt = lCnt + 1
    End If
 
    'Resize the array to correct size.
    If lCnt > 0 Then
        ReDim Preserve saTmp(lCnt - 1)
    Else
        ReDim saTmp(-1 To -1)
    End If
 
    'Return the array.
    SplitVB5 = saTmp
 
End Function
la funzione restituisce gia una VARIANT....
ciao e grazie dell'aiuto
palmiro


Anche io ho avuto questo problema e, se puo' servire, metto a disposizione
la funzione che ho creato per VB5 che simula lo Split di VB6.
---------------------------------------------------------------
Public Function SepStr(Frase As String, Optional Separatore = " ")
' Funzione che converte una stringa in un array:
' divide la stringa in base al separatore specificato.
'
    Dim i As Integer
    Dim Md As String
    Dim Acc As String
    Dim CArr As Integer
    Dim ArrFin()
    If Frase = Empty Then ReDim Preserve ArrFin(0): ArrFin(0) = Empty
    For i = 1 To Len(Frase)
        DoEvents
        Md = Mid(Frase, i, 1)
        If (Md = Separatore) Or (i = Len(Frase)) Then
            If (i = Len(Frase)) And (Md <> Separatore) Then Acc = Acc & Md
            ReDim Preserve ArrFin(CArr)
            ArrFin(CArr) = Acc
            CArr = CArr + 1
            Acc = Empty
        Else: Acc = Acc & Md
        End If
    Next i
    SepStr = ArrFin
End Function

 Optional ByVal Compare As CompareMethod = BinaryCompare) As Variant
In VB6 ho dovuto modificare la dichiarazione cosě:
Public Function SplitVB5(Expression As String, Optional ByVal Delimiter As
String = "  ", Optional ByVal Limit As Long = -1, Optional ByVal Compare As
VbCompareMethod = vbBinaryCompare) As Variant
(Non riconosceva ... As CompareMethod, ma potrebbe essere un'esigenza di VB6
rispetto a VB5)
Non so che dirti. A me funziona (sempre in VB6). Qualche appunto: Mi sembra
un po' contorta come logica, inoltre se l'ultima stringa non č seguita dal
separatore, non viene restituita. Ancora: Non mi piace quel Redim finale (se
non vi sono stringhe) "ReDim saTmp(-1 To -1)". E' chiaramente un modo
convenzionale per indicare che non vi sono stringhe, non sto dicendo che il
problema č quello. L'errore te lo da in ogni caso o solo in certe
condizioni? Cerca di approfondire per focalizzare il problema, meglio se
seguendo il codice passo-passo.
L'indicazione di Hal parrebbe superata (Variant) dal codice postato da
xBlack (non l'ho provato). Prova, nel tuo codice chiamante a fare "Dim
arCode()" invece che "Dim arCode() As String"

grazie per i consigli..
putroppo nè la funzione di XBlack ne la diversa dichiarazione della
sub risolvono il probema...
in VB5 non ne vuole sapere di funzionare
l'errore è sempre "Imposibile assegnare alla matrice..."
.. proverò qualche altra soluzione e vi farò sapere...
sono ben accetti altri consigli.
grazie  a tutti e ciao
palmiro

 l'errore è sempre "Imposibile assegnare alla matrice..."
Usa questa dichiarazione:
    Dim Campi As Variant
Questa assegnazione:
    Campi = Split(TestoDaSplittare, Delimitatore) ' e gli eventuali altri argomenti
E questa funzione (non ricordo dove l'ho scaricata, ma la uso da anni):
***************************
Public Function Split(ByVal Expression As String, Optional Delimiter As String = " ", Optional Limit As _
Long = -1, Optional Compare As VbCompareMethod = vbBinaryCompare) As Variant
    '============================================
    '   Split - This function mimics the VBA6.Split function which is not
    '   available in VB5. This function helps VB5 & VB6 projects co-exist.
    '
    '   NOTE: Anyone making adjustments to this function should keep in
    '   mind that it is intended to behave EXACTLY like the VBA6.Split
    '   function (flaws and all, including operands).
    '
    '   WARNING: Like the VB6.Split function, do not use Split for
    '   parsing a comma delimited string, as it does not conform to
    '   the rules that govern the parsing of the comma delimited
    '   file format.
    '
    '   Expression      String to parse.
    '   Delimiter       Character to delimit fields.
    '   Limit
    '   Expression      Required. String expression containing substrings and
    '                   delimiters. If expression is a zero-length string(""),
    '                   Split returns an empty array, that is, an array with no
    '                   elements and no data.
    '   Delimiter       Optional. String character used to identify substring
    '                   limits. If omitted, the space character (" ") is
    '                   assumed to be the delimiter. If delimiter is a zero-length
    '                   string, a single-element array containing the entire
    '                   expression string is returned.
    '   Limit           Optional. Number of substrings to be returned; A value
    '                   of -1 (default) indicates that all substrings are returned.
    '   Compare         Optional. Numeric value indicating the kind of comparison
    '                   to use when evaluating substrings. See Settings section
    '                   for values.
    '
    '   RETURNS         A Variant() array of substrings.
    '==============================================
    Const AvgSize   As Integer = 10    ' fudge factor: average field size
    Dim ArrayIncr   As Long    ' array resizing increment
    Dim j           As Long    ' work subscript
    Dim k           As Long    ' work subscript
    Dim StrPos()    As Long    ' string map: String field position
    Dim StrLen()    As Long    ' string map: String field length
    Dim ExprLen     As Long    ' length of the supplied string
    Dim nElements   As Long    ' # of elements parsed
    Dim RetArray    As Variant    ' not very efficient but the only way to RETURN a dynamic array in VB5
    Split = Empty    ' by default return a value of type Empty
    ExprLen = Len(Expression)    ' save this for performance
    If ExprLen = 0 Then Exit Function    ' exit if nothing to parse
    If StrComp(Right$(Expression, Len(Delimiter)), Delimiter, Compare) = 0 Then    ' does the string have a trailing delimiter?
        Expression = Left$(Expression, ExprLen - Len(Delimiter))    ' strip trailing delimiter
        ExprLen = ExprLen - Len(Delimiter)    ' track new string length
    End If
    ArrayIncr = ExprLen / AvgSize    ' make a guess of how many elements needed
    If ArrayIncr < 10 Then ArrayIncr = 20    ' size array at least 20 elements at a time
    Select Case Limit    ' a limit has been placed on the # of elements
        Case Is > 0    ' a limit supplied
            ' all is cool
        Case 0, Is < -1    ' no elements allowed
            Exit Function    ' we're done
    End Select
    If Len(Delimiter) = 0 Then    ' delimiter cleared
        Split = Array(Expression)    ' return a single element array
    End If
    ReDim StrPos(1 To ArrayIncr)    ' initialize the array for looping
    ReDim StrLen(1 To ArrayIncr)    ' initialize the array for looping
    k = 1    ' start parsing from position 1
    j = InStr(k, Expression, Delimiter)    ' locate the first delimiter
    If j = 0 Then    ' nothing found
        Split = Array(Expression)    ' return a single element array
        Exit Function    ' we're done
    Else    ' first element found
        While j > 0    ' loop until nothing left to parse
            nElements = nElements + 1    ' track # of elements thus far
            StrPos(nElements) = k    ' track the start of the read
            StrLen(nElements) = j - k    ' track the # of characters to read
            k = j + Len(Delimiter)    ' track next position
            j = InStr(k, Expression, Delimiter)    ' get next position
            If nElements = UBound(StrPos) Then    ' time to resize the array
                ReDim Preserve StrPos(1 To UBound(StrPos) + ArrayIncr)    ' resize the array & make room
                ReDim Preserve StrLen(1 To UBound(StrLen) + ArrayIncr)    ' resize the array & make room
            End If
        Wend
        ReDim RetArray(nElements)    ' size the array to fit
        For j = 1 To nElements    ' loop thru each element
            RetArray(j) = Mid$(Expression, StrPos(j), StrLen(j))    ' copy next substring into the array
        Next j
        Split = RetArray    ' return the array
    End If
End Function
***************************
Bye, G.

la funzione restituisce gia una VARIANT....
Va dichiarata Variant (non array di Variant, ma solo
Variant) anche la variabile che riceve il
risultato della funzione.
-- 
hth, hal

la funzione funzia benissimo...
grazie e ciao
palmiro

> l'errore è sempre "Imposibile assegnare alla matrice..."
ATTENTOOOO!
Quando dichiari la variabile da riempire con la mia funzione Split non puoi
ne dichiaralra come variant, string...
Non è nemmeno possibile, al momento della dichiarazione, scrivere la
variabile seguita da ()
Fammi sapere,
xBlack


wrote:

infatti...  me ne sono reso conto nel testarla...
ho poi risolto il problema utilizzando la funzione splitVB5 	
che ho postato precedentemente... dichiarando
semplicemente , come suggerito da hal1961, 
come variant la stringa che viene passata alla funzione
... mi resta un ultimo problema da risolvere infatti
se passo alla funzione la stringa
"ciccio = pippo per due"
la funzione mi restituisce un array formato da
        1° elemento : ciccio
        2° elemento : =
e si mangia pippo... in altre parole il popolamento dell'array
si blocca quando trova un = (uguale)...
prima o poi risolverò il problema... è diventata una questione di
principio..
ciao
palmiro
PS: la tua funzione è molto simile a quella reperibile sul sito
microsoft.... forse l'hai scaricata da lì.

 si blocca quando trova un = (uguale)...
Tenderei ad escluderlo. La tua funzione si aspetta un delimitatore di
default fatto di due spazi e il tuo codice ignora (come già ti avevo
evidenziato) l'ultima "parola" se non è seguita dal delimitatore previsto.
Secondo me la stringa che hai passato è: "ciccio##=#pippo#per#due", dove #
rappresenta lo spazio.

 rappresenta lo spazio.
Mi correggo:
"ciccio##=##pippo#per#due"

per hal
no... sono sicuro di passare una lunga stringa contenente gli spazi
chr$(32)... per separare le parole che la compongono, questo perchè le
stringhe che passo non sono altro che righe di codice VB..
 mi spiego il programmino che sto facendo
carica in un rchText il codice VB contenuto in un form...
la split mi serve per esaminare le parole che compongono la
stringa in modo da assegnare loro nella rchText una diversa
colorazione a seconda se sono parole riservare, commento, variabili
eccc... 
passo alla funzione anche lunghissime stinghe SQL che contengono
anche caratteri come ', * , # ecc e tutto viene restituito
regolarmente.
basta che passo una stringa con un carattere di = e la funzione
non restituisce il resto della stringa come ho detto...
ciao
palmiro

per lupo..
scusa dimenticavo un particolare...
il problema si verifica quando dopo = c'è un numero
esempio:
tb.ordinalposition = 2
la funzione restituisce 
tb.ordinalposition = 
e si mangia il 2
ciao
palmiro

scusate se rompo con il terzo post...
RISOLTO:
bastava mettere due blank come limitatore nella chiamata alla split:
arParola = SplitVB5(arCode(iLineCount), "  ")
adesso la funzione funge...
ciao a tutti

 microsoft.... forse l'hai scaricata da lě.
No, tutto solo me la sono fatta :))

 adesso la funzione funge...
Tu non leggi i miei post. Ne hai la facoltà.


scusa sono rincoglionito... se leggi i post seguenti c'č un'altra
anima pia che mi ha posta una funzione split... e che diceva di non
ricordarsi dove l'aveva scaricata...
pensavo di rispondere a lui.. invece ho risposto a te...
come non detto...
ciao
palmiro