|
Dopo aver spiegato e posizionato i vari controlli con le proprietà adatte, si deve stendere il codice che permette al programma di
leggere i file e visualizarli correttamente. Ecco il sorgente commentato:
Class Form1
Private Sub ReadFile(ByVal File As String)
'Lo stream da cui leggere il file
Dim Reader As New IO.StreamReader(File)
'Una stringa che rappresenta ogni singola riga del file
Dim Line As String
'L'indice associato al numero di campi letti. Dato che ogni
'campo costituirà una radice del grafico, bisogna sapere da
'dove far derivare i relativi valori.
'Questa variabile è opzionale, in quanto è possibile usare
'la proprietà trwIni.Nodes.Count-1, poichè si aggiungono
'valori sempre soltanto all'ultimo campo aperto
Dim FieldCount As Int16 = -1
'Imposta il testo della label di stato
lblStatus.Text = "Apertura del file in corso..."
'Finchè non si raggiunge la fine del file si continua
'a leggere
While Not Reader.EndOfStream
'Leggiamo una linea di file (S)
Line = Reader.ReadLine
'Se la linea è diversa da una riga vuota
If Line <> Nothing Then
'Se la linea inizia per "[" (significa che è
'un campo)
If Line.StartsWith("[") Then
'Si aumenta FieldCount, che indica quanti campi
'si sono già letti (in base 0)
FieldCount += 1
'Rimuove il primo carattere, ossia "["
Line = Line.Remove(0, 1)
'Rimuove dalla linea l'ultimo carattere,
'ossia "]"
Line = Line.Remove(Line.Length - 1, 1)
'Aggiunge una radice alla TreeView
trwIni.Nodes.Add(Line)
Else
'Altrimenti, se la linea non inzia per ";",
'ossia non è un commento
If Not Line.StartsWith(";") Then
'Aggiunge la linea come sotto-nodo
'dell'ultimo campo inserito. La linea
'conterrà il valore in forma
' [nome]=[contenuto]
'Attenzione! Possono esserci commenti in
'riga, quindi si deve prima controllare
'di eliminarli
'Se l'indice del carattere ";" nella riga
'è positivo...
If Line.IndexOf(";") > 0 Then
'Rimuove tutto quello che viene dopo
'il commento
Line = Line.Remove(Line.IndexOf(";"))
End If
trwIni.Nodes(FieldCount).Nodes.Add(Line)
End If
End If
End If
End While
'Chiude il file
Reader.Close()
lblStatus.Text = "File aperto"
End Sub
Private Sub strOpen_Click(ByVal sender As Object, _
ByVal e As EventArgs) Handles strOpen.Click
'Ecco un esempio di OpenFileDialog da codice
Dim FOpen As New OpenFileDialog
FOpen.Filter = "Impostazioni di configurazione|*.ini"
If FOpen.ShowDialog = Windows.Forms.DialogResult.OK Then
ReadFile(FOpen.FileName)
End If
End Sub
Private Sub strExit_Click(ByVal sender As Object, _
ByVal e As EventArgs) Handles strExit.Click
'Esce dal programma, chiudendo il form corrente
Me.Close()
End Sub
Private Sub strClearList_Click(ByVal sender As Object, _
ByVal e As EventArgs) Handles strClearList.Click
'Mostra un messaggio di conferma prima di procedere
If MessageBox.Show("Eliminare tutti gli elementi dela lista?", _
"INI Reader", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = _
Windows.Forms.DialogResult.No Then
'Se si risponde di no, esce dalla procedura
Exit Sub
End If
'Elimina tutti i nodi
trwIni.Nodes.Clear()
End Sub
End Class
Il codice degli eventi è molto semplice, mentre più interessante è quello della procedura ReadFile. Per avere una panoramica delle operazioni
sulle stringhe usate, vedere capitolo relativo. Per quanto riguarda la logica del sorgente, ecco una breve spiegazione: viene letto il file
riga per riga e, sulla base delle condizioni che si incontrano man mano, vengono eseguite istruzioni diverse:
- La linea è vuota : può capitare che si lascino linee di testo vuote per separare ulteriormente i campi o valori dell'interno dello stesso
campo; in questo caso, poichè non c'è niente da leggere, semplicemente si passa oltre
- La linea inizia per "[" : come già detto, in un file ini, i campi sono racchiusi tra parentesi quadre, perciò la linea costituisce
il nome di un campo. Dopo aver eliminato le parentesi con opportune funzioni, si usa il risultato per aggiungere alla TreeView una root mediante
Nodes.Add. Questo metodo accetta, tra i vari overloads, un parametro stringa che costituisce il testo del nodo
- La linea inizia per ";" : è un commento e semplicemente viene omesso. Potreste comunque includerlo come nodo ausiliarlo e colorarlo
con un colore differente
- La linea non ha nessun delle caratteristiche indicate : è un valore. Quindi si aggiunge il suo contenuto come sotto-nodo all'ultimo
nodo root aggiunto, con l'accortezza di controllare prima se ci sono dei commenti cosiddetti in-line e di eliminarli
Ecco uno screenshot di come si preseta il programma finito con un file ini caricato:

Ed ecco uno screenshot di come potreste farlo diventare:

|
|