Per realizzare un editor di testi bisogna prima di tutto sapere come permettere all'utente di scegliere quale file aprire e in quale file
salvare ciò che verrà scritto. Queste semplici interazioni vengono amministrate da due controlli: OpenFileDialog e SaveFileDialog.
In questo breve capitolo esemplificherò il caso di un semplicissimo editor di testi, con le funzionalità base di apertura e salvataggio
dei file *.txt. Prima di procedere, ecco una lista delle proprietà più significative dei controlli in questione:
- AddExtension : se il nome del file da aprire/salvare non ha un estensione, il controllo l'aggiunge automaticamente sulla base della proprietà DefaultExt o Filter
- CheckFileExists : controlla se il file selezionato esista
- CheckPathExists : controlla se la cartella selezionata esista
- DefaultExt : l'estenzione predefinita su cui si basa la proprietà AddExtension
- FileName : il nome del file visualizzato di default nella textbox del controllo, e modificato dopo l'interazione con l'utente
- Filter : la proprietà più importante dopo FileName. Serve a definire quali tipi di file siano visualizzati dal controllo. Nella finestra
di dialogo, infatti, come mostra l'immagin sopra riportata, poco sotto alla textbox contenente il nome del file, c'è una combobox che permette
di selezionare il "filtro", per l'appunto, ossia quali estensioni prendere in considerazione (nell'esempio "File di testo", con estensione
*.txt, quella che si prenderà in esame nell'esempio). Ci sono delle regole standard per la costruzione della stringa che deve essere passata
a questa proprietà. Il formato corretto è:
Descrizione file|*.estensione1;*.estensione2|Descrizione file|...
Se, quindi, si volessero visualizzare solo file multimediali, divisi in musica e video, questo sarebbe il valore di Filter: "Musica|*.mp3;*.wav;*.wma;*.ogg;*.mid|Video|*.mpg;*.mp4;*.wmv;*.avi". Per i file di testo "File di testo|*.txt" e per tutti i file "Tutti i file|*.*" - InitialDirectory: la cartella iniziale predefinita
- MultiSelect: se vero, si potranno selezionare più file (creando un riquadro col puntatore o selezionandoli manualmente uno ad uno tenendo premuto Ctrl)
- Title: il titolo della finestra di dialogo
- ValidatesName: controlla che i nomi dei file non contengano caratteri vietati
- OverWritePrompt: (solo per SaveFileDialog) controlla se il file selezionato ne sovrascrive un altro e chiede se procedere o no
Esempio: Editor di testi
Dopo aver analizzato le proprietà importanti, si può procedere alla stesura del codice, ma prima una precisazione. Non avendo interfaccia
grafica sulla finestra, ma costituendo windows forms a sè stante, i controlli OpenFileDialog e SaveFileDialog possono essere inseriti nel
designer oppure inizializzati da codice indifferentemente (per quanto riguarda lo scopo). La diversità nell'usare un metodo piuttosto che un altro
sta nel fatto che il primo utilizza sempre lo stesso controllo, che potrebbe dare dei FileName errati in casi speciali, mentre il secondo
ne inizializza uno nuovo ad ogni evento, costando di più in termini di memoria. Nell'esempio seguente utilizzo il primo metodo, ma potrà
capitare che sfrutti anche il secondo in diverse altre occasioni.
Ora si aggiungano i controlli necessari:
- Button : Name = cmdOpen, Text = "Apri", Anchor = Bottom Or Left
- Button : Name = cmdSave, Text = "Salva", Anchor = Bottom Or Right
- Button : Name = cmdClose, Text = "Chiudi", Anchor = Bottom
- TextBox : Name = txtFile, Multiline = True, Anchor = Top Or Right Or Bottom Or Left
- OpenFileDialog : Name = FOpen, Filter = "File di testo|*.txt", FileName = "Testo"
- SaveFileDialog : Name = FSave, Filter = "File di testo|*.txt", DefaultExt = "txt"
Private Sub cmdOpen_Click(ByVal sender As Object, ByVal e As EventArgs)_ Handles cmdOpen.Click 'La funzione ShowDialog visualizza la finestra di dialogo e 'restituisce quale pulsante è stato premuto 'Se il pulsante corrisponde con OK, procediamo If FOpen.ShowDialog = Windows.Forms.DialogResult.OK Then 'Apre un file in lettura 'Usa la proprietà FileName di FOpen, che restituisce il 'path del file selezionato: è sicuro che il file esista 'perchè l'utente ha premuto Ok e non ha chiuso la 'finestra di dialogo Dim R As New IO.StreamReader(FOpen.FileName) 'Legge tutto il testo del file e lo deposita nella textbox txtFile.Text = R.ReadToEnd 'Chiude il file R.Close() End If End Sub Private Sub cmdSve_Click(ByVal sender As Object, ByVal e As EventArgs) _ Handles cmdSave.Click 'Viene visualizzata la finestra di dialogo If FSave.ShowDialog = Windows.Forms.DialogResult.OK Then 'Apre un file in scrittura, di ci si assicura che 'l'utente acconsenta alla sovrascrittura se già esistente 'mediante la proprietà OverwritePrompt Dim W As New IO.StreamWriter(FSave.FileName) 'Scrive tutto il contenuto della textbox nel file W.Write(txtFile.Text) 'Chiude il file W.Close() End If End Sub Private Sub cmdClose_Click(ByVal sender As Object, ByVal e As EventArgs) _ Handles cmdClose.Click If txtFile.Text <> "" And _ FSave.ShowDialog = Windows.Forms.DialogResult.OK Then Dim W As New IO.StreamWriter(FSave.FileName) W.Write(txtFile.Text) W.Close() End If End Sub
Il sorgente può essere reso ancora più breve usando i metodi IO.File.WriteAllText e IO.File.ReadAllText.