Newsgroup: it.comp.lang.visual-basic
Titolo: [VB6] mi incarto sempre con lo scope...

Salve a tutti,
ho bisogno di rendere pubblico un array che carico e ridimensiono
dalla sub2 e leggo dalla sub1... per fare cio' ho:
1) dichiarato public l'array:
    public mioarray()
2) nella sub2 ho:
    ReDim Preserve Module1.mioarray(arrSize + 1, 2)
3) nella sub1 ho un ciclo da 1 a ubound(mioarray,1) che mi dovrebbe
stampare l'array ma mi stampa solo (1,1) e (1,2):
For i = 1 To UBound(Module1.mioarray, 1) 'UBound(Module1.mioarray, 1)
sempre = 1
    Debug.Print Module1.mioarray(i, 1) & " - " & Module1.mioarray(i,
2)
Next
ora mi domando... sono io che ho sbagliato lo scope o ho commesso
qualche altro errore?
grazie 1000 a tutti
cucca

ZAC
Sicuro di scrivere in vb6?
Cmq
IN VB6....in un modulo incolla
Public MioArr() As Integer
ed in un form dentro l'evento click di un pulsante
Private Sub Command1_Click()
Dim arrsize As Integer, n As Integer
Dim t As Integer
arrsize = 20
ReDim Preserve MioArr(arrsize, 2)
For n = 0 To arrsize - 1
MioArr(n, 0) = n * 2
MioArr(n, 1) = n * 3
Next
t = UBound(MioArr)
'legge
For n = 0 To t
Debug.Print "Posizione: " + CStr(n) + " dimensione 0 = " + CStr(MioArr
(n, 0)) + " dimensione 1= " + CStr(MioArr(n, 1))
Next
End Sub
Cazzarolina!!!....e poi quelli che usano VB.net dicono che noi di vb6
siamo dei dilettanti.....
vogliamo dichiarare il tipo di variabile per favore???
Non stiamo usando php!!!

 Non stiamo usando php!!!
Test 1)
....perchè la posizione 20 è 0 0 ?
...non è difficile!
Test 2)
Perchè vuoi contare da uno e non da zero?
se lo vuoi fare OPTION....e poi?
Test 3)
Abitatuti a dichiarare sempre le variabili
OPTION...e poi?

 OPTION...e poi?
ciao e grazie


tra l'altro ora mi nasce un altro problema...
ho questo in un modulo:
Public mioArr()
public miasub(valore1 as string, valore2 as string)
    Dim i As Integer
    Dim fnd As Boolean
    Dim arrSize As Integer
    On Error Resume Next
    arrSize = UBound(mioArr)
    fnd = False
    For i = 0 To arrSize
        If Trim(mioArr(0, i)) = trim(valore1) Then '<---- questo test
è sempre vero!!!!!
            mioArr(1, i) = mioArr(2, i) + valore2
            fnd = True
            Debug.Print mioArr(0, i) & " - " & mioArr(1, i)
        End If
    Next
    If fnd = False Then
        ReDim Preserve mioArr(2, arrSize + 1)
        mioArr(0, arrSize) = Trim(Client)
        mioArr(1, arrSize) = Amount
    End If
end sub
quello che voglio fare è: se valore1 è contenuto su mioArr(1,x) allora
sommo valore2 a mioArr(2,x) se non è contenuto ridimensiono l'array, e
aggiungo valore1 e valore2... il test pero' non mi funziona se mioArr
() non è ancora stato dimensionato...
gli sto odiando sti array!!!!!!!!!
grazie 1000
cucca

 cucca
Poveri array, che ti hanno fatto? non sono loro il problema....
La funzione ha ovviamente una falla, perchè al primo "giro" mioArr()
non è dimensionato, e quindi la IF che hai evidenziato va in errore;
il problema è che hai piazzato un bel 'On Error' secco all'inizio, e
quindi l'errore viene ignorato e il codice prosegue ma con risultati
imprevedbili.
Se proprio devi trappare l'errore in maniera indiscriminata, fallo
solo per il tempo necessario, e non per tuttla Sub, quando
possibile... a maggior ragione quando stai ancora facendo debug del
codice toglilo, perchè altrimenti non ti renderai mai conto degli
errori che scrivi.
Nel tuo caso, l'unica reale esigenza di avere un On Error è questa
riga all'inizio
arrSize = UBound(mioArr)
sempre perchè alla prima chiamata UBound pu' dare errore; fatto questo
però puoi resettare il trapping.... più corretto è quindi
On Error Resume Next
arrSize = UBound(mioArr, 2)
On Error Goto 0
'da qui in poi, eventuali errori di runtime vengono scatenati
normalmente
Nota anche che chiamata corretta a UBound(), nel tuo caso l'array ha 2
dimensioni, quindi devi specificare esattamente quale vuoi testare.
Detto questo, devi appunto considerare il caso in cui l'array non sia
ancora stato dimensionato (prima chiamata alla funzione) e regolarti
di conseguenza; fai anche bene attenzione a come ragionano gli indici
degli array, perchè nel tuo codice c'è un sacco di confusione tra base
0 e base 1... nel dubbio, quando fai Redim, usa sempre la sintassi
estesa "x To y" così non fai confusione tra indice minimo e massimo.
Ecco il tuo codice riveduto e corretto, con solo le modifiche minime:
Sub miasub(valore1 As String, valore2 As String)
    Dim i As Integer
    Dim fnd As Boolean
    Dim arrSize As Integer
    'inizializziamo a -1 per evitare ambiguità
    arrSize = -1
    On Error Resume Next
    arrSize = UBound(mioArr, 2)
    On Error GoTo 0
    'se Ubound va in errore, vuol dire che mioArr è ancora vuoto
    'ovvero sei al primo giro; arrSize resta quindi -1
    fnd = False
    'vedi sopra; al primo giro è inutile fare il ciclo,
    'certamente l'elemento non sarà trovato.
    If arrSize >= 0 Then
        For i = 0 To arrSize
            If Trim(mioArr(0, i)) = Trim(valore1) Then
                mioArr(1, i) = mioArr(1, i) + valore2
                fnd = True
                Debug.Print mioArr(0, i) & " - " & mioArr(1, i)
            End If
        Next
    End If
    If fnd = False Then
        arrSize = arrSize + 1
        ReDim Preserve mioArr(0 To 1, 0 To arrSize)
        mioArr(0, arrSize) = Trim(valore1)
        mioArr(1, arrSize) = valore2
    End If
End Sub
Nota che molto probabilmente ancora non farà quello che ti serve;
questo perchè come ti ha già detto Wodka, stai lavorando con Variant,
e questa istruzione
mioArr(1, i) + valore2
non ti darà il risultato che pensi
Se hai valori eterogenei, ma sai con esattezza che alla posizione
(0,x) avrai sempre una stringa, alla (1, x) un Double ecc... se è
davvero così, allora stai ragionando in termini di classici array di
record; la soluzione più pratica non è quella di farli
multidimensionali come stai facendo tu, ma di fare invece un array
MONOdimensionale di user defined types.
Esempio:
Public Type MioRecord
   valore1 As String
   valore2 As Double
End Type
Public mioArr() As MioRecord
la funzione a questo punto è facilmente adattata, e penso che già solo
a occhio, è chiaro come utilizzare il type suddetto:
Sub miasub(valore1 As String, valore2 As Double)
    Dim i As Integer
    Dim fnd As Boolean
    Dim arrSize As Integer
    arrSize = -1
    On Error Resume Next
    'ora la dimensione è solo una, va bene senza parametro
    arrSize = UBound(mioArr)
    On Error GoTo 0
    fnd = False
    If arrSize >= 0 Then
        For i = 0 To arrSize
            If Trim(mioArr(i).valore1) = Trim(valore1) Then
                mioArr(i).valore2 = mioArr(i).valore2 + valore2
                fnd = True
                Debug.Print mioArr(i).valore1 & " - " & mioArr
(i).valore2
            End If
        Next
    End If
    If fnd = False Then
        arrSize = arrSize + 1
        ReDim Preserve mioArr(0 To arrSize)
        mioArr(arrSize).valore1 = Trim(valore1)
        mioArr(arrSize).valore2 = valore2
    End If
End Sub

 End Sub
ottima la define type! Io ho risolto con un cdbl(mioarr(1,i))+valore2, ma 
senza dubbio la soluzione del define type e vettore di type � assolutamente 
migliore!
Grazie 1000
Dade