elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  (solucionado) ¿clonar evento para varios elementos? ¿FOR?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 2 [3] 4 5 6 Ir Abajo Respuesta Imprimir
Autor Tema: (solucionado) ¿clonar evento para varios elementos? ¿FOR?  (Leído 28,405 veces)
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
« Respuesta #20 en: 19 Noviembre 2012, 22:54 pm »

Nada, gracias Hdm y Kubox, puse exactamente lo que me dijeron pero no me quiere funcionar esto:


Código
  1. Public Class Form1
  2.    Dim filesystem As Object, ThisDir As Object
  3.    Dim mCheck(0) As CheckBox 'matriz que contendrá los "X" CheckBox
  4. ...


Código
  1.    ' Form load
  2.    Public Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  3.        foldertextbox.Text = My.Settings.folderpath
  4.        updatecheckboxes()
  5.    End Sub



1er intento:
El messagebox solo aparece 1 vez, y en el panel no aparece ningún checkbox.

Código
  1.    ' update checkboxes
  2.    Public Sub updatecheckboxes()
  3.        Dim filesystem = CreateObject("Scripting.FileSystemObject")
  4.        Dim ThisDir = filesystem.GetFolder(My.Settings.folderpath)
  5.        Dim i As Int32 = 0
  6.        For Each folder In ThisDir.Subfolders
  7.            i = i + 1
  8.            Array.Resize(mCheck, i)
  9.            mCheck(i - 1) = New CheckBox()
  10.            MessageBox.Show("test")
  11.            Me.Panel1.Controls.Add(mCheck(i))
  12.            With mCheck(i)
  13.                .Name = "Checkbox" & i
  14.                .Text = folder.Name
  15.                .Location = New Point(10, i * 20)
  16.            End With
  17.            AddHandler mCheck(i).CheckedChanged, AddressOf LlamadaCheckBox
  18.        Next
  19.        CargarPropiedad()
  20.    End Sub



2ndo intento:

El msgbox aparece todas las veces,
se cargan todos los checkboxes,

Pero no puedo cerrar el form, y como he "omitido" el "Array.resize" y lo que me dijo el compañero Hdm pues no creo que el índice del "mcheck" funcione para cargar/guardar las settings

Además he vuelto a las mismas de antes declarando el mcheck con un valor alto (999), así que esto no creo que me sirva para nada, solo es un ejemplo.

Código
  1. Public Class Form1
  2. ' el número aumentado a 999, sino no me funciona el segundo intento xD
  3.    Dim mCheck(999) As CheckBox
  4. ...

Código
  1.    ' update checkboxes
  2.    Public Sub updatecheckboxes()
  3.        Dim filesystem = CreateObject("Scripting.FileSystemObject")
  4.        Dim ThisDir = filesystem.GetFolder(My.Settings.folderpath)
  5.        Dim i As Int32 = 0
  6.        For Each folder In ThisDir.Subfolders
  7.            i = i + 1
  8.            mCheck(i) = New CheckBox()
  9.            'Array.Resize(mCheck, i)
  10.            MessageBox.Show("test")
  11.            Me.Panel1.Controls.Add(mCheck(i))
  12.            With mCheck(i)
  13.                .Name = "Checkbox" & i
  14.                .Text = folder.Name
  15.                .Location = New Point(10, i * 20)
  16.            End With
  17.            AddHandler mCheck(i).CheckedChanged, AddressOf LlamadaCheckBox 'Asocio el evento CheckedChange del CheckBox actual a la función LlamadaCheckBox
  18.        Next
  19.        CargarPropiedad() 'Cargo las propiedades una vez dibujados los CheckBoxes
  20.    End Sub


« Última modificación: 19 Noviembre 2012, 23:02 pm por EleKtro H@cker » En línea



HdM


Desconectado Desconectado

Mensajes: 1.674



Ver Perfil
Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
« Respuesta #21 en: 19 Noviembre 2012, 23:02 pm »

Hola.

Pero no estás haciendo i-1 en todos los casos en los que i actúa como índice.

Ej:

Código
  1. Me.Panel1.Controls.Add(mCheck(i))
  2. With mCheck(i)
  3.                .Name = "Checkbox" & i
  4.                .Text = folder.Name
  5.                .Location = New Point(10, i * 20)
  6. End With
  7. AddHandler mCheck(i).CheckedChanged, AddressOf LlamadaCheckBox
  8.  


En línea

- Nice to see you again -
kub0x
Enlightenment Seeker
Moderador
***
Desconectado Desconectado

Mensajes: 1.486


S3C M4NI4C


Ver Perfil
Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
« Respuesta #22 en: 19 Noviembre 2012, 23:09 pm »

Nótese que actualizo la variable i y ReSizeo el Array al final del for, para que no tengas que cambiar nada.

Código
  1.  
  2. ' update checkboxes
  3.    Public Sub updatecheckboxes()
  4.        Dim filesystem = CreateObject("Scripting.FileSystemObject")
  5.        Dim ThisDir = filesystem.GetFolder(My.Settings.folderpath)
  6.        Dim i As Int32 = 0
  7.        For Each folder In ThisDir.Subfolders
  8.            mCheck(i) = New CheckBox()
  9.            MessageBox.Show("test")
  10.            Me.Panel1.Controls.Add(mCheck(i))
  11.            With mCheck(i)
  12.                .Name = "Checkbox" & i
  13.                .Text = folder.Name
  14.                .Location = New Point(10, i * 20)
  15.            End With
  16.            AddHandler mCheck(i).CheckedChanged, AddressOf LlamadaCheckBox
  17.            i = i + 1
  18.            Array.Resize(mCheck, i)
  19.        Next
  20.        CargarPropiedad()
  21.    End Sub
  22.  
En línea

Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
« Respuesta #23 en: 19 Noviembre 2012, 23:14 pm »

Pero no estás haciendo i-1 en todos los casos en los que i actúa como índice.

Tienes razón, estoy un poco gilipo**** xD!

Lo he modificado correctamente (Eso creo) y por fin me funciona, muchisimas gracias

Pero los problemas sigueeeen!


Voy a poner un ejemplo visual:

se carga la app, pincho en el primer checkbox de todos, el "0", y cierro la app:




Vuelvo a abrir la app, y me aparece esto:




¿Serías tán amables de ayudarme a buscar el error en mi form?
(además, no se que coñ* he tocado para que el índice empieze con "checkbox0" y no con "checkbox1", ya me he mirado la variable "i" pero me ha parecido estar bien)


Código
  1. Imports System.Windows.Forms
  2. Imports System.IO
  3.  
  4. Public Class Form1
  5.    Dim filesystem As Object, ThisDir As Object
  6.    Dim mCheck(0) As CheckBox 'matriz que contendrá los "X" CheckBox
  7.  
  8.    ' Start of Propertys
  9.    Public Property userSelectedPlayerFilePath() As String
  10.        Get
  11.            Return playertextbox.Text
  12.        End Get
  13.        Set(value As String)
  14.            playertextbox.Text = value
  15.        End Set
  16.    End Property
  17.  
  18.    Public Property userSelectedFolderPath() As String
  19.        Get
  20.            Return foldertextbox.Text
  21.        End Get
  22.        Set(value As String)
  23.            foldertextbox.Text = value
  24.        End Set
  25.    End Property
  26.  
  27.    Public Sub GenerarPropiedades() 'metodo que generará la propiedad al producirse el cierre del formulario
  28.        Dim CheckedN As String = Nothing 'la cadena que contendrá los CheckBoxes que estén Checkados
  29.        For i As Int32 = 0 To mCheck.Length - 1 'recorro la matriz de los CheckBoxes
  30.            If mCheck(i).Checked = True Then 'Si el CheckBox actual está checkado
  31.                CheckedN &= i + 1 'Obtengo su indice y lo meto al string (si es Checkbox1 pues 1, si es chckbx2 pues 2) ...
  32.            End If
  33.        Next
  34.        My.Settings.CuantosChecked = CheckedN 'Actualizo la propiedad
  35.        My.Settings.Save() 'Guardo la propiedad
  36.    End Sub
  37.  
  38.  
  39.    Public Sub CargarPropiedad() 'método que comprobará que CheckBoxes fueron tildados la útlima vez
  40.        Dim mCuantosChecked As Char() = My.Settings.CuantosChecked.ToCharArray 'Paso el String de la propiedad a una matriz
  41.        'Simplemente hago esto para separar el String por indices (un caracter por indice)
  42.        For Each caracter As Char In mCuantosChecked 'Recorro la matriz caracteres que contendrá los checboxes tildados
  43.            For Each CheckboxN In mCheck 'Recorro la matriz de CheckBoxes, para comparar si está o no está tildado
  44.                If CheckboxN.Name.Contains(caracter) Then
  45.                    'Si el CheckBox actual contiene cualquier caracter de la propiedad
  46.                    'que tiene los indices de los CheckBoxes tildados
  47.                    CheckboxN.Checked = True 'Lo tildo
  48.                End If
  49.            Next
  50.        Next
  51.    End Sub
  52.  
  53.  
  54.    ' update checkboxes
  55.    Public Sub updatecheckboxes()
  56.        ' delete the old checkboxes
  57.        Panel1.Controls.Clear()
  58.        ' create the new checkboxes
  59.        Dim filesystem = CreateObject("Scripting.FileSystemObject")
  60.        Dim ThisDir = filesystem.GetFolder(My.Settings.folderpath)
  61.        Dim i As Int32 = 1
  62.        'Dim mCheck() As CheckBox
  63.        For Each folder In ThisDir.Subfolders
  64.  
  65.            'mCheck(i - 1) = New CheckBox()
  66.            Array.Resize(mCheck, i)
  67.            mCheck(i - 1) = New CheckBox()
  68.            'MessageBox.Show("test")
  69.            Me.Panel1.Controls.Add(mCheck(i - 1))
  70.            With mCheck(i - 1)
  71.                .Name = "Checkbox" & i - 1
  72.                .Text = "Checkbox" & i - 1
  73.                ' .Text = folder.Name
  74.                .Location = New Point(10, i * 20)
  75.            End With
  76.            AddHandler mCheck(i - 1).CheckedChanged, AddressOf LlamadaCheckBox
  77.            i = i + 1
  78.        Next
  79.        CargarPropiedad()
  80.    End Sub
  81.  
  82.    ' Form close
  83.    Public Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
  84.        GenerarPropiedades()
  85.        'My.Settings.Save()
  86.    End Sub
  87.  
  88.  
  89.    ' Form load
  90.    Public Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  91.        playertextbox.Text = My.Settings.playerpath
  92.        foldertextbox.Text = My.Settings.folderpath
  93.        updatecheckboxes()
  94.    End Sub
  95.  
  96.  
  97.    ' Folder button
  98.    Public Sub C1Button3_Click(sender As Object, e As EventArgs) Handles folderbutton.Click
  99.        Dim folderselected As New System.Windows.Forms.FolderBrowserDialog
  100.        Dim Resultado As DialogResult
  101.        folderselected.RootFolder = Environment.SpecialFolder.Desktop
  102.        Resultado = folderselected.ShowDialog
  103.        If Resultado.ToString() = "OK" Then
  104.            userSelectedFolderPath = folderselected.SelectedPath
  105.            My.Settings.folderpath = folderselected.SelectedPath
  106.            My.Settings.Save()
  107.            updatecheckboxes()
  108.        End If
  109.    End Sub
  110.  
  111.  
  112.    ' Player button
  113.    Public Sub C1Button1_Click(sender As Object, e As EventArgs) Handles playerbutton.Click
  114.        Dim playerselected As New OpenFileDialog()
  115.        playerselected.InitialDirectory = Environ("programfiles")
  116.        playerselected.Title = "Select your favorite music player"
  117.        playerselected.Filter = "Music players|mpc.exe;mpc-hc.exe;mpc-hc64.exe;umplayer.exe;vlc.exe;winamp.exe;wmp.exe"
  118.        PlayerDialog.FilterIndex = 1
  119.        Dim selection As System.Windows.Forms.DialogResult = playerselected.ShowDialog()
  120.        If selection = DialogResult.OK Then
  121.            userSelectedPlayerFilePath = playerselected.FileName
  122.            My.Settings.playerpath = playerselected.FileName
  123.            My.Settings.Save()
  124.        End If
  125.    End Sub
  126.  
  127.  
  128.    ' Play button
  129.    Public Sub C1Button2_Click(sender As Object, e As EventArgs) Handles C1Button2.Click
  130.        'Process.Start(userSelectedPlayerFilePath, ControlChars.Quote & Path.Combine(ThisDir.Path, checkedpath1) & ControlChars.Quote)
  131.    End Sub
  132.  
  133.  
  134.  
  135.    ' función que se ejecuta cuando cualquier checkbox es clickado
  136.    Public Sub LlamadaCheckBox(ByVal sender As Object, ByVal e As System.EventArgs)
  137.        Dim CheckboxN As CheckBox = CType(sender, CheckBox) 'a partir del sender creo el CheckBox (paso de objet a CheckBox para poder utilizar sus propiedades)
  138.        'MsgBox(CheckboxN.Name)
  139.  
  140.    End Sub
  141.  
  142. End Class
En línea



kub0x
Enlightenment Seeker
Moderador
***
Desconectado Desconectado

Mensajes: 1.486


S3C M4NI4C


Ver Perfil
Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
« Respuesta #24 en: 19 Noviembre 2012, 23:21 pm »

Código
  1. ' update checkboxes
  2.    Public Sub updatecheckboxes()
  3.        Dim filesystem = CreateObject("Scripting.FileSystemObject")
  4.        Dim ThisDir = filesystem.GetFolder(My.Settings.folderpath)
  5.        Dim i As Int32 = 0
  6.        For Each folder In ThisDir.Subfolders
  7.            mCheck(i) = New CheckBox()
  8.            MessageBox.Show("test")
  9.            Me.Panel1.Controls.Add(mCheck(i))
  10.            With mCheck(i)
  11.                .Name = "Checkbox" & i +1 'De esta forma sumas 1 y tendrás CheckBox1,2,3
  12.                .Text = "CheckBox" & i+1 'Lo mismo para el nombre
  13.                .Location = New Point(10, i * 20)
  14.            End With
  15.            AddHandler mCheck(i).CheckedChanged, AddressOf LlamadaCheckBox
  16.            i = i + 1
  17.            Array.Resize(mCheck, i)
  18.        Next
  19.        CargarPropiedad()
  20.    End Sub
En línea

Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
« Respuesta #25 en: 19 Noviembre 2012, 23:24 pm »

No Kubox, he usado ahora mismo tu ejemplo y solo se muestra UN checkbox:



Te lo agradezco de todas formas, a ver si doy con el fallo..
En línea



kub0x
Enlightenment Seeker
Moderador
***
Desconectado Desconectado

Mensajes: 1.486


S3C M4NI4C


Ver Perfil
Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
« Respuesta #26 en: 19 Noviembre 2012, 23:29 pm »

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
En línea

Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate

HdM


Desconectado Desconectado

Mensajes: 1.674



Ver Perfil
Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
« Respuesta #27 en: 19 Noviembre 2012, 23:36 pm »

Con respecto al otro error, el de que te aparezcan seleccionados "automáticamente" a partir del 10 cuando abres de nuevo la app; es debido a:

Código
  1. For Each CheckboxN In mCheck 'Recorro la matriz de CheckBoxes, para comparar si está o no está tildado
  2.                If CheckboxN.Name.Contains(caracter) Then
  3.                    'Si el CheckBox actual contiene cualquier caracter de la propiedad
  4.                    'que tiene los indices de los CheckBoxes tildados
  5.                    CheckboxN.Checked = True 'Lo tildo
  6.                End If
  7. Next
  8.  

Ese Contains, si seleccionas el checkbox 1, siempre lo va a contener y te seleccionará todos los checks que contengan 1 (1,11,12,13,...,21,31,...), si seleccionas el 2, pues todos los que contengan ese número,...

Como alternativa, podrías almacenar en un array numérico de enteros.

Saludos.
En línea

- Nice to see you again -
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
« Respuesta #28 en: 19 Noviembre 2012, 23:41 pm »

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

¿Eso es lo que hace tu última modificación de mi ejemplo, verdad?
Pues lo he copiado tál cual y no me funciona.

Mañana me lo miro con calma y sigo con el tema si aún no he podido resolverlo,

Aquí, y en stackoverf*** teneis que estar ya hartos de mí :xD, pero estais ayudando a alguien a aprender cosas nuevas de VB.NET, métodos nuevos, objetos nuevos, y en resumen aprender a hacer las cosas bien.

Como me dijo todo un experto en .NET, solo hay que saber "mezclar" las cosas bien.

Un saludo

PD: Hdm, lo mismo digo, mañana me lo miro detalladamente, y gracias.


EDITO: Por cierto, quizás es una tontería pero... ¿sería posible usar un regexp en "caracter"?

Código:
f CheckboxN.Name.Contains(caracter) Then

no se hacerlo en VB pero sería otra posibilidad (más sencilla para mí)
saludos
« Última modificación: 19 Noviembre 2012, 23:45 pm por EleKtro H@cker » En línea



Keyen Night


Desconectado Desconectado

Mensajes: 496


Nothing


Ver Perfil
Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
« Respuesta #29 en: 20 Noviembre 2012, 00:37 am »

que buscarias capturar con la expresion regular?
En línea

La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...
Páginas: 1 2 [3] 4 5 6 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines