Corso di Visual Basic

Questo mese il corso dedicato alla programmazione in Visual Basic ha come obbiettivo la gestione dei file di testo, ovvero del più semplice formato di memorizzazione permanente previsto dallo strumento Microsoft

Corso di Visual Basic - parte X

di Maurizio Crespi

La maggior parte delle applicazioni deve essere in grado di memorizzare delle informazioni su un supporto di memoria di massa, costituito in genere da un'unità a disco, in modo tale da renderle reperibili nelle sessioni successive. La struttura destinata ad accogliere questi dati, oggetto di studio in questa lezione, prende il nome di file.

Le soluzioni degli esercizi proposti nella scorsa lezione
Prima di avventurarsi nello studio dei file, è bene focalizzare come di consueto l'attenzione sugli esercizi proposti nello scorso numero. Eccone, in breve, le soluzioni.

Primo esercizio
Il primo esercizio prevede lo sviluppo di una funzione booleana in grado di ricevere come parametro una stringa alfanumerica e di restituire True se essa contiene il nome di un giorno della settimana. In caso contrario, il valore ritornato deve essere False. La soluzione, pressoché banale, è la seguente:

Function Giorno(Stringa As String) As Boolean
Dim Risultato As Boolean
Select Case UCase(Stringa)
Case "LUNEDI", "MARTEDI", "MERCOLEDI", "GIOVEDI", "VENERDI", "SABATO", "DOMENICA"
Risultato = True
Case Else
Risultato = False
End Select
Giorno = Risultato
End Function

Il valore restituito corrisponde a quello della variabile Risultato, che è aggiornato da una semplice struttura Select Case effettuata sulla stringa convertita in maiuscolo.

Secondo esercizio
Il secondo esercizio prevede la realizzazione di una funzione ricorsiva che, dato un parametro n intero positivo passato per valore, sia in grado di restituire la somma dei primi n numeri naturali. La soluzione è rappresentata dalla funzione Calcola descritta di seguito.

Function Calcola(n As Integer)As Long
Dim Somma As Long
If n > 0 Then
Somma = n + Calcola(n - 1)
End If
Calcola = Somma
End Function

Se il parametro n ha un valore non nullo, è sommato al risultato dell'applicazione della funzione a n-1. Se invece n è uguale a zero, si verifica la condizione di uscita.

I file
Un file è un agglomerato di informazioni residente su un supporto di memorizzazione di massa, ovvero su un dispositivo caratterizzato dalla capacità di mantenere i dati anche dopo lo spegnimento e il successivo riavvio del sistema. Di solito si tratta di un'unità a disco fisso o rimovibile. Le informazioni contenute in un file non devono essere necessariamente di tipo omogeneo. Esiste infatti la possibilità di creare dei file strutturati, in grado cioè di contenere elementi di pari caratteristiche, oppure composti da informazioni di natura anche profondamente diversa. Visual Basic permette di creare 3 diversi tipi di file, con accesso sequenziale o casuale. In questa lezione sono oggetto di studio le strutture ad accesso sequenziale.

I file ad accesso sequenziale
Le strutture più elementari sono i file ad accesso sequenziale, il cui uso è in genere riservato alla memorizzazione delle informazioni testuali. Si tratta di strutture organizzate in righe, da utilizzare quando si desidera salvare dei documenti da stampare oppure per la memorizzazione di limitate quantità di dati (come ad esempio quelle riguardanti le impostazioni di un programma). Il vantaggio offerto dai file ad accesso sequenziale è rappresentato dalla semplicità con cui è possibile accedere al loro contenuto mediante un qualsiasi editor di testo, come il Blocco Note di Windows. Sono di questo tipo, ad esempio, i file Win.ini e System.ini, contenenti le informazioni riguardanti la configurazione dell'ambiente Windows a 16 bit. L'organizzazione dei dati, tuttavia, fa sì che le strutture di questo tipo non siano adatte a contenere una grande quantità di informazioni, a causa del dilatarsi dei tempi di accesso dovuto al fatto che la ricerca di un particolare dato può comportare la lettura dell'intero file.

L'apertura di un file sequenziale
Un file, di qualsiasi tipo esso sia, per poter essere utilizzato deve necessariamente essere aperto. È possibile effettuare ciò per mezzo del comando Open, la cui sintassi, per le strutture ad accesso sequenziale, è la seguente:

Open <percorso_file>
[For <modalità>]
As
[#]<numero_identificatore>
[Len=<lunghezza_record>]

dove <percorso_file> è una stringa che identifica il percorso del file che si desidera creare o leggere. Se si sta usando una versione a 32 bit dello strumento e quindi si sta realizzando un'applicazione funzionante solo su Windows 95, 98 o NT, è possibile far uso dei nomi di file lunghi. Ciò non è consentito invece alle applicazioni destinate ad essere compilate con una versione a 16 bit di Visual Basic. In questo caso, occorre adeguarsi al formato previsto da MS-DOS e dalla macchina virtuale a 16 bit di Windows, che prevede un massimo di 8 caratteri per i nomi dei file e di 3 per le estensioni. Il carattere separatore è in tutti i casi costituito dalla barra retroversa "\".Dopo aver specificato il nome del file da gestire, è necessario indicare la modalità con cui si desidera accedere ad esso. La scelta è fra Input, Output e Append. Nel primo caso, il file è aperto in lettura, ovvero è utilizzato esclusivamente per reperire delle informazioni senza effettuare su di esse alcuna modifica. È evidente che l'apertura di un file in questa modalità richiede che esso sia stato in precedenza creato sul disco, altrimenti provoca la notifica di un errore.Diversamente accade invece per i file aperti in output. In questo caso, infatti, si provoca la generazione di una nuova struttura e la sovrascrittura del file eventualmente già presente sul disco con il nome specificato dopo la parola chiave Open. Com'è facile intuire, l'accesso in output ha il fine di permettere la scrittura delle informazioni sui file. In alcuni casi, tuttavia, risulta necessario inserire all'interno di uno di essi dei nuovi dati senza distruggere quelli inseriti in una o più sessioni precedenti. La modalità da utilizzare per raggiungere tale scopo è denominata Append.

Il numero identificatore
Dopo aver dichiarato l'uso che si desidera fare del file, è necessario assegnare ad esso un numero, che ne costituisce un identificatore univoco. Tale valore deve essere un intero compreso fra 1 e 511 e va specificato dopo la parola chiave As. Per le strutture non destinate alla condivisione con altre applicazioni, è opportuno utilizzare i numeri compresi fra 1 e 255, riservando i rimanenti ai file che devono essere resi accessibili da più processi nello stesso momento. Si noti che, per compatibilità con il linguaggio BASIC classico, il numero di identificazione si può far precedere dal carattere #.

Il parametro Len
L'ultimo parametro che resta da esaminare è quello che definisce la lunghezza di ogni blocco di informazioni interessato dalle operazioni di lettura o scrittura. Esso è opzionale e rappresenta la dimensione dello spazio di memoria temporanea (denominato buffer) allocato dal sistema. Tale valore non può essere superiore a 32767.

L'istruzione Close
Se il comando Open rende possibile accedere a un file e crea per esso un identificatore, l'effetto contrario, ovvero il rilascio della struttura e l'eliminazione del numero di riferimento, è sortito dall'istruzione Close. Si supponga di aver aperto un file e di aver assegnato ad esso l'identificatore 1. La riga

Close #1

determina la fine dell'uso della struttura da parte del programma, pur rendendone possibile la successiva riapertura. Il numero di riferimento ritorna così ad essere utilizzabile per la gestione di un altro file.

La lettura di un file di testo
Si supponga di voler realizzare un'applicazione in grado di visualizzare in una casella di testo il contenuto del file di sistema Win.ini. In primo luogo, è necessario disegnare un form analogo a quello rappresentato nella figura 1, in cui è presente una textbox, che si suppone denominata txtTesto. È poi necessario fare in modo che all'avvio del programma essa sia riempita con il testo contenuto nel file da leggere. A tal fine, si può associare il seguente codice all'evento Load del form:

Private Sub Form_Load()
Dim Riga As String
txtTesto.Text = ""
Open "c:\windows\win.ini" For Input As #1
Do Until EOF(1)
Line Input #1, Riga
txtTesto.Text = txtTesto.Text & Riga & Chr$(13) & Chr$(10)
Loop
Close #1
End Sub

Dopo aver eliminato i caratteri eventualmente presenti nella textbox, la procedura provvede ad aprire in input il file, che si suppone contenuto nella cartella "C:\Windows" e ad associargli il numero identificatore 1. Tutte le operazioni che in seguito sono effettuate sul file sono prodotte da istruzioni riceventi tale valore come parametro.Il file da leggere è notoriamente composto da testo organizzato in righe. Lo scopo dell'applicazione illustrata in questo esempio è di leggere tutte le righe e di copiarle, una di seguito all'altra, nella textbox. A tal fine è necessario creare un ciclo in grado di svolgere le operazioni di lettura. La condizione che deve causare il termine delle iterazioni è rappresentata dal raggiungimento della fine del file. Ciò si verifica quando tutti i dati sono stati letti. Il file, tuttavia, potrebbe anche essere vuoto. È pertanto necessario fare in modo che il ciclo preveda il test all'ingresso, ovvero che la condizione sia specificata accanto alla parola chiave Do, al fine di evitare le iterazioni quando essa risulti vera già immediatamente dopo l'esecuzione del comando Open.

La funzione EOF
Un file sequenziale può essere paragonato a un nastro magnetico. Per sapere se l'ipotetica testina di lettura ha raggiunto la posizione di fine, è necessario ricorrere alla funzione EOF (End Of File), alla quale, come di consueto, va passato come parametro il numero identificatore della struttura a cui si desidera far riferimento. Il valore restituito è di tipo logico e vale True se è raggiunta la fine del file; ovviamente, in caso contrario, il risultato è False.

La funzione Line Input
La lettura di una riga di un file di testo è effettuata per mezzo dell'istruzione Line Input. Essa prevede due parametri; il primo è costituito ancora una volta dall'identificatore del file su cui è eseguita l'operazione. Il secondo, invece, è rappresentato dalla variabile di tipo stringa destinata ad ospitare la riga di testo da leggere. Nell'esempio è stata utilizzata la variabile denominata Riga. In esso, il dato letto è aggiunto al contenuto della casella testuale per mezzo dell'operatore di concatenazione di stringhe (&). Si noti che per passare alla riga successiva della textbox si fa uso di una sequenza composta dal carattere di ritorno del carrello (Chr$(13)) e da quello di avanzamento di una riga (Chr$(10)).

La scrittura su un file di testo
Si supponga ora di voler realizzare un programma in grado di effettuare l'esatto contrario del precedente, ovvero di trasferire su un file di testo il contenuto di una textbox. La sua implementazione risulta estremamente semplice. In pratica richiede esclusivamente l'uso di un'istruzione Print.Si consideri il form rappresentato in figura 2, caratterizzato dalla presenza di 3 pulsanti. Il primo è denominato btnCarica ed ha lo scopo di caricare nella textbox txtTesto il contenuto del file di cui è specificato il nome nella casella txtNomeFile. Un secondo pulsante, denominato btnCancella, ha lo scopo di eliminare il contenuto della textbox, mentre il terzo serve per memorizzare in un file le informazioni presenti all'interno del controllo txtTesto. Il codice è riportato nel listato 1. Si noti che la procedura che si occupa del caricamento dei dati è pressoché identica a quella dell'esempio precedente; si differenzia solo perché il nome del file da leggere è acquisito dal controllo txtNomeFile, anziché essere fisso. Il salvataggio del file sul disco è eseguito in modo estremamente semplice; in pratica il programma non deve far altro che aprire il la struttura in output ed eseguire su di essa l'istruzione Print, la quale riceve come parametri, rispettivamente, il numero identificatore e la stringa da scrivere, nella fattispecie costituita dal contenuto del controllo txtTesto.

Un semplice esercizio
Per esercitarsi sugli argomenti esposti, si provi a realizzare un'applicazione in grado di leggere, per mezzo di opportune textbox, tre valori numerici interi e una stringa. Si preveda poi la possibilità di salvarli in un file in seguito alla pressione di un pulsante. Mediante un altro bottone, si faccia in modo che l'utente possa ripristinare all'interno delle caselle di testo i valori salvati sul disco.

Nella prossima lezione…
I file di testo sono solo un tipo di struttura di memorizzazione permanente su supporti di memoria di massa. Visual Basic permette di gestire anche dei file strutturati in modo diverso, adatti per esigenze differenti e per realizzazioni più impegnative, quali ad esempio quelle che accedono a una grande quantità di informazioni in modo non conforme a uno schema rigidamente sequenziale come quello descritto nei paragrafi precedenti. Per sapere com'è possibile fare ciò, occorre semplicemente attendere la prossima lezione.

Bibliografia
Visual Basic 5- McGrawHill – ISBN 88-386-0436-3