Introducción
Esta clase que te muestro en este artículo es la que me
fabriqué para guardar y leer los datos de configuración de mis aplicaciones.
En realidad empecé a usarla con Visual Basic 2005, y de hecho el código
usado para generarla es en ese lenguaje, y por eso está en esta sección de
"trucos de .NET 2.0", pero con pequeños cambios la puedes adaptar al Visual
Basic 2003 e incluso al 2002, cuando te indique las "cosillas" que puedes
hacer con esta clase, te indicaré que cambios debes hacer.
Para que puedas probar esta clase, adjunto una aplicación
de prueba, que está hecha con el Visual Basic 2005 usando el Visual Studio
2005 Team Edition para Software Developers, y aunque no la he probado en el
Visual Basic 2005 Express Edition, estoy seguro de que funciona, ya que no
utiliza nada especial que no se instale con la versión gratuita de Visual
Basic 2005.
Pulsa aquí, si
quieres ver un ejemplo anterior para Visual Studio 2003 (VB y C#)
Con fecha del 17/Ago/06 he publicado
la versión
para Visual Studio .NET
(2003)
Actualizado 02/May/06:
Pulsa aquí para ver esta misma clase para usarla con C# 2005
Actualizado 12/Ene/2008:
He
publicado una actualización del código para Visual Basic 2005/2008
Funcionalidad de la clase ConfigXml
Como te puedes imaginar por el título de esta sección, la
clase se llama ConfigXml, Config porque sirve para guardar datos de
configuración y Xml porque ese es el formato que utiliza, de hecho utilizo
instrucciones Xml para leer los nodos del fichero de configuración lo mismo que
para guardarlos.
Pero eso ya lo descubrirás en el código fuente, ahora veamos que métodos y
propiedades tiene la clase:
Propiedad o
método |
Descripción |
GuardarAlAsignar |
True para guardar automáticamente los
valores al asignarlos |
FileName |
El nombre del fichero de configuración |
Leer los valores |
|
GetValue(ByVal seccion As String,
ByVal clave As String) As String |
Leer un dato de la sección y clave
indicadas. |
GetValue(ByVal seccion As String,
ByVal clave As String, ByVal predeterminado As String) As String |
|
GetValue(ByVal seccion As String,
ByVal clave As String, ByVal predeterminado As Integer) As Integer |
Valor devuelto como entero |
GetValue(ByVal seccion As String,
ByVal clave As String, ByVal predeterminado As Boolean) As Boolean |
Valor devuelto como Boolean |
Guardar los
valores como elementos |
|
SetValue(ByVal seccion As String,
ByVal clave As String, ByVal valor As String) |
Guardar un valor en la sección y clave
indicadas. |
SetValue(ByVal seccion As String,
ByVal clave As String, ByVal valor As Integer) |
Guardar un valor entero |
SetValue(ByVal seccion As String,
ByVal clave As String, ByVal valor As Boolean) |
Guardar un valor Boolean, internamente
se guarda como cadena, siendo "0" = False, y "1" = True |
Guardar los
valores como un par key/value |
|
SetKeyValue(ByVal seccion As String,
ByVal clave As String, ByVal valor As String) |
|
SetKeyValue(ByVal seccion As String,
ByVal clave As String, ByVal valor As Integer) |
|
SetKeyValue(ByVal seccion As String,
ByVal clave As String, ByVal valor As Boolean) |
|
|
|
RemoveSection(ByVal seccion As String) |
Eliminar la sección indicada |
Save() |
Guardar físicamente los datos |
Read() |
Leer los datos |
Métodos
exclusivos para .NET 2.0 |
|
Secciones() As List(Of String) |
Devuelve todas las secciones |
Claves(ByVal seccion As String) As
Dictionary(Of String, String) |
Devuelve los valores y claves de la
sección indicada. |
Constructores |
|
New(ByVal fic As String) |
Adivina para que son los
parámetros de los dos constructores |
New(ByVal fic As String, ByVal
guardarAlAsignar As Boolean) |
Como te indico, hay dos métodos que solo funcionarán en .NET 2.0, ya que
devuelven dos tipos generic, el primero de tipo List(Of String)
que lo puedes sustituir por un ArrayList. El otro devuelve una colección
de tipo Dictionary(Of String, String) que puedes sustituir por una
colección de tipo Hashtable.
Aquí tienes el código completo de la clase para Visual
Basic 2005
La aplicación de ejemplo
En el formulario de ejemplo te muestro cómo usar los métodos SetValue
y RemoveSection, además de las dos colecciones que leen las secciones y
el contenido de una sección, ya que en ese formulario de ejemplo hay un ListView
en el que se muestra el contenido del fichero de configuración.
El aspecto del formulario en tiempo de diseño es este:
Figura 1. El formulario de ejemplo en tiempo de diseño
Aquí tienes el código del formulario para Visual
Basic 2005
Espero que te sea de utilidad, que de eso es de lo que se trata.
Nos vemos.
Guillermo
Nerja, 21 de Febrero de 2006
Nota:
El código de la clase
ConfigXml está en la página en la última actualización.
'------------------------------------------------------------------------------
' Prueba de la clase ConfigXml (21/Feb/06)
' para guardar datos de configuración en formato Xml
'
' ©Guillermo 'guille' Som, 2006
'------------------------------------------------------------------------------
Option Strict On
Public Class Form1
Private mCfg As elGuille.info.Util.ConfigXml
Private Sub btnLeer_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles btnLeer.Click
' Leer el fichero
Dim openFD As New OpenFileDialog
openFD.Title = "Selecciona el fichero de configuración"
openFD.Filter = "Configuración|*.cfg;*.config;*.configuration|Todos los ficheros|*.*"
openFD.FileName = txtFic.Text
openFD.Multiselect = False
openFD.CheckFileExists = False
If openFD.ShowDialog = Windows.Forms.DialogResult.OK Then
mCfg = New elGuille.info.Util.ConfigXml(openFD.FileName, True)
actualizarListView()
Dim b As Boolean = True
Me.btnAdd.Enabled = b
Me.btnEliminarSec.Enabled = b
Me.btnGuardar.Enabled = b
End If
End Sub
Private Sub actualizarListView()
ListView1.Items.Clear()
For Each s As String In mCfg.Secciones
For Each s1 As KeyValuePair(Of String, String) In mCfg.Claves(s)
Dim lvi As ListViewItem = ListView1.Items.Add(s)
lvi.SubItems.Add(s1.Key)
lvi.SubItems.Add(s1.Value)
Next
Next
End Sub
Private Sub btnEliminarSec_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles btnEliminarSec.Click
If MessageBox.Show("¿Quieres eliminar la sección " & txtSec.Text & "?", _
"Eliminar sección", _
MessageBoxButtons.YesNo, _
MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
mCfg.RemoveSection(txtSec.Text)
actualizarListView()
End If
End Sub
Private Sub btnAdd_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnAdd.Click
' Añadirlo / actualizarlo y rellenar el ListView
If mCfg Is Nothing Then
MessageBox.Show("Debes indicar el ficehero en el que guardar los datos", _
"Añadir", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Exit Sub
End If
mCfg.SetValue(txtSec.Text, txtClave.Text, txtValor.Text)
actualizarListView()
End Sub
Private Sub ListView1_SelectedIndexChanged(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles ListView1.SelectedIndexChanged
Dim lvi As ListViewItem
If ListView1.SelectedItems.Count > 0 Then
lvi = ListView1.SelectedItems(0)
Me.txtSec.Text = lvi.SubItems(0).Text
Me.txtClave.Text = lvi.SubItems(1).Text
Me.txtValor.Text = lvi.SubItems(2).Text
End If
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' Deshabilitar los botones y controles
' hasta que se indique el fichero
Dim b As Boolean = False
Me.btnAdd.Enabled = b
Me.btnEliminarSec.Enabled = b
Me.btnGuardar.Enabled = b
txtFic.Text = System.IO.Directory.GetCurrentDirectory() & "\prueba.cfg"
End Sub
Private Sub btnGuardar_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnGuardar.Click
' No hace falta si se indica "guardar automáticamente" en el constructor
mCfg.Save()
End Sub
End Class