Newsgroup: it.comp.lang.visual-basic
Titolo: matrici dinamiche: redim ed ubound

abbiate pieta' di me ma sto cercando di imparare il VB ed oggi e' il mio
secondo giorno di programmazione.
Dunque, nel mio progetto ho dichiarato in un modulo il seguente tipo (per
contenere i dati di un singolo giocatore) e la relativa matrice dinamica
che contiene l'insieme dei giocatori:
Public Type Giocatore
    Nome As String
    HP As Integer
    SP As Integer
    AT As Integer
End Type
Dim mtxGiocatori() As Giocatore
ho creato quindi un form per inserire i dati dei vari giocatori, visto che
vi sono due pulsanti e non volendo ripetere due volte il codice di
inserimento ho creato una funzione per l'inserimento dati.
Private Sub cmdAltro_Click()
    fnInserisciGiocatore
e questa e' la funzione di inserimento:
Function fnInserisciGiocatore()
    On Error GoTo CheckError
        lblProva.Caption = UBound(mtxGiocatori)
        ReDim Preserve mtxGiocatori(UBound(mtxGiocatori) + 1)
        mtxGiocatori(UBound(mtxGiocatori)).Nome = txtNome.Text
        mtxGiocatori(UBound(mtxGiocatori)).HP = txtHP.Text
        mtxGiocatori(UBound(mtxGiocatori)).SP = txtSP.Text
        mtxGiocatori(UBound(mtxGiocatori)).AT = txtAT.Text
    Exit Function
CheckError:
    lblProva.Caption = "errore: " & Err.Number
    If Err.Number = 13 Then
       ReDim mtxGiocatori(1)
    End If
End Function
Inizialmente avevo un errore "errore di run-time 13: tipo non
corrispondente" nella riga
         lblProva.Caption = UBound(mtxGiocatori)
ho ipotizzato che fosse causato dal fatto che non dimensionavo la matrice
prima di usare l'UBound(), infatti aggiungendo all'inizio un ReDim
mtxGiocatore(1) non mi da' l'errore. Dovendo fare il ridimensionamento a 1
solo all'inizio, provo ad inserire il ReDim nel FormLoad ma ricevo un
"errore di compilazione: ReDim non valida", provo ad usare un gestore di
errore come sopra ma ricevo lo stesso errore, eppure se metto l'istruzione
ReDim subito all'inizio (cioe' dopo Function fnInserisciGiocatore()) tutto
funziona, perche'?
altro quesito: come mai l'istruzione
        mtxGiocatori(UBound(mtxGiocatori)).Nome = txtNome.Text
che dovrebbe assegnarmi al campo nome dell'ultimo elemento di mtxGiocatori
il valore della textbox txtNome mi genera invece un "errore run-time 424:
necessario oggetto"?
grazie a tutti quelli che vorranno rispondermi!
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 necessario oggetto"?
Hai usato l'Option Esplicit all'inizio di ogni modulo/form?
Probabilmente non esiste txtNome.
Ciao
--
NeoDataType : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net


quoto!
ciaociao


fighissimo, geniale nella sua semplicità e robustezza !
ciao
CCCP++Mario
CUT


 fighissimo, geniale nella sua semplicità e robustezza !
Visto che ti piace te lo modifico un po' :)
Public Function Count(ByRef Arr() As Quacosa) As Long
    Count = Ubound(Arr) + 1
End Function
Public Sub Add(ByRef Arr() As Quacosa)
    Redim Preserve Arr(0 To Count(Arr))
End Sub
Prova a dare un occhio alla classe ArrayList che ho scritto per VB6
http://www.neodatatype.net/downloads/dir.asp?path=\downloads\VB6\flowChart\s
ources
Richiede:  syscol_arraylist.cls,  IComparable.cls e  IComparer.cls


 Richiede:  syscol_arraylist.cls,  IComparable.cls e  IComparer.cls
Volevo metterle tutte in un progetto di tipo dll, così da averle tutte
insieme, ma prima cerco un volontario che testi (sì, sono pigro :P ) il
metodo .Sort() anche con le classi che implementano IComparable e IComparer.


 insieme
E ovviamente inviarle al Sito Comune :)


 Probabilmente non esiste txtNome.
ho usato strumenti->opzioni->dichiarazione di variabili obbligatoria
non e' equivalente? comunque txtNome e' una textBox del form


 non e' equivalente? comunque txtNome e' una textBox del form
Per i nuovi moduli sì.
Assicurati di averlo come prima riga di ogni modulo, ma credo che il
problema sia quello descritto sopra.
Per il resto, vedi gli altri rami del thread.


 E come?
l'errore avviene a run-time quando viene chiamata la routine incriminata.
Dunque, in un modulo effettuo queste dichiarazioni:
Public Type Giocatore
    Nome As String
    HP As Integer
    SP As Integer
    AT As Integer
End Type
Dim mtxGiocatori() As Giocatore
nel form di inserimento quando viene premuto uno dei due pulsanti viene
chiamata come prima cosa questa routine
Function fnInserisciGiocatore()
    On Error GoTo CheckError
        ReDim Preserve mtxGiocatori(0 To UBound(mtxGiocatori) + 1)
        mtxGiocatori(UBound(mtxGiocatori)).Nome = txtNome.Text
        mtxGiocatori(UBound(mtxGiocatori)).HP = txtHP.Text
        mtxGiocatori(UBound(mtxGiocatori)).SP = txtSP.Text
        mtxGiocatori(UBound(mtxGiocatori)).AT = txtAT.Text
    Exit Function
CheckError:
    lblProva.Caption = "exxore: " & Err.Number & Err.Description
    If Err.Number = 13 Then
        lblProva.Caption = "errore: " & Err.Number
        ReDim mtxGiocatori(0 To 0)
    End If
End Function
teoricamente, alla prima esecuzione non essendo dimensionata la matrice va
in errore e viene ridimensionata a 0 mentre tutte le altre volte viene
correttamente incrementata. Potrei in effetti fare il ridimensionamento
iniziale anche nel form_load ma il problema persiste in identica forma.
L'unica maniera di saltarlo e' spostare la ReDim mtxGiocatori(0 to 0) come
prima istruzione della routine (anche se non fa cio' che voglio, ma salto
l'errore) e ricevo quindi un errore 424: necessario oggetto sulla prima
assegnazione


 Dim mtxGiocatori() As Giocatore
Sostituisci Dim con Public, con la dim hai dichiarato una variabile
"privata" visibile cioe' solamente nel modulo dove e' fisicamente
dichiarata.
Ciao
Roberto
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 dichiarata.
Esatto.
E' il discorso che facevo nel post precedente del comportamento di Redim 
  con variabili fuori dallo scope.
Ciao
-- 
Math Parser : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 wrote in message
ca3v1n$b4r$1...@news.newsland.it...
