Creazione di un progetto complesso in Visual Basic Net? Lo trovi su Opentraining.it
Corso di Visual Basic:
Decima lezione - Studiare un'applicazione professionale: il Blocco Note di Windows - Seconda parte (a cura di Giorgio Abraini)

Dopo aver inserito il codice per il menù mnuApri, scriviamo quello per mnuSalva: questa volta ci serve una sola variabile, e cioè strNomeFile, perché il testo che dobbiamo scrivere sul file è quello contenuto in txtFile, a cui possiamo accedere attraverso la proprietà Text; quindi non abbiamo bisogno di una variabile per il testo. Per sapere con quale nome salvare il file, usiamo ancora la funzione InputBox:

Dim strNomeFile As String
strNomeFile = InputBox("inserisci il nome del file:")

Ora dobbiamo nuovamente aprire il file (questa volta per scriverci sopra, quindi in modalità output) e scrivere il contenuto del TextBox:

Open strNomeFile For Output As #1
Print #1, txtFile.Text
Close 1

Per scrivere sul file abbiamo usato l'istruzione Print, che ha bisogno di conoscere il numero del file su cui scrivere e i valori da scrivere: questi valori possono essere separati da "," o da ";": la virgola indica che i valori saranno separati, all'interno del file, da una tabulazione, mentre il punto e virgola indica che i valori saranno scritti uno di seguito all'altro. Infine dobbiamo scrivere il codice per il menù Esci: qui basterebbe scrivere "Unload frmNotePad" o "Unload me" come avevamo fatto per il progetto "hello world!", ma dobbiamo assicurarci che non ci siano ancora attività in corso; in particolare, nel nostro caso dobbiamo assicurarci che non ci siano file aperti al momento di chiudere l'applicazione.
E' vero che ogni file viene chiuso dopo aver letto/scritto su di esso, ma questo è quello che avviene in circostanze normali: è possibile che in certi casi si verifichi un qualche errore che impedisca la chiusura del file nelle routine mnuApri e mnuSalva; il programmatore deve essere abbastanza previdente da includere ulteriori controlli al momento di uscire dall'applicazione. E' vero anche che quando un'applicazione termina, Visual Basic si preoccupa di chiudere tutti i file rimasti aperti, ma un controllo in più non fa mai male: è un po' come spegnere le luci e chiudere il gas quando si esce di casa.
Pertanto possiamo scrivere:

Close
Unload Me

L'istruzione Close serve a chiudere il file specificato dal numero passato come argomento all'istruzione (ad es., close 1 chiude il file numero 1); se si usa senza argomenti, close chiude tutti i file, aperti con l'istruzione Open, che non sono ancora stati chiusi; dopo aver chiuso tutti i file eventualmente ancora aperti possiamo uscire dall'applicazione con l'istruzione Unload.
Il nostro editor personale è così del tutto funzionante, tuttavia è ancora ampiamente migliorabile: ad esempio, potremmo inserire la voce di menù "Nuovo" per creare un nuovo file; questo non significa altro che ripulire il txtFile in modo che l'utente possa scrivere il testo del nuovo file: basterebbe quindi fare:

txtFile.Text = ""

In realtà questo non è sufficiente, perché bisogna controllare se sono state effettuate modifiche al testo dall'ultimo salvataggio: in questo caso, infatti, il programma dovrebbe chiedere gentilmente all'utente se vuole salvare le modifiche. Per realizzare questo controllo abbiamo bisogno di una variabile che ci dica se il testo è cambiato dall'ultimo salvataggio oppure no: dato che le possibilità sono solo due (il testo è cambiato/il testo non è cambiato) è opportuno utilizzare una variabile booleana che valga false se il testo non è cambiato e true se il testo è cambiato; per capire quando il testo cambia si può semplicemente sfruttare l'evento change del txtFile, che viene appunto generato quando il valore della proprietà txtFile.Text cambia.
Questa variabile però non può essere locale rispetto alla routine txtFile_Change, perché deve essere visibile anche nel menù Nuovo, quindi bisogna dichiararla a livello di modulo; allora scriviamo, nella sezione dichiarazioni del frmNotePad:

Dim blnTextChanged As Boolean

e nella routine txtFile_Change:

blnTextChanged = True

Non basta: non dobbiamo soltanto impostare a true blnTextChanged quando il testo cambia, ma dobbiamo anche impostare la variabile a False quando i cambiamenti vengono salvati su un file; perciò, nella routine mnuSalva_Click scriviamo alla fine:

blnTextChanged = False

Ora torniamo al menù Nuovo: innanzitutto bisogna inserirlo nel menù File, quindi apriamo il menù editor, selezioniamo dalla lista la voce "Apri", premiamo il pulsante "Inserisci" e infine scriviamo la caption "Nuovo" e il nome "mnuNuovo"; ora dall'editor del codice selezioniamo la routine mnuNuovo_Click: qui dobbiamo inserire il controllo per verificare se il testo è cambiato o no.
Trattandosi di un controllo, dobbiamo usare l'istruzione If...Then, secondo questo schema:

If blnTextChanged Then
'il testo è cambiato, quindi chiediamo all'utente se vuole salvare le modifiche
Else
'il testo non è cambiato, quindi basta svuotare il txtFile
End If

Per chiedere all'utente se vuole salvare le modifiche, in teoria potremmo utilizzare ancora la funzione inputbox: ma in questo caso è molto più conveniente usare un MessageBox, ovvero una di quelle normalissime finestre di Windows che visualizzano un messaggio chiedendoci cosa vogliamo fare: esattamente la stessa finestra che ci mostra proprio il Blocco Note quando non abbiamo salvato le modifiche a un file.
Per far apparire questa finestra dobbiamo usare l'istruzione MsgBox, la cui sintassi è questa:

msgbox prompt, buttons, title, helpfile, context

Tralasciando gli ultimi due argomenti, il prompt è il messaggio vero e proprio visualizzato nella finestra; title è invece il titolo della finestra di messaggio; il parametro buttons è un numero che indica lo "stile" del MessaGebox, ovvero indica quali pulsanti devono essere associati alla finestra: ad ogni pulsante o combinazione di pulsanti è associata una costante di Visual Basic, così che per visualizzare, ad es., i pulsanti "sì" e "no", basta scrivere vbYesNo al posto del parametro buttons, anche se è possibile scrivere direttamente il valore della costante vbYesNo, e cioè 4.
Analoghe costanti sono associate all'icona che è possibile visualizzare nel messaggio: per visualizzare i pulsanti e un'icona è perciò sufficiente fare la somma dei relativi valori; il principio è lo stesso dell'esempio sulle proprietà di un file che abbiamo visto nella lez. 9.
Per i nostri scopi potremmo utilizzare un'istruzione del genere:

MsgBox "Il testo è stato modificato. Vuoi salvare le modifiche?", _
vbYesNo+vbQuestion, "Conferma salvataggio"

ma questa istruzione non fa altro che visualizzare il messaggio: noi invece vogliamo anche sapere qual è la risposta dell'utente, cioè vogliamo sapere qual è il valore restituito dalla funzione MsgBox; ertanto dobbiamo usare msgbox con le parentesi, come se fosse una funzione e non una semplice istruzione, in modo che restituisca un valore.
Tale valore è una costante che rappresenta il pulsante premuto dall'utente: ad es., la costante vbOK vale 1 e indica che l'utente ha premuto il pulsante ok; pertanto noi dovremmo fare un controllo di questo tipo:

Dim intRisposta As Integer
intRisposta = MsgBox("Il testo è stato modificato. Vuoi salvare le modifiche?", _
vbYesNo+vbQuestion, "Conferma salvataggio")
If intRisposta = vbYes Then
'salviamo le modifiche
Else
'non salviamo le modifiche
End If

Per salvare le modifiche dovremmo scrivere istruzioni analoghe a quelle utilizzate nella routine mnuSalva_Click: ma chi ce lo fa fare di ripetere le medesime istruzioni, quando abbiamo già una routine bell'e pronta? Basterà semplicemente richiamarla.
In definitiva, la routine mnuNuovo_click sarà così:

Dim intRisposta As Integer
If blnTextChanged Then
intRisposta = MsgBox("Il testo è stato modificato. Vuoi salvare le modifiche?", _
vbYesNo+vbQuestion, "Conferma salvataggio")
If intRisposta = vbYes Then
'richiamo la routine che permette di salvare le modifiche
mnuSalva_Click
Else
txtFile.Text = ""
End If
Else
txtFile.Text = ""
End If

Nella prossima lezione apporteremo ulteriori miglioramenti al nostro Blocco Note personale.

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
E-mail:
vbitalia@libero.it