Almacenar opcion de OptionButton en archivo ini

Iniciado por rapbyone, 6 Diciembre 2013, 12:22 PM

0 Miembros y 1 Visitante están viendo este tema.

rapbyone

Amigos les cuento, tengo el siguiente código, que me permite cambiar archivos de una carpeta a otra y ademas ir mostrando diferentes imágenes al revisar las opciones:

Private Sub Command1_Click()
'Si está seleccionado el Option1 se ejecuta la siguiente condición
If Option1.Value = True Then
   Kill "C:\destino\unknow_00053.fnt"
      MsgBox "Fuente por defecto"
End If

'Si está seleccionado el Option2 esta
If Option2.Value = True Then
FileCopy "C:\fnt\F2\unknow_00053.fnt", "C:\destino\unknow_00053.fnt"
MsgBox "Fuente cambiada"
End If

'Si está seleccionado el Option3 se ejecuta esta otra
If Option3.Value = True Then
FileCopy "C:\fnt\F3\unknow_00053.fnt", "C:\destino\unknow_00053.fnt"
MsgBox "Fuente cambiada"
End If

End Sub

Private Sub Frame1_DragDrop(Source As Control, X As Single, Y As Single)

End Sub

Private Sub Option1_Click()
Image3.Visible = False
Image2.Visible = False
Image1.Visible = True
End Sub

Private Sub Option2_Click()
Image3.Visible = False
Image2.Visible = True
Image1.Visible = False
End Sub

Private Sub Option3_Click()
Image3.Visible = True
Image2.Visible = False
Image1.Visible = False


Así se ve el programa:



Lo que quiero es que al elegir una opción, se cree un archivo ini, recordando la opción escogida, por lo tanto, si elijo la fuente 2, al cerrar y abrir el programa, este muestre la opción escogida.

Gracias amigos  ;-)

Danyfirex

Hola. podrias hacer algo masomenos así:



Código (vb) [Seleccionar]
'--------for INI file read/write
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long
'-------------------

'reads ini string
Public Function ReadIni(FileName As String, Section As String, Key As String) As String
Dim RetVal As String * 255, v As Long
v = GetPrivateProfileString(Section, Key, "", RetVal, 255, FileName)
ReadIni = Left(RetVal, v)
End Function


'writes ini
Public Sub WriteIni(FileName As String, Section As String, Key As String, Value As String)
WritePrivateProfileString Section, Key, Value, FileName
End Sub




Private Sub Form_Load()
Dim valorleido As String
Dim NombreArchivo As String
NombreArchivo = App.Path & "\Config.ini"

If Dir(NombreArchivo) <> "" Then 'verificamos si existe el archivo pa' cuando abrimos por primera vez
valorleido = ReadIni(NombreArchivo, "Opcion", "Valor")
Select Case valorleido 'verificamos el valor leido y asignamos
Case "1"
Option1.Value = True
Case "2"
Option2.Value = True
Case "3"
Option3.Value = True
End Select
End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
Dim Str As String
Dim miOboton As Control
Dim valorescribir As String
Dim NombreArchivo As String
NombreArchivo = App.Path & "\Config.ini"

'Verificamos cual option buttons esta seleccionado
For Each miOboton In Me.Controls
If TypeOf miOboton Is OptionButton And miOboton.Value = True Then
Select Case miOboton.Name
Case "Option1"
valorescribir = "1"
Case "Option2"
valorescribir = "2"
Case "Option3"
valorescribir = "3"
End Select
End If
Next
WriteIni NombreArchivo, "Opcion", "Valor", valorescribir
End Sub



Quizás lo complique un poco :S. pero funciona bien.  :laugh:

rapbyone

 ;-) Gracias por la respuesta, deje así el código completo:

'--------for INI file read/write
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long
'-------------------

Private Sub Command1_Click()
'Si está seleccionado el Option1 se ejecuta la siguiente condición
If Option1.Value = True Then
   Kill "C:\destino\unknow_00053.fnt"
      MsgBox "Fuente por defecto"
End If

'Si está seleccionado el Option2 esta
If Option2.Value = True Then
FileCopy "C:\fnt\F2\unknow_00053.fnt", "C:\destino\unknow_00053.fnt"
MsgBox "Fuente cambiada"
End If

'Si está seleccionado el Option3 se ejecuta esta otra
If Option3.Value = True Then
FileCopy "C:\fnt\F3\unknow_00053.fnt", "C:\destino\unknow_00053.fnt"
MsgBox "Fuente cambiada"
End If

End Sub

Private Sub Option1_Click()
Image3.Visible = False
Image2.Visible = False
Image1.Visible = True
End Sub

Private Sub Option2_Click()
Image3.Visible = False
Image2.Visible = True
Image1.Visible = False
End Sub

Private Sub Option3_Click()
Image3.Visible = True
Image2.Visible = False
Image1.Visible = False
End Sub


'reads ini string
Public Function ReadIni(FileName As String, Section As String, Key As String) As String
Dim RetVal As String * 255, v As Long
v = GetPrivateProfileString(Section, Key, "", RetVal, 255, FileName)
ReadIni = Left(RetVal, v)
End Function


'writes ini
Public Sub WriteIni(FileName As String, Section As String, Key As String, Value As String)
WritePrivateProfileString Section, Key, Value, FileName
End Sub


Private Sub Form_Load()
Dim valorleido As String
Dim NombreArchivo As String
NombreArchivo = App.Path & "\Config.ini"

If Dir(NombreArchivo) <> "" Then 'verificamos si existe el archivo pa' cuando abrimos por primera vez
valorleido = ReadIni(NombreArchivo, "Opcion", "Valor")
Select Case valorleido 'verificamos el valor leido y asignamos
Case "1"
Option1.Value = True
Case "2"
Option2.Value = True
Case "3"
Option3.Value = True
End Select
End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
Dim Str As String
Dim miOboton As Control
Dim valorescribir As String
Dim NombreArchivo As String
NombreArchivo = App.Path & "\Config.ini"

'Verificamos cual option buttons esta seleccionado
For Each miOboton In Me.Controls
If TypeOf miOboton Is OptionButton And miOboton.Value = True Then
Select Case miOboton.Name
Case "Option1"
valorescribir = "1"
Case "Option2"
valorescribir = "2"
Case "Option3"
valorescribir = "3"
End Select
End If
Next
WriteIni NombreArchivo, "Opcion", "Valor", valorescribir
End Sub


Pero al momento de cerrar el programa, me da este error:


En la depuración me marca esto:


Gracias por la ayuda

Danyfirex

Ups no me di cuenta que tenias un frame.  y los frames no tiene la propiedad value :S


cámbialo por este código.


Código (vb) [Seleccionar]
Private Sub Form_Unload(Cancel As Integer)
Dim Str As String
Dim miOboton As Control
Dim valorescribir As String
Dim NombreArchivo As String
NombreArchivo = App.Path & "\Config.ini"

'Verificamos cual option buttons esta seleccionado
For Each miOboton In Me.Controls
If TypeOf miOboton Is OptionButton Then
If miOboton.Value = True Then
Select Case miOboton.Name
Case "Option1"
valorescribir = "1"
Case "Option2"
valorescribir = "2"
Case "Option3"
valorescribir = "3"
End Select
End If
End If
Next
WriteIni NombreArchivo, "Opcion", "Valor", valorescribir
End Sub




saludos

rapbyone

#4
Muchas gracias funciono perfecto.

Te quiero pedir lo ultimo por favor y es el problema que no he podido solucionar, lo que pasa es que mi programa es un launcher para un programa determinado.

El problema es que la ruta de instalación de ese programa cambia según los bits del sistema operativo, por lo tanto si quiero copiar un archivo a una carpeta que esta en archivos de programa. solo funcionaria en algunos pc, por ejemplo

en windows 32 bits:

If Option2.Value = True Then
FileCopy "C:\fnt\F2\unknow_00053.fnt", "C:\Archivos de programa\Messenger\fuentes"
End If


En windows 64 bits

If Option2.Value = True Then
FileCopy "C:\fnt\F2\unknow_00053.fnt", "Archivos de programa (x86)\Messenger\fuentes"
End If


Que se me ocurre ami:
Poder pedirle al usuario la primera ves que abre el programa que selecciona la ruta donde tiene instalado el programa y que se almacene en un archivo ini. y guardar la ruta escogida en una variable, algo así:

'Se declaran las variable
Dim RutaDatos as String

Private Sub Option1_Click()
RutaDatos = "ruta almacena en ini"
End Sub


Después para pegar el archivo me posicionaría en la ruta seleccionada por el usuario y pegaría el archivo.


If Option2.Value = True Then
FileCopy  RutaDatos/Font/unknow_00053.fnt"
End If


Se podría hacer algo así? ¿Como podría hacerlo?
Prometo no molestar mas si me ayudas por favor  :D

Danyfirex

Pues para eso existe funciones.

ejemplo esta simple.

Código (vb) [Seleccionar]
dim Archivosdeprograma as string

'C:\Archivos de programa\  o Archivos de programa (x86) respectivamente
Archivosdeprograma=Environ$("ProgramFiles")



saludos

rapbyone

Cita de: Danyfirex en  6 Diciembre 2013, 20:46 PM
Pues para eso existe funciones.

ejemplo esta simple.

Código (vb) [Seleccionar]
dim Archivosdeprograma as string

'C:\Archivos de programa\  o Archivos de programa (x86) respectivamente
Archivosdeprograma=Environ$("ProgramFiles")



saludos

Perfecto, pero que pasaría si el programa estuviera instalado en otro unidad?? o en otra carpeta fuera de Archivos de programa?

De todas maneras muchas gracias, me has ayudado un monton :D

Danyfirex

pues entonces tiene que ver si ese programa crea alguna clave de registro.y guiarte por ahí.


saludos

rapbyone

#8
Cita de: Danyfirex en  6 Diciembre 2013, 20:46 PM
Pues para eso existe funciones.

ejemplo esta simple.

Código (vb) [Seleccionar]
dim Archivosdeprograma as string

'C:\Archivos de programa\  o Archivos de programa (x86) respectivamente
Archivosdeprograma=Environ$("ProgramFiles")



saludos

Me entro una duda, quedaría algo así? :



Private Sub Command1_Click()
Dim Archivosdeprograma As String

'C:\Archivos de programa\  o Archivos de programa (x86) respectivamente
Archivosdeprograma = Environ$("ProgramFiles")

FileCopy (Environ$("ProgramFiles") & "msn\dat\Launcher\Fonts\1\unknow_00053.fnt"), (Environ$("ProgramFiles") & "MSN\resources\unknow_00053.fnt")

End Sub


Como tendría que hacerlo?? por que me da error.

Danyfirex

Verifica las rutas en un msgbox o consola.

así debería funcionar. se me olvido que Environ$ retorna sin el \
Código (vb) [Seleccionar]
FileCopy (Environ$("ProgramFiles") & "\msn\dat\Launcher\Fonts\1\unknow_00053.fnt"), (Environ$("ProgramFiles") & "\MSN\resources\unknow_00053.fnt")



saludos