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

Nella lezione precedente abbiamo visto come agire nel caso in cui l'utente abbia apportato modifiche al testo senza salvarle: questo controllo non va effettuato solo se l'utente sceglie di creare un nuovo file, ma anche se ne vuole aprire uno già esistente o se vuole chiudere il programma; quindi dobbiamo modificare anche le routine mnuApri e mnuEsci. In questi casi, però, non c'è bisogno di pulire il TextBox, perciò basterà scrivere:

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 mnuSalva_click 'richiamo la routine che permette
'di salvare le modifiche
End If

La figura sotto mostra il risultato che si ottiene attraverso il codice appena descritto:


Per quanto riguarda l'uscita dal programma, questo controllo viene effettuato solo se l'utente sceglie il menù File->Esci, ma non se preme il pulsante "X" in alto a destra nel form.


In questo secondo caso, infatti, non viene certo richiamata la routine mnuEsci_click, ma viene generato direttamente l'evento Unload del frmNotePad: pertanto saremo noi a richiamare la routine mnuEsci_click dall'evento Unload:

mnuesci_Click

A questo punto, se si cerca di aprire un file senza avere salvato le modifiche al file correntemente aperto, succederà questo: compare un messaggio con la richiesta di confermare il salvataggio delle modifiche; se si risponde sì, comparirà una finestra per chiedere il nome del file da salvare, dopodiché comparirà un'altra finestra per chiedere il nome del file da aprire.
Poiché queste due ultime finestre sono identiche, sarà opportuno differenziarle leggermente per evitare confusioni: basterà a questo scopo specificare il titolo della finestra in questo modo:

strNomeFile = InputBox("Inserisci il nome del file:", "Salva")

nella routine mnuSalva_click, che dà come risultato la seguente finestra:


e:

strNomeFile = InputBox("Inserisci il nome del file:", "Apri")

nella routine mnuApri_click che permette di visualizzare la seguente finestra:


C'è un altro problema: quando si apre un file, il suo contenuto viene caricato in txtFile, e di conseguenza viene generato l'evento Change che imposta blnTextChanged a True; il programma perciò penserà che il testo sia stato modificato dall'utente, anche se in realtà è stato semplicemente aperto.


Per correggere questo "bug" (i "bug", come dovreste sapere, sono gli errori commessi dai programmatori nello sviluppo di un'applicazione), basterà aggiornare blnTextChanged in mnuApri_Click aggiungendo in fondo, DOPO l'istruzione txtFile.Text = strTesto:

blnTextChanged = False

Un altro bug da correggere è quello che si verifica quando il file che abbiamo inserito nell'inputbox non viene trovato: ciò può accadere sia perché abbiamo sbagliato a scrivere il nome del file, sia perché non abbiamo inserito il percorso completo del file; infatti, se manca il percorso, Visual Basic cercherà il file nella directory corrente, che solitamente è quella in cui risiede l'IDE (ad es. c:\programmi\microsoft visual basic\vb98). Per accertarvi di quale sia la directory corrente, potete scrivere, nella finestra immediata:


e premere "invio"; "?" è un carattere che nella finestra immediata ha lo stesso significato di Print, curdir è la funzione che restituisce, appunto, la directory corrente.
Per ovviare a questo inconveniete useremo, al posto del banale InputBox, le finestre di dialogo standard utilizzate da Windows per scegliere i file da aprire o salvare: queste finestre si chiamano CcommonDialog e sono contenute nel file comdlg32.ocx.
Il controllo CommonDialog di norma non è presente nella casella degli strumenti, perciò dobbiamo aggiungerla noi: cliccando col tasto destro del mouse sulla casella degli strumenti, apparirà un menù popup; scegliendo la voce Componenti


apparirà una finestra con una lista di componenti che è possibile aggiungere a quelli standard già presenti nella casella degli strumenti.
Scrollate la lista fino a trovare la voce "Microsoft Common Dialog Control 6.0" (l'ultimo numero potrebbe differire a seconda della versione di Visual Basic installata) e selezionatela, poi premete OK.


Nella casella degli strumenti ci sarà un oggetto in più, il controllo Commondialog: selezionatelo e inseritelo sul frmNotePad (non importa in quale punto, tanto non sarà visibile durante l'esecuzione del programma).
Questo controllo dispone di diverse interessanti proprietà, che approfondiremo a suo tempo: le cose essenziali da sapere sono che per visualizzare la finestra bisogna utilizzare uno dei metodi Show (nel nostro caso serviranno ShowOpen e ShowSave), e che il nome del file scelto dall'utente è contenuto nella proprietà FileName, insieme al percorso completo; invece il semplice nome del file, senza il percorso, è contenuto nella proprietà FileTitle.
Ora, al posto dell'InputBox, possiamo usare:

CommonDialog1.ShowOpen

in mnuApri_click, e:

CommonDialog1.ShowSave

in mnuSalva_click.
Non abbiamo più bisogno della variabile strNomeFile, perché per aprire il file basterà fare:

Open CommonDialog1.FileName For ...

Dato che solitamente col blocco note si aprono i file di testo, impostiamo i tipi di file che è possibile scegliere dalla finestra di dialogo nella casella di riepilogo posta in basso: per fare questo bisogna impostare correttamente la proprietà Filter, secondo questo schema:

descrizione1|filtro1|descrizione2|filtro2

La descrizione è la voce che compare nella casella di riepilogo, mentre il filtro è una stringa che indica quali file visualizzare; il carattere che separa la descrizione dal rispettivo filtro è la pipe (simbolo "|"), che solitamente si trova sulla tastiera sopra "\"; nel nostro caso basterà fare:

CommonDialog1.Filter="File di testo|*.txt|Tutti i file|*.*"

Questa riga si può mettere ad esempio nel Form_Load oppure appena prima di visualizzare la finestra di dialogo, o ancora direttamente nella finestra delle proprietà in fase di progettazione; selezionando, nella finestra di dialogo, il tipo "File di testo", saranno visualizzati solo i file con estensione *.txt; selezionando "Tutti i file" saranno visualizzati tutti i file. Ora il nostro blocco note ha un'aspetto un po' più professionale.
Restano ancora un paio di cose da fare (veramente ce ne sarebbero diverse, ma per ora ci accontentiamo così): se l'utente prova a ridimensionare la finestra, avrà la spiacevole sorpresa che il TextBox non si adegua alle dimensioni del form.
Per rimediare a quest'altro bug, dobbiamo sfruttare l'evento Resize del frmNotePad: questo evento è scatenato da qualunque operazione di ridimensionamento, e noi non dobbiamo fare altro che rendere uguali le dimensioni del txtFile a quelle del frmNotePad; basterà inserire queste due istruzioni:

txtFile.Width = Me.ScaleWidth - 50 txtFile.Height = Me.ScaleHeight - 50

Il "-50" serve solo a lasciare un po' di spazio tra il margine inferiore del txtFile e quello del frmNotePad; ho usato la proprietà ScaleWidth al posto di Width, perché la prima misura l'area interna del form: provate a usare Me.Width e vi accorgerete della differenza.
Il secondo problema è che il txtFile è multiline, ma non ha le ScrollBar: è come se nel "vero" Blocco note fosse impostato "A capo automatico", e per vedere le righe non visibili nel TextBox dobbiamo usare le frecce per muovere il cursore; per risolvere il problema basterà impostare la proprietà ScrollBars del txtFile su "3 - Both", in modo da avere sia quella orizzontale che quella verticale.


Ora il nostro blocco note è pronto: in un'oretta e con circa 40 righe di codice abbiamo replicato in buona parte il Blocco Note di Windows.

Per scaricare il progetto di questa lezione premere qui

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