Corso di Visual Basic: | ||||||||||||
Quattordicesima lezione - Le matrici, il ciclo For...Next ed il campo minato passo per passo (a cura di
Giorgio Abraini) Oltre ai vettori è possibile utilizzare anche matrici, che non sono altro che vettori a più dimensioni (o meglio, i vettori sono matrici a una sola dimensione). Ad esempio, supponiamo di voler memorizzare le dimensioni di 100 scatole: non ci basterà un vettore con 100 elementi, perché per ogni scatola avremo bisogno di 3 variabili per le 3 dimensioni (altezza, larghezza, profondità), pertanto dovremo utilizzare una matrice:
o anche:
In entrambi i casi (se non avete inserito l'istruzione Option Base 1) avremo una matrice con 100 * 3 = 300 elementi, ovvero con 100 "righe" e 3 "colonne". Per indicare che si vogliono usare più dimensioni, quindi, bisogna separare i limiti di ogni dimensione con una virgola. E' possibile inoltre dichiarare una matrice dinamica, il cui numero di elementi può cambiare nel corso dell'esecuzione del programma: a questo scopo è però necessario usare una parola chiave apposita, ReDim, e dichiarare la matrice senza indicarne le dimensioni:
e successivamente, in un altro punto del codice:
In tal caso è anche possibile utilizzare una variabile, anziché un'espressione costante, per indicare il limite inferiore e/o superiore della matrice, ad esempio:
L'importante è ricordare che il ridimensionamento di una matrice riguarda esclusivamente il numero di elementi, non il loro tipo, né tantomeno il nome della matrice. A proposito del tipo degli elementi, è interessante notare che se essi sono Variant possono contenere a loro volta altre matrici o vettori:
Le istruzioni precedenti definiscono un semplice vettore di quattro elementi e una matrice di 18 (6 righe per 3 colonne) elementi Variant, ad uno dei quali è stato assegnato il nostro vettore: perciò l'elemento 2,0 della matrice non è semplicemente un numero, o una stringa, o un qualunque altro tipo elementare di dato, ma è esso stesso un vettore di 4 elementi. Per accedere a uno dei quattro elementi di MatriceVariant(2,0) bisogna usare questa sintassi:
E' come se la matrice bidimensionale MatriceVariant avesse, nel caso dell'elemento 2,0 (e SOLO per quell'elemento), una terza dimensione data dai 4 elementi del nostro vettore iniziale. Naturalmente il vettore e la matrice restano variabili (o meglio, insiemi di variabili) distinte e indipendenti, e per rendersene conto basta mettere alla prova queste semplici istruzioni:
Nella finestra di debug si leggeranno i valori 20 e 10, perché MatriceVariant(1,1) non risente delle modifiche successive all'assegnazione del vettore all'elemento della matrice. Per utilizzare in modo efficiente i vettori non bisogna trattare gli elementi come se fossero variabili completamente distinte. Supponiamo ad es. di voler inizializzare gli elementi di un vettore a un certo valore: non avrebbe molto senso scrivere:
perché in tal caso sarebbe come utilizzare tre variabili v1, v2, v3, distinte e indipendenti le une dalle altre: in altre parole, non si sfrutterebbe la loro appartenenza a un solo vettore che le comprende tutte. Talvolta è necessario agire in questo modo, ma spesso è molto più conveniente sfruttare la possibilità di accedere ad ogni elemento tramite il suo indice, e questo si fa usando i cicli. Un ciclo non è altro che un gruppo di istruzioni che vengono eseguite ripetutamente, ovvero ciclicamente, fino a che una certa condizione risulta verificata. Di cicli ne esistono vari tipi in Visual Basic, ma quello in assoluto più utilizzato è il ciclo For...Next. Questo ciclo è identificato da due istruzioni, poste rispettivamente all'inizio e alla fine del ciclo:
dove contatore indica una variabile numerica che "conta" quante volte devono essere eseguite le istruzioni comprese nel ciclo: essa assume un valore iniziale (inizio) e viene incrementata dall'istruzione Next fino a raggiungere il valore finale (fine). Approfondiremo più avanti il discorso del ciclo For...Next e degli altri cicli: per ora accontentatevi di sapere che il ciclo viene eseguito fintantoché il valore di contatore è minore o uguale a fine; il nostro esempio precedente risulterebbe trasformato così:
Alla prima esecuzione del ciclo i assume valore 0 e quindi il primo elemento del vettore è inizializzato a 10. Alla seconda esecuzione i è uguale a 1 ed è inizializzato il secondo elemento. Alla terza esecuzione i è uguale a 2 ed è inizializzato il terzo elemento; dopodiché i supera il valore 2 e quindi il ciclo termina. Torniamo alle variabili Variant: queste possono contenere, tra le altre cose, anche riferimenti ad oggetti, e in particolare riferimenti a controlli; è possibile quindi creare vettori o matrici di controlli. Per illustrare meglio questo concetto, realizziamo un altro progetto di esempio: questa volta proviamo a replicare uno dei giochi di Windows più famosi, il "Campo minato". Cominciamo quindi con l'aprire un nuovo progetto "exe standard", e inseriamo nel form un pulsante: ridimensioniamolo fino a farlo diventare un quadrato abbastanza piccolo, cancelliamo la proprietà caption (in realtà questa proprietà non è vuota, ma contiene la stringa nulla) e assegniamo la stringa "Mina" alla proprietà name. Ora selezioniamo il nostro pulsante, copiamolo andando sul menù Modifica o semplicemente premendo ctrl+c, e infine incolliamolo sullo stesso form andando ancora sul menù Modifica o premendo Noi diciamo di Sì, e com'era prevedibile un nuovo pulsante uguale al primo sarà inserito nel form. In realtà i due pulsanti non sono proprio uguali: ciò che cambia è la proprietà Index. Prima di copiare e incollare il nostro pulsante, la sua proprietà Index era vuota: è ovvio che sia così, perché questa proprietà, secondo la guida, "identifica un controllo in una matrice di controlli", e quando il pulsante era ancora da solo non c'era alcuna matrice di controlli. Ora che abbiamo incollato un nuovo pulsante, invece, la matrice di controlli c'è, e pertanto è necessario distinguere i vari pulsanti per mezzo del loro indice: questo indice ha esattamente la stessa funzione dell'indice dei vettori di variabili, solo che ora al posto delle variabili ci sono dei controlli. Continuiamo a incollare i pulsanti fino ad averne, ad esempio, 16 disponendoli in quadrato: non è indispensabile ma è molto meglio se li disponete in modo che l'indice segua un ordine logico, ad esempio procedendo da sinistra verso destra riga per riga. Così nella prima riga ci saranno i pulsanti con indice 0,1,2,3, nella seconda quelli con indice 4,5,6,7, e così via. Ora aggiungiamo due etichette, da mettere nella parte alta del form: lblMine e lblTempo (se volete, impostate la proprietà Alignment a "right"); infine aggiungiamo un menù "Partita" con le voci "Nuova" (il nome sarà "mnuNew") e "Esci" ("mnuExit"), separate da una barra orizzontale: per fare questa barra sarà sufficiente mettere come caption un solo trattino "-" e nient'altro; naturalmente le voci "Nuova", "Esci" e la linea di separazione devono essere gerarchicamente subordinati rispetto al menù "Partita" (v.anche la lez. 9). Resta ancora da inserire un timer, che trovate naturalmente sulla casella degli strumenti (è quello con un orologio come icona): potete metterlo dove volete, tanto risulta invisibile in fase di esecuzione; ora il nostro form è pronto, dobbiamo solo scrivere il codice per far funzionare il gioco, e lo faremo nelle prossime lezioni. |
Archivio: | ||||
Lezioni | Commenta questa lezione | Invia la tua guida | Avviso
per le nuove lezioni | Proponi
un argomento |
Visual Basic Italia©
copyright 2000 - tutti i diritti riservati |