PDA

Visualizza la versione completa : Caricamento array in Vb


mister bit
31-07-2001, 16:51
Ho inserito sul form N TextBox creando una "matrice di controlli", dunque hanno tutti lo stesso nome seguito da un indice che parte da 0: TextBox(0), TextBox(1) ...
Ora, i valori inseriti in queste TextBox voglio caricarli in un array A. Ho scritto questo codice:

Dim A() As Double
Dim i As Integer
Dim j As Integer
For i = 0 To N - 1
j = i + 1
A(j) = TextBox(i).Text
Next i

Quando avvio il programma ricevo sempre il messaggio:
"indice non compreso nell'intervallo"
e risulta evidenziata la riga:
A(j) = TextBox(i).Text

Sapete dirmi qual è il problema?
Grazie

ans
31-07-2001, 17:12
Prima del For fai un Redim A(N) inizializzando a al valore di N.

mister bit
31-07-2001, 20:42
Grazie, ha funzionato. Ho semplicemente aggiunto la riga:

ReDim A(N) As Double

prima del For

Dim A() As Double
Dim i As Integer
Dim j As Integer
ReDim A(N) As Double
For i = 0 To N - 1
j = i + 1
A(j) = TextBox(i).Text
Next i

In realtà non capisco bene il significato di questo comando Redim. Sapresti spiegarmelo? Perchè è necessario?
Grazie

ans
01-08-2001, 01:02
Redim serve per modificare la dimensione di un array una volta impostata, permettendoti anche di non perderne il contenuto. Quando crei un array con Dim di una certa dimensione se vuoi modificare tale dimensione in questo caso si usa Redim Preserve per non perderne il contenuto, una Dim con un nuovo valore ti andrebbe a cancellare il contenuto dell'array. Si usa anche quando crei un array e non sai di quanti elementi deve essere, quando il numero di elementi ti è noto allora con Redim puoi impostargli la dimensione. Con gli array dinamici, cioè array nei quali la dimensione in fase di creazione non è specificata, il Redim non dovrebbe servire in quanto dovrebbe modificarsi in automatico la dimensione, spesso pero' non accade, non so ancora bene il motivo, come il tuo caso in cui l'array creato non aveva dimensione, per questo di dava errore, non c'erano indici disponibili. Dai anche un'occhiata all'help di VB, e dato che devi usare gli array non si sa mai possano servirti cerca Join e Split, Join dato un array ti crea una stringa contenente gli elementi dell'array separati da un delimitatore, Split ti crea un array partendo da una stringa contenente elementi separati da un delimitatore. Sono funzioni spesso molto utili.

mister bit
01-08-2001, 10:08
Grazie infinite, mi sei stato di grande aiuto.
Credo che siano veramente utilissimi anche quei comandi Join e Split di cui mi hai parlato; potresti dirmi più o meno come si usano? Ad esempio, se volessi visualizzare il contenuto del mio array A(i) in una label, come dovrei scrivere?
Grazie in anticipo

ans
01-08-2001, 10:26
Esempio 1, JOIN.
Ho un array, ad esempio:
A(1) = "primo"
A(2) = "secondo"
A(3) = "terzo"
..............
Per visualizzare tutti gli elementi dell'array in una label
Label1.Caption = Join(A())
In questo caso come delimitatore per ogni elemento viene usato lo spazio, altrimenti se voglio separare gli elementi con un altro carattere la Join diventa Join(A(),carattere).
Ad esempio puo' servirmi visulizzarli su più righe, usero' come delimitatore il ritorno a capo. Un utilizzo potrebbe essere questo, vuoi sapere se nell'array è presente la parola terzo, senza che in ciclo ti leggi e confronti ogni singolo elemento dell'array fai la Join dell'array in una stringa e poi con l'istruzione Instr controlli se la parola terzo è presente, il tutto con due istruzioni e molto più velocemente, specialmente se l'array è formato da molti elementi.

Esempio 2, SPLIT.
Ho una stringa di questo tipo con elementi separati dalla virgola:
A = "primo,secondo,terzo"
Voglio crearmi un array da questa stringa:
MyArr() = Split(A, ",")
L'array creato avrà base 0, cioè il primo indice è 0.

Che altro, non so se già conosci come ricavarti gli indici superiore ed inferiore di un array, UBOUND(array) e LBOUND(array) per rispettivamente indice superiore ed indice inferiore, nell'esempio di prima della Split vuoi sapere di quanti elementi è l'array restituito Ubound(MyArr()).

Ciao.

mister bit
01-08-2001, 11:36
Ho inserito la riga:

Label.Caption=Join(A())

al termine della mia procedura di caricamento dell'array:

Dim A() As Double
Dim i As Integer
Dim j As Integer
ReDim A(N) As Double
For i = 0 To N - 1
j = i + 1
A(j) = TextBox(i).Text
Next i
Label.Caption=Join(A())

perchè vorrei visualizzare in una Label tutti i valori caricati, ma il programma si ferma in quel punto con il messaggio:

"Chiamata di routine o argomento non valido"

ans
01-08-2001, 11:51
Forse ho dimenticato, funziona con array di stringhe..... se ti serve proprio il tipo double non puoi fare una join in quanto sono numeri e non puo' concatenarli tra loro, la concatenazione la si puo' fare con le stringhe.

mister bit
01-08-2001, 12:03
... e se volessi visualizzare gli elementi del mio array in colonna in un file .txt, o magari .xls?
Come dovrei scrivere?
E il file dovrei crearlo prima o si può creare via codice?

ans
01-08-2001, 13:25
Il tuo array è numerico quindi devi fare un ciclo leggendoti ogni elemento e scrivendolo nel file. Aggiungi il ritorno a capo ad ogni elemento. Il file viene creato in automatico se non esiste. L'istruzione da usare è Open nomefile For Output As #numero, un numero che ti identifichi il file. Per scriverci dentro usa Print #numero, valore, alla fine chiudi il file con Close #numero. Per creare un file Excel è diversa la cosa, ma potresti invece crearti un file con estensione csv, viene letto da excel senza problemi, l'unica cosa i valori da scrivere nel file devono essere tra doppi apici, esempio:
"1"
"2"
....
se vuoi scrivere su più colonne separa i valori con la virgola in questo modo:
"primo elemento","1"
"secondo elemento","2"
...........
Prova anche l'istruzione Write invece di print in questi casi in modo da avere il valore tra doppi apici.

Ciao

Loading