Crear, guardar y cargar archivo .ini en VB 2008
Tengo un formulario con dos Textbox uno es un contador y el otro un nombre.
Lo que quiero hacer es que al instalar el programa, éste cree el archivo .ini con contador = 1 y nombre= "Nadie" automáticamente.
Luego poder cambiar esos valores y al darle clic en el botón 'Guardar' y se guarden esos datos.
Al cerrar el programa y volverlo a abrir Cargue esos datos ya guardados en los mismos Textbox.
Lo que quiero hacer es que al instalar el programa, éste cree el archivo .ini con contador = 1 y nombre= "Nadie" automáticamente.
Luego poder cambiar esos valores y al darle clic en el botón 'Guardar' y se guarden esos datos.
Al cerrar el programa y volverlo a abrir Cargue esos datos ya guardados en los mismos Textbox.
2 respuestas
Respuesta de denciso
1
1
denciso, Soy una persona multifacética, tanto manejo la informática,...
Busca todo lo relacionado con vb. net en relación a archivos ini en la siguiente liga:
- Compartir respuesta
- Anónimo
ahora mismo
Respuesta de firefenix
1
1
Lo mejor sería que en el evento ONLOAD del formulario comprobase si existe o no el archivo.
Si existe que cargue el texto que incluya según el formato que elijas. Podrías poner, por ejemplo, un * entre ambas variables. Es decir, que si el texto del archivo es 1*NOMBRE, y tras leer todo el texto del archivo (My. Computer. FileSystem. ReadAllText) lo separases según el * (función SPLIT). Luego pondrías cada uno en su sitio.
Un ejemplo podría ser el siguiente:
Const FICHERO as String = "FICHERO.INI"
Private Sub Form1_OnLoad
Dim texto as String
If (My.Computer.FileSystem.FileExist(FICHERO)
texto = My.Computer.FileSystem.ReadAllText(FICHERO)
Else
texto = "1*Nadie"
End If
TextBoxContador.Text = Split(texto, "*")(0)
TextBoxNombre.Text = Split(texto, "*")(1)
End Sub
Sería algo así. Eso sí, esto funcionaría (salvo error tipográfico) en VB 2005. No sé si seguirán siendo esas propiedades y declaración de métodos.
Por supuesto, te dejo para ti las comprobaciones. Por ejemplo, que cuando lea del fichero compruebe que tenga * y que éste no se encuentre ni en la primera ni en la última posición de la cadena. Si estas comprobaciones no se cumplen darían un error bastante grave, pero seguro que sabes solucionarlo. Y si no se te ocurre no dudes en preguntar.
Si existe que cargue el texto que incluya según el formato que elijas. Podrías poner, por ejemplo, un * entre ambas variables. Es decir, que si el texto del archivo es 1*NOMBRE, y tras leer todo el texto del archivo (My. Computer. FileSystem. ReadAllText) lo separases según el * (función SPLIT). Luego pondrías cada uno en su sitio.
Un ejemplo podría ser el siguiente:
Const FICHERO as String = "FICHERO.INI"
Private Sub Form1_OnLoad
Dim texto as String
If (My.Computer.FileSystem.FileExist(FICHERO)
texto = My.Computer.FileSystem.ReadAllText(FICHERO)
Else
texto = "1*Nadie"
End If
TextBoxContador.Text = Split(texto, "*")(0)
TextBoxNombre.Text = Split(texto, "*")(1)
End Sub
Sería algo así. Eso sí, esto funcionaría (salvo error tipográfico) en VB 2005. No sé si seguirán siendo esas propiedades y declaración de métodos.
Por supuesto, te dejo para ti las comprobaciones. Por ejemplo, que cuando lea del fichero compruebe que tenga * y que éste no se encuentre ni en la primera ni en la última posición de la cadena. Si estas comprobaciones no se cumplen darían un error bastante grave, pero seguro que sabes solucionarlo. Y si no se te ocurre no dudes en preguntar.
Se me olvidó comentarte (aunque supongo que te lo habrás imaginado) que VB también posee el método My. Computer. FileSystem. WriteAllText.
Es decir, que al terminar (y tras comprobar que ninguno de los TextBox son nulos) que guarde el archivo en el evento FormClosing del formulario de la siguiente forma:
My.Computer.FileSystem.WriteAllText(FICHERO, TextBoxContador.Text + "*" + TextBoxNombre.Text, True)
El TRUE último es para que sobrescriba lo que ya tenía escrito en el fichero. Por cierto, si éste no existe lo crea automáticamente.
Es decir, que al terminar (y tras comprobar que ninguno de los TextBox son nulos) que guarde el archivo en el evento FormClosing del formulario de la siguiente forma:
My.Computer.FileSystem.WriteAllText(FICHERO, TextBoxContador.Text + "*" + TextBoxNombre.Text, True)
El TRUE último es para que sobrescriba lo que ya tenía escrito en el fichero. Por cierto, si éste no existe lo crea automáticamente.
Ok amigo tome encuenta tu ayuda. Lo que también utilice es un modulo:
Module Ini
Public Class ArchivosIni
' Funciones API
Private Declare Ansi Function GetPrivateProfileString Lib "kernel32.dll" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As System.Text.StringBuilder, ByVal nSize As Integer, ByVal lpFileName As String) As Integer
Private Declare Ansi Function WritePrivateProfileString Lib "kernel32.dll" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Integer
Private Declare Ansi Function GetPrivateProfileInt Lib "kernel32.dll" Alias "GetPrivateProfileIntA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal nDefault As Integer, ByVal lpFileName As String) As Integer
Private Declare Ansi Function FlushPrivateProfileString Lib "kernel32.dll" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As Integer, ByVal lpKeyName As Integer, ByVal lpString As Integer, ByVal lpFileName As String) As Integer
Dim strFilename As String
' Constructor, acepta un nombre de fichero (si no existe se creará)
Public Sub New(ByVal Filename As String)
strFilename = Filename
End Sub
' Propiedad para Read-only
ReadOnly Property FileName() As String
Get
Return strFilename
End Get
End Property
Public Function ObtenerString(ByVal Seccion As String, ByVal Clave As String, ByVal [Default] As String) As String
' Devuelve una cadena desde tu archivo INI
Dim intCharCount As Integer
Dim objResult As New System.Text.StringBuilder(256)
intCharCount = GetPrivateProfileString(Seccion, Clave, [Default], objResult, objResult.Capacity, strFilename)
If intCharCount > 0 Then ObtenerString = Left(objResult.ToString, intCharCount)
End Function
Public Function ObtenerInteger(ByVal Seccion As String, ByVal Clave As String, ByVal [Default] As Integer) As Integer
' Devuelve un número desde tu archivo INI
Return GetPrivateProfileInt(Seccion, Clave, [Default], strFilename)
End Function
Public Function ObtenerBoolean(ByVal Seccion As String, ByVal Clave As String, ByVal [Default] As Boolean) As Boolean
' Devuelve un valo lógico desde un archivo INI
Return ObtenerString(Seccion, Clave, [Default])
End Function
Public Sub EscrbirString(ByVal Seccion As String, ByVal Clave As String, ByVal Valor As String)
' Escribe una cadena a un archivo INI
WritePrivateProfileString(Seccion, Clave, Valor, strFilename)
Flush()
End Sub
Public Sub EscrbirInteger(ByVal Seccion As String, ByVal Clave As String, ByVal Valor As Integer)
' Escribe un número a un archivo INI
EscrbirString(Seccion, Clave, CStr(Valor))
Flush()
End Sub
Public Sub EscrbirBoolean(ByVal Seccion As String, ByVal Clave As String, ByVal Valor As Boolean)
' Escribe un valor logico a un arhcivo INI
EscrbirString(Seccion, Clave, Valor)
Flush()
End Sub
Private Sub Flush()
' Stores all the cached changes to your INI file
' Guarda todos los cambios al archivo INI
FlushPrivateProfileString(0, 0, 0, strFilename)
End Sub
End Class
End Module
Con este modulo podemos escribir y leer ( integer, string y boolean) valores de un archivo *.ini
Y cuando quería guardar los datos:
Public Class autorelleno_frm
Private Archivo_Ini As New ArchivosIni("C:\Config.ini")
'Para guardar los datos
Private Sub guardar_btn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles guardar_btn.Click
'Escribimos los cambios en el .ini
Archivo_Ini.EscrbirString("Encargado", "Nombre", encargado_txt.Text)
Archivo_Ini.EscrbirInteger("Recarga", "Inicio", iniciar_txt.Text)
'Mostramos un mesaje afirmando los cambios
MsgBox("Los datos se guardaron con éxito!", MsgBoxStyle.Information)
'Asignamos los cambios hechos al nombre del encargado
encargado_btn.Text = Archivo_Ini.ObtenerString("Encargado", "Nombre", "Nadie")
End Sub
'Para cargar los datos guardados en el .ini al iniciar el programa
Private Sub autorelleno_frm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim Arch = CreateObject("Scripting.FileSystemObject")
'Comprobamos si existe el Archivo .ini
If Arch.FileExists("C:\Config.ini") Then
'Leemos los datos almacenados en el .ini
Dim Archivo_Ini As New ArchivosIni("C:\Config.ini")
Dim strData As String = Archivo_Ini.ObtenerString("Encargado", "Nombre", "Nadie")
Dim recarga As Integer = Archivo_Ini.ObtenerInteger("Recarga", "Inicio", 1)
'Asignamos los datos encontrados en el .ini a los diferentes controles
encargado_btn.Text = strData
encargado_txt.Text = strData
Else
'Si no encuentra el Archivo .ini
'Muestra un msg preguntado que es lo que pasa
If MsgBox("¿Recien me instalaste?", vbQuestion + vbYesNo + vbDefaultButton2, "¿Qué haz hecho?") = MsgBoxResult.No Then
'Si se borro el archivo manda un mensaje y pide que ingrese los datos otra vez
MsgBox("Borraste el archivo que necesito", MsgBoxStyle.Exclamation, "No lo hagas otra vez!!")
End If
End If
End Sub
End Class
Así fue como lo desarrolle y me dio muy buen resultado.
Gracias por tu ayuda, espero que me aceptes cualquier otra consulta
Module Ini
Public Class ArchivosIni
' Funciones API
Private Declare Ansi Function GetPrivateProfileString Lib "kernel32.dll" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As System.Text.StringBuilder, ByVal nSize As Integer, ByVal lpFileName As String) As Integer
Private Declare Ansi Function WritePrivateProfileString Lib "kernel32.dll" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Integer
Private Declare Ansi Function GetPrivateProfileInt Lib "kernel32.dll" Alias "GetPrivateProfileIntA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal nDefault As Integer, ByVal lpFileName As String) As Integer
Private Declare Ansi Function FlushPrivateProfileString Lib "kernel32.dll" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As Integer, ByVal lpKeyName As Integer, ByVal lpString As Integer, ByVal lpFileName As String) As Integer
Dim strFilename As String
' Constructor, acepta un nombre de fichero (si no existe se creará)
Public Sub New(ByVal Filename As String)
strFilename = Filename
End Sub
' Propiedad para Read-only
ReadOnly Property FileName() As String
Get
Return strFilename
End Get
End Property
Public Function ObtenerString(ByVal Seccion As String, ByVal Clave As String, ByVal [Default] As String) As String
' Devuelve una cadena desde tu archivo INI
Dim intCharCount As Integer
Dim objResult As New System.Text.StringBuilder(256)
intCharCount = GetPrivateProfileString(Seccion, Clave, [Default], objResult, objResult.Capacity, strFilename)
If intCharCount > 0 Then ObtenerString = Left(objResult.ToString, intCharCount)
End Function
Public Function ObtenerInteger(ByVal Seccion As String, ByVal Clave As String, ByVal [Default] As Integer) As Integer
' Devuelve un número desde tu archivo INI
Return GetPrivateProfileInt(Seccion, Clave, [Default], strFilename)
End Function
Public Function ObtenerBoolean(ByVal Seccion As String, ByVal Clave As String, ByVal [Default] As Boolean) As Boolean
' Devuelve un valo lógico desde un archivo INI
Return ObtenerString(Seccion, Clave, [Default])
End Function
Public Sub EscrbirString(ByVal Seccion As String, ByVal Clave As String, ByVal Valor As String)
' Escribe una cadena a un archivo INI
WritePrivateProfileString(Seccion, Clave, Valor, strFilename)
Flush()
End Sub
Public Sub EscrbirInteger(ByVal Seccion As String, ByVal Clave As String, ByVal Valor As Integer)
' Escribe un número a un archivo INI
EscrbirString(Seccion, Clave, CStr(Valor))
Flush()
End Sub
Public Sub EscrbirBoolean(ByVal Seccion As String, ByVal Clave As String, ByVal Valor As Boolean)
' Escribe un valor logico a un arhcivo INI
EscrbirString(Seccion, Clave, Valor)
Flush()
End Sub
Private Sub Flush()
' Stores all the cached changes to your INI file
' Guarda todos los cambios al archivo INI
FlushPrivateProfileString(0, 0, 0, strFilename)
End Sub
End Class
End Module
Con este modulo podemos escribir y leer ( integer, string y boolean) valores de un archivo *.ini
Y cuando quería guardar los datos:
Public Class autorelleno_frm
Private Archivo_Ini As New ArchivosIni("C:\Config.ini")
'Para guardar los datos
Private Sub guardar_btn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles guardar_btn.Click
'Escribimos los cambios en el .ini
Archivo_Ini.EscrbirString("Encargado", "Nombre", encargado_txt.Text)
Archivo_Ini.EscrbirInteger("Recarga", "Inicio", iniciar_txt.Text)
'Mostramos un mesaje afirmando los cambios
MsgBox("Los datos se guardaron con éxito!", MsgBoxStyle.Information)
'Asignamos los cambios hechos al nombre del encargado
encargado_btn.Text = Archivo_Ini.ObtenerString("Encargado", "Nombre", "Nadie")
End Sub
'Para cargar los datos guardados en el .ini al iniciar el programa
Private Sub autorelleno_frm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim Arch = CreateObject("Scripting.FileSystemObject")
'Comprobamos si existe el Archivo .ini
If Arch.FileExists("C:\Config.ini") Then
'Leemos los datos almacenados en el .ini
Dim Archivo_Ini As New ArchivosIni("C:\Config.ini")
Dim strData As String = Archivo_Ini.ObtenerString("Encargado", "Nombre", "Nadie")
Dim recarga As Integer = Archivo_Ini.ObtenerInteger("Recarga", "Inicio", 1)
'Asignamos los datos encontrados en el .ini a los diferentes controles
encargado_btn.Text = strData
encargado_txt.Text = strData
Else
'Si no encuentra el Archivo .ini
'Muestra un msg preguntado que es lo que pasa
If MsgBox("¿Recien me instalaste?", vbQuestion + vbYesNo + vbDefaultButton2, "¿Qué haz hecho?") = MsgBoxResult.No Then
'Si se borro el archivo manda un mensaje y pide que ingrese los datos otra vez
MsgBox("Borraste el archivo que necesito", MsgBoxStyle.Exclamation, "No lo hagas otra vez!!")
End If
End If
End Sub
End Class
Así fue como lo desarrolle y me dio muy buen resultado.
Gracias por tu ayuda, espero que me aceptes cualquier otra consulta
Por supuesto. En cualquier duda que tengas con respecto tan sólo avísame y veré en qué puedo ayudarte.
Con respecto a todo ese código que has insertado (un buen trozo, por cierto) permíteme darte mis comentarios personales:
1.- Está muy bien comentado. Enhorabuena.
2.- Veo que sabes usar bien las librerías. Enhorabuena por ello también.
3.- Muy ocurrentes los mensajes que aparecen si no existe el archivo, pero cuida la ortografía. Es un detalle muy feo cuando el cliente lo está viendo (aunque solo sea uno mismo).
4.- Veo que has interpretado de otra forma el código que te di. Me gusta la nueva forma de hacerlo. Veo que eres un programador con experiencia.
Para terminar disculpa si algunas de estas críticas no te ha gustado. Es algo de mi propia naturaleza, ver lo que hacen los demás y darle mis opiniones. De esta forma aprenden ambas partes.
Suerte y no te olvides de puntuar. Hasta otra!
Con respecto a todo ese código que has insertado (un buen trozo, por cierto) permíteme darte mis comentarios personales:
1.- Está muy bien comentado. Enhorabuena.
2.- Veo que sabes usar bien las librerías. Enhorabuena por ello también.
3.- Muy ocurrentes los mensajes que aparecen si no existe el archivo, pero cuida la ortografía. Es un detalle muy feo cuando el cliente lo está viendo (aunque solo sea uno mismo).
4.- Veo que has interpretado de otra forma el código que te di. Me gusta la nueva forma de hacerlo. Veo que eres un programador con experiencia.
Para terminar disculpa si algunas de estas críticas no te ha gustado. Es algo de mi propia naturaleza, ver lo que hacen los demás y darle mis opiniones. De esta forma aprenden ambas partes.
Suerte y no te olvides de puntuar. Hasta otra!
Ok brother cualquier crítica constructiva sera bien recibida, pero ¿dónde están mis errores ortográficos?. Admito un error "'Muestra un msg preguntado que es lo que pasa " era preguntando, pero eso no lo va a ver el usuario.
Una de las cosas que me incomoda en ésta página es al hacer ctrl + v aparece esa ventana que cambia de formato el texto, por eso me salio todo pegado y desordenado, sin sangría el código de arriba. Se veo muy feo pero no puedo modificar lo ya publicado. Es sólo una opinión no se enojen ^^,
Una de las cosas que me incomoda en ésta página es al hacer ctrl + v aparece esa ventana que cambia de formato el texto, por eso me salio todo pegado y desordenado, sin sangría el código de arriba. Se veo muy feo pero no puedo modificar lo ya publicado. Es sólo una opinión no se enojen ^^,
Bueno me olvidaba, no puedo llevarme todo el crédito ése código (la parte del módulo, el form si es mio :P ) lo encontré http://www.canalvisualbasic.net/ Pero lo modifique en la parte de escribir y leer boolean porque no me daba, y le añadí los comentarios para así poder reutilizarlo y saber para que servia cada uno.
If MsgBox("¿Recien me instalaste?", vbQuestion + vbYesNo + vbDefaultButton2, "¿Qué haz hecho?") = MsgBoxResult.No
Ahí están los errores ortográficos. Recién (en el mensaje) lleva tilde y has (en el titulo) no es con Z. Además, seguro que se te ocurre otra idea para comprobar si es la primera vez que se ejecuta el programa en lugar de tener que preguntarle al usuario.
Ahí están los errores ortográficos. Recién (en el mensaje) lleva tilde y has (en el titulo) no es con Z. Además, seguro que se te ocurre otra idea para comprobar si es la primera vez que se ejecuta el programa en lugar de tener que preguntarle al usuario.
- Compartir respuesta
- Anónimo
ahora mismo