Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - kub0x

#1151
Lo que hace NovLucker es guardar los subdirectorios de una ruta en un archivo xml serializado en funcion del Checkbox, pues si éste está checkado guarda la ruta . Posteriormente puedes acceder a dichos datos a través de GetSavedsPaths() e ir checkando los CheckBoxes.Sería algo como "tus rutas de música favoritas". Buen aporte sin duda :)

Estoy ciego, gracias HdM por aportar la solución pues no ví que se borraban los CheckBoxes dibujados al llamar a updatecheckboxes() y me lié pensando en otra cosa xD. Debería funcionar bien, ya que cargas la última ruta, obtienes los indices checkados y dibujas los Checkboxes (Todo en el evento Load) . Al quitar el método CargarPropiedades() de updatecheckboxes() te aseguras que si cargas una nueva ruta, se dibujen nuevos CheckBoxes y no haya conflictos si la cantidad es menor a la anterior.

Disfruta de la app :D
#1152
Encontré el error, es lo que te dije antes y no es por el código si no por las rutas cargadas. Esta vez te lo intentaré explicar lo mejor posible :P

cuando se inicia la App se dibujan los CheckBoxes de la ruta actual. Si cargas mas rutas a través del FolderButton() entonces se añaden mas CheckBoxes (la matriz mCheck tendrá mas índices). Hasta ahí bien. Aunque llames a CargarPropiedades() todo seguirá bien ya que tendrás los mismos índices que cuando cargaste la primera ruta.

El problema se presenta al cerrar la aplicación, pues imagínate que la ruta que cargaste al principio del programa genera 10 Checkboxes y la que cargaste con FolderButton genera 5 CheckBoxes más. Si antes de cerrar el programa tildaste el CheckBox 12,13 y 14 cuando abras la App otra vez sólo se dibujarán los CheckBoxes de la última ruta cargada (los 5 que generaste mediante FolderButton). Entonces la matriz mCheck tendrá 5 índices y le será imposible acceder al índice 12,13 y 14 pues esos índices los generaste cuando tenías 15 CheckBoxes Y AHORA TIENES 5 no los 15 que generaste por última vez (cargas el último directorio asignado a la propiedad, no los anteriores :/)

Tienes que idear un método para que se carguen las últimas rutas cargadas en el formulario, de esta forma podrás dibujar todos los CheckBoxes de ambas rutas y posteiormente comprobar si fueron tildados la última vez. Puedes hacerlo con una propiedad que guarde una matriz de cadenas String().

Espero que lo entiendas, pues el error es bastante crítico xD Si no lo entendieras pues podría ayudarte mediante código, pero estaría bien que pudieras arreglarlo pues es la mejor manera de comprender el funcionamiento del programa. Cualquier duda aquí me tienes.

Saludos!
#1153
Buenas EleKtro!

Te diría que debugeases la applicación o bien poniendo Breakpoints en los puntos que te interesa evaluar o bien llendo paso a paso por sentencia. Si cargas la app y el directorio es C:\ se dibujaran tantos CheckBoxes como directorios en C:\. Luego imaginate que cargas C:\musica, entonces se añadiran tantos CheckBox como directorios en C:\musica haya, pero claro, estas guardando en la propiedad FolderPathName el ultimo directorio cargado. Si inicias la app otra vez la propiedad que guarda el indice de los CheckBoxes checkados tendra un tamaño mayor a la que se espera pues solo estas dibujando tantos Checkbox como directorios en C:\musica, pero resulta que tambien cargas los de C:\ pues antes al cerrar la aplicación se guardaron los de C:\ y C:\musica.

No sé si ése será el error, el código parece estar bien. Ojala mis ojos fueran un debugger pero a tanto no llego xD como ultimo recurso pasame la solucion del proyecto y te busco el error.

Saludos!
#1154
Cuando dibujas nuevos controles la cantidad de CheckBoxes no tiene porque ser la misma que la anterior. Si tenias 20 CheckBoxes ya que encontraste 20 subdirectorios, y luego llamas al FolderBrowserDialog() quizás tengas una mayor cantidad de Controles y por eso es por lo que obtienes un error en conjunto con la propiedad. Me explico, si antes tenias 20 CheckBoxes en la matriz y ahora encontraste 10 subdirectorios pues en la matriz tendrás 30 ya que tienes que resetearla. Otro error es que antes tuvieras el Checkbox10 activado y ahora solo tengas dibujados 7 CheckBoxes e intentes Checkar ese 10. (Ahí te salta error en lo que dijiste de la proiedad).

Para resetear la matriz llama a este método :P

No he probado el código, ni tampoco le he dado muchas vueltas (estoy en clase :P) pero te adjunto algo:
Código (VB.NET) [Seleccionar]

    Dim mCheck(0) As CheckBox

    Private Sub UpdateArray()
        Array.Clear(mCheck, 0, mCheck.Length)
        Array.Resize(mCheck, 0)
    End Sub


Saludos!
#1155
Gracias HdM por sacar el error, pues éste es vital para el posterior funcionamiento. Para cambiar el tipo de propiedad en My.Settings hay que hacerlo de forma manual, especificando en la propiedad en el archivo Designer.Vb el tipo Integer() o Int32().

He modificado el código para que no Checkee CheckBoxes que no fueron seleccionados, ahora se trabaja con una propiedad llamada "Valores" que guarda una lista de enteros que representa los índices de los CheckBoxes que fueron tildados al cerrar el programa. Al iniciar la aplicación se dibujan los CheckBoxes y se procede a comprobar la propiedad. El código está mal estructurado, pero EleKtro, es para que puedas ver lo que hago de forma simple. Recuerda que hay que ser limpios xD

Código (VB.NET) [Seleccionar]

Public Class Form1
   Dim mcheck(0) As CheckBox
   Private Sub CargarPropiedades()
       'Obtenemos la Lista de Enteros de los índices Checkados
       Dim ListaCheckados As Int32() = My.Settings.Valores
       For i As Int32 = 0 To mcheck.Length - 1 'Recorro los CheckBoxes
           For Each indiceCheckado As Int32 In ListaCheckados 'Por cada indice de CheckBoxes checkados
               'Como se los indices de los CheckBoxes checkados, accedo a éstos mediante el Array de los CheckBoxes
               'Ej -> indiceCheckado : 3 (CheckBox3) ;
               'Por lo tanto indiceCheckado - 1 = 2, mCheck(0) = check1, ... m(2) = CheckBox3
               'Es decir el índice N - 1 siempre corresponderá a CheckBoxN
               mcheck(indiceCheckado - 1).Checked = True
           Next
       Next
   End Sub

   Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
       Dim mCheckados(0) As Int32 'matriz que guardará los indices de los CheckBoxes checkados
       Dim Cuantos As Int32 = 0 'cuantos CheckBoxes estan checkados
       For i As Int32 = 0 To mcheck.Length - 1 'Recorro los CheckBoxes en busca de Checkados
           If mcheck(i).Checked = True Then
               Cuantos += 1
               'Sumamos un indice por CheckBox checkado
               Array.Resize(mCheckados, Cuantos)
               mCheckados(Cuantos - 1) = i + 1 'metemos en el indice del Array el elemento Checkado (RECUERDA SE EMPIEZA DESDE 0)
               'Por eso lo de Cuantos - 1 (Si tienes 7 Checkados ira desde 0 hasta 6 ...)
           End If
       Next
       My.Settings.Valores = mCheckados 'Actualizamos la propiedades Int32()
       My.Settings.Save()
   End Sub
   Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

       For i As Int32 = 0 To 20
           Array.Resize(mcheck, i + 1)
           mcheck(i) = New CheckBox
           With mcheck(i)
               .Name = "CheckBox" & i + 1
               .Text = mcheck(i).Name
               .Location = New Point(40, i * 40)
           End With
           Me.Controls.Add(mcheck(i))
       Next
       CargarPropiedades()
   End Sub
End Class


Espero que te haya servido de ayuda,

Saludos!
#1156
El fallo está en que tu escribes CheckBox0 y cuando cargas las propiedades esperas un CheckBox1,2,3,4 no el 0 xD
Para ello cuando generes los CheckBoxes empieza desde i=0, suma i+1 a la propiedad .Name y .Text de los CheckBoxes y y al final del for suma 1 como te dije, para ReSizear el Array, a mí me funciona :S
#1157
Código (VB.NET) [Seleccionar]
' update checkboxes
   Public Sub updatecheckboxes()
       Dim filesystem = CreateObject("Scripting.FileSystemObject")
       Dim ThisDir = filesystem.GetFolder(My.Settings.folderpath)
       Dim i As Int32 = 0
       For Each folder In ThisDir.Subfolders
           mCheck(i) = New CheckBox()
           MessageBox.Show("test")
           Me.Panel1.Controls.Add(mCheck(i))
           With mCheck(i)
               .Name = "Checkbox" & i +1 'De esta forma sumas 1 y tendrás CheckBox1,2,3
               .Text = "CheckBox" & i+1 'Lo mismo para el nombre
               .Location = New Point(10, i * 20)
           End With
           AddHandler mCheck(i).CheckedChanged, AddressOf LlamadaCheckBox
           i = i + 1
           Array.Resize(mCheck, i)
       Next
       CargarPropiedad()
   End Sub
#1158
Nótese que actualizo la variable i y ReSizeo el Array al final del for, para que no tengas que cambiar nada.

Código (VB.NET) [Seleccionar]
   
' update checkboxes
    Public Sub updatecheckboxes()
        Dim filesystem = CreateObject("Scripting.FileSystemObject")
        Dim ThisDir = filesystem.GetFolder(My.Settings.folderpath)
        Dim i As Int32 = 0
        For Each folder In ThisDir.Subfolders
            mCheck(i) = New CheckBox()
            MessageBox.Show("test")
            Me.Panel1.Controls.Add(mCheck(i))
            With mCheck(i)
                .Name = "Checkbox" & i
                .Text = folder.Name
                .Location = New Point(10, i * 20)
            End With
            AddHandler mCheck(i).CheckedChanged, AddressOf LlamadaCheckBox
            i = i + 1
            Array.Resize(mCheck, i)
        Next
        CargarPropiedad()
    End Sub
#1159
HdM tiene razón. El error reside en que en el caso mCheck(0) no le estás instanciando ningun objeto CheckBox. Entonces dentro del bucle For, para instanciar los CheckBoxes en mCheck tendrás que hacerlo así:

mCheck(i-1) = New CheckBox()

De esta forma si tienes 20 CheckBox, iras desde 0 hasta 19 instanciando los CheckBoxes en cada índice.

Saludos!
#1160
Perdona que haya tardado en contestar. Como yo te decia antes, tienes que cambiar el indice de la matriz de los CheckBoxes en función de las carpetas encontradas. Lo puedes hacer en un mismo For todo xD

Es decir,

For subdirectorios en Directorios
i += 1
Array.resize(matrizCheckBox,i)
.......
matrizCheckBox(i) = new Checkbox
.......
Next

De esta forma compruebas las carpetas, obtienes indices y generas CheckBox, todo en uno.

¿Por que dices que los indices están mal? Espero que te sirva de ayuda lo que te he dicho =p