Autor
|
Tema: (solucionado) ¿clonar evento para varios elementos? ¿FOR? (Leído 28,094 veces)
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.866
|
que buscarias capturar con la expresion regular?
Hola, pues la interpretación que le haría en Ruby sería esta: If CheckboxN.Name[(/^#{Regexp.escape(caracter)}$/)] Then...
Busca el "caracter" como una palabra con inicio y final de línea, de esa manera si el checkbox se llama "1", con ese regex excluiría todos los demás checkboxes: "10","11","12",etc.. ¿No? Me iría muy bien, pero lo he intentado y me da error: Dim reg As New Regex(caracter) If reg.Match(CheckboxN.Name) Then
Value of type 'System.Text.RegularExpressions.Match' cannot be converted to 'Boolean'. EDITO: Pensandolo bien, tengo que usar el string "checkbox" + (caracter) en el regex xD un saludo
|
|
« Última modificación: 20 Noviembre 2012, 00:43 am por EleKtro H@cker »
|
En línea
|
|
|
|
kub0x
Enlightenment Seeker
Moderador
Desconectado
Mensajes: 1.486
S3C M4NI4C
|
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 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!
|
|
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.866
|
He probado el form pero no me funciona: Dim ListaCheckados As Int32() = My.Settings.Valores
Error 7 Value of type 'Integer' cannot be converted to '1-dimensional array of Integer'. My.Settings.Valores = mCheckados
Error 8 Value of type '1-dimensional array of Integer' cannot be converted to 'Integer'. 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(). ¿Eso es hacerlo de forma manual, o estoy omitiendo algo?Vale creo que te referías aquí: <Global.System.Configuration.UserScopedSettingAttribute(), _ Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _ Global.System.Configuration.DefaultSettingValueAttribute("0")> _ Public Property Valores() As Int32() Get Return CType(Me("Valores"), Int32()) End Get Set(value As Int32()) Me("Valores") = value End Set End Property End Class End Namespace
Es que yo no tengo un "form1.designer.vb" y acabo de conocer su existencia googleando... Estoy acoplando tu form a mi form, a ver si por fin conseguimos que funcione... (Infinitas) Gracias Kubox EDITO: SÍ!!! Me ha costado un poco adaptarlo a mi form pero al final lo he conseguido, y todo lo relativo al tema funciona bien PD: Será una mier** mi programa pero sin duda kubox, Hdm, y Danyfirex os llevais unos agardecimientos en algún botón de la app xD Ya puedo decir eso de... TEMA SOLUCIONADO!!!! ...O casi, porque aún me queda una duda esporádica... ¿Como puedo resetear el índice/tabla de la matriz?Es decir, dejarlo todo "en blanco"... para poder borrar/añadir checkboxes una y otra vez sin que se salga fuera dle índice... Mi app usa "folderbrowserdialog" para almacenar una ruta en "my.settings", Cuando se abre el programa, esa ruta se carga en el evento form_load, Kubox, tu magnifico code se encarga de indizarlo y crear los checkboxes y tál una vez cargada la ruta, añadiendole el nombre de la carpeta a la propiedad "text" de cada checkbox. El problema sucede cuando intento cargar una segunda ruta (osea, cuando uso el botón del folderbrowserdialog dentro de la app y selecciono una carpeta para que séa "cargada"), obtengo este error: Index was outside the bounds of the array. En: Private Sub CargarPropiedades() mcheck(indiceCheckado - 1).Checked = True End Sub
Y este es mi noob intento de reseteo antes de llamar al sub que llama al sub de "cargarpropiedades": ' Folder button Public Sub C1Button3_Click(sender As Object, e As EventArgs) Handles folderbutton.Click ... If Resultado.ToString() = "OK" Then Dim mcheck(0) As CheckBox updatecheckboxes()
y este es el sub que falta, por si acaso estuviera mal lo posteo: ' update checkboxes Public Sub updatecheckboxes() ' delete the old checkboxes Panel1.Controls.Clear() ' create the new checkboxes Dim filesystem = CreateObject("Scripting.FileSystemObject") Dim ThisDir = filesystem.GetFolder(My.Settings.folderpath) Dim i As Int32 = 0 For Each folder In ThisDir. Subfolders 'MessageBox.Show("a") Array.Resize(mcheck, i + 1) mcheck(i) = New CheckBox With mcheck(i) .Name = "CheckBox" & i + 1 '.Text = mcheck(i).Name .Location = New Point(10, i * 20) End With Me.Panel1.Controls.Add(mcheck(i)) AddHandler mcheck(i).CheckedChanged, AddressOf LlamadaCheckBox i += 1 Next CargarPropiedades() End Sub
GRACIAS POR VUESTRA PACIENCIA
|
|
« Última modificación: 20 Noviembre 2012, 07:33 am por EleKtro H@cker »
|
En línea
|
|
|
|
kub0x
Enlightenment Seeker
Moderador
Desconectado
Mensajes: 1.486
S3C M4NI4C
|
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 No he probado el código, ni tampoco le he dado muchas vueltas (estoy en clase ) pero te adjunto algo: Dim mCheck(0) As CheckBox Private Sub UpdateArray() Array.Clear(mCheck, 0, mCheck.Length) Array.Resize(mCheck, 0) End Sub
Saludos!
|
|
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.866
|
Pues no, no me funciona el sub :-/
Tanto con tu sub como con "ReDim", y con "Array.Clear" obtengo el mismo error en el mismo sitió que comenté antes "el indice está fuera de blablabla...", algo estoy omitiendo o haciendo mal
Sobre lo que comentas de un checkbox10 y cargar menor cantidad de 10 checkboxes, pues también debo resetear eso entonces al cargar una carpeta :-/
Un saludo
EDITO:
Kubox, lo he arreglado por arte de mágia, realmente no se lo que ha pasado, empecé a probar cosas, y al volver pasos atrás en la IDE ("ctrl+z") ahora me funciona, SIN REDIMENSIONAR EL ARRAY NI NADA, ya te digo, por arte de mágia, no veo ni una pequeña modificación en la class...
Ahora puedo cargar las rutas que quiera y no me da error :S, tampoco me da error si cargo una ruta con 20 carpetas, selecciono el checkbox 20, y cargo una carpeta de 2 subfolders... (se selecciona el checkbox 2 xD)
Pues nada, un sufrimiento menos, ahora lo que necesitaría es resetear los checkboxes que se quedan clickados al cargar distintas rutas...
Retiro lo dicho, guardé el proyecto tal y como estaba, ahora he vuelto a abrir la ide, he ejecutado la app y me vuelve a dar el mismo problema del "index out of range", ha debido ser algún bug extraño del VS...porque no entiendo que me funcionase haciendo "pasos atrás" y ahora de nuevo no me vuelve a funcionar al cargar una ruta, muy raro.
|
|
« Última modificación: 20 Noviembre 2012, 11:08 am por EleKtro H@cker »
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.866
|
Tengo el form casi terminado, lo único que me falta es eso, arreglar lo de los "reseteos" para que no me de error al usar el botón para cargar una ruta... aquí adjunto el form completo por si sirve de algo: Imports System.Windows.Forms Imports System.IO Imports System.Text.RegularExpressions Public Class Form1 Dim filesystem As Object, ThisDir As Object Dim mcheck(0) As CheckBox Dim winampargs As String
#Region "Propertys" Public Property userSelectedPlayerFilePath() As String Get Return playertextbox.Text End Get Set(value As String) playertextbox.Text = value End Set End Property Public Property userSelectedFolderPath() As String Get Return foldertextbox.Text End Get Set(value As String) foldertextbox.Text = value End Set End Property #End Region
#Region "Load / Close" Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load playertextbox.Text = My.Settings.playerpath foldertextbox.Text = My.Settings.folderpath updatecheckboxes() End Sub Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing Dim mCheckados(0) As Int32 Dim Cuantos As Int32 = 0 For i As Int32 = 0 To mcheck.Length - 1 If mcheck(i).Checked = True Then Cuantos += 1 Array.Resize(mCheckados, Cuantos) mCheckados(Cuantos - 1) = i + 1 End If Next My.Settings.Valores = mCheckados My.Settings.Save() End Sub #End Region
#Region "Save & Get settings" Public Sub GenerarPropiedades() Dim CheckedN As String = Nothing For i As Int32 = 0 To mcheck.Length - 1 If mcheck(i).Checked = True Then CheckedN &= i + 1 End If Next My.Settings.Save() End Sub 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 For Each indiceCheckado As Int32 In ListaCheckados mcheck(indiceCheckado - 1).Checked = True Next Next End Sub #End Region
#Region "Draw checkboxes..." Public Sub updatecheckboxes() ' delete the old checkboxes Panel1.Controls.Clear() ' create the new checkboxes Dim filesystem = CreateObject("Scripting.FileSystemObject") Dim ThisDir = filesystem.GetFolder(My.Settings.folderpath) Dim i As Int32 = 0 For Each folder In ThisDir. Subfolders Array.Resize(mcheck, i + 1) mcheck(i) = New CheckBox With mcheck(i) .AutoSize = True .Location = New Point(10, i * 20) .Name = "CheckBox" & i + 1 End With Me.Panel1.Controls.Add(mcheck(i)) AddHandler mcheck(i).CheckedChanged, AddressOf LlamadaCheckBox i += 1 Next CargarPropiedades() End Sub ' función que se ejecuta cuando cualquier checkbox es clickado Public Sub LlamadaCheckBox(ByVal sender As Object, ByVal e As System.EventArgs) Dim filesystem = CreateObject("Scripting.FileSystemObject") Dim ThisDir = filesystem.GetFolder(My.Settings.folderpath) Dim CheckboxN As CheckBox = CType(sender, CheckBox) If CheckboxN.Checked = True Then winampargs = winampargs & " " & ControlChars.Quote & Path.Combine(ThisDir.Path, CheckboxN.Text.ToString()) & ControlChars.Quote Else winampargs = Replace(winampargs, ControlChars.Quote & Path.Combine(ThisDir.Path, CheckboxN.Text.ToString()) & ControlChars.Quote, "") End If End Sub #End Region
#Region "buttons" ' Folder button Public Sub C1Button3_Click(sender As Object, e As EventArgs) Handles folderbutton.Click Dim folderselected As New System.Windows.Forms.FolderBrowserDialog Dim Resultado As DialogResult folderselected.RootFolder = Environment.SpecialFolder.Desktop Resultado = folderselected.ShowDialog If Resultado.ToString() = "OK" Then userSelectedFolderPath = folderselected.SelectedPath My.Settings.folderpath = folderselected.SelectedPath My.Settings.Save() Dim mcheck(0) As CheckBox updatecheckboxes() End If End Sub ' Player button Public Sub C1Button1_Click(sender As Object, e As EventArgs) Handles playerbutton.Click Dim playerselected As New OpenFileDialog() playerselected.InitialDirectory = Environ("programfiles") playerselected.Title = "Select your favorite music player" playerselected.Filter = "Music players|mpc.exe;mpc-hc.exe;mpc-hc64.exe;umplayer.exe;vlc.exe;winamp.exe;wmp.exe" PlayerDialog.FilterIndex = 1 Dim selection As System.Windows.Forms.DialogResult = playerselected.ShowDialog() If selection = DialogResult.OK Then userSelectedPlayerFilePath = playerselected.FileName My.Settings.playerpath = playerselected.FileName My.Settings.Save() End If End Sub ' Play button Public Sub C1Button2_Click(sender As Object, e As EventArgs) Handles C1Button2.Click Process.Start(userSelectedPlayerFilePath, winampargs) End Sub #End Region
End Class
|
|
|
En línea
|
|
|
|
kub0x
Enlightenment Seeker
Moderador
Desconectado
Mensajes: 1.486
S3C M4NI4C
|
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!
|
|
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.866
|
Quizás este comentario resulta un poco OFFTOPIC, pero es para decirte que en estas últimas horas ya lo he intentado todo (todo lo que está bajo mis conocimientos en VB, que son pocos xD) y no he conseguido arreglar eso, así que como no me lo arregle un pro como tú... Dentro de 1-2 horas me pongo de nuevo al tema a ver si puedo solucionarlo yo solo con los datos que me acabas de dar, es que me da palo pedirte cosas ya, y sinó lo consigo en un rato pues te paso la "solución" por mp más tarde vale? hasta un rato (Y GRAAAAAAAACIAS, mi salvador! )
|
|
|
En línea
|
|
|
|
HdM
Desconectado
Mensajes: 1.674
|
Hola.
Yo el error veo que está en que cada vez que seleccionas un directorio, llamas al updatecheckboxes(), redibujando los checkbox y éste a su vez llama al CargarPropiedades(), que tiene almacenados los checkbox que había creados en la apertura del form. Es posible que el nº de checkbox actualmente dibujados, no coincida con los índices de checkbox almacenados en My.Settings.Valores y eso produce el error.
Ten en cuenta que en CargarPropiedades(), por cada checkbox dibujado, estás recorriendo todos los índices de los checkbox almacenados en My.Settings.Valores.
Saludos.
|
|
|
En línea
|
- Nice to see you again -
|
|
|
Novlucker
Ninja y
Colaborador
Desconectado
Mensajes: 10.683
Yo que tu lo pienso dos veces
|
Necesito un resumen En tu app; - Seleccionas un directorio
- Listas todos los subdirectorios
- Creas un checkbox por cada subdirectorio
- ¿Para que son las settings?
Saludos
|
|
|
En línea
|
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD "Hay dos cosas infinitas: el Universo y la estupidez humana. Y de la primera no estoy muy seguro." Albert Einstein
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Crear copia para clonar en varios PCs?
GNU/Linux
|
JJMD
|
1
|
2,276
|
28 Febrero 2013, 23:09 pm
por portaro
|
|
|
Problema con un JMenuItem, no escucha evento de mouse (ya Solucionado)
Java
|
DarkSorcerer
|
1
|
3,262
|
23 Julio 2013, 12:19 pm
por Debci
|
|
|
Comparar checkbox con varios elementos
Programación Visual Basic
|
rapbyone
|
4
|
2,273
|
12 Febrero 2016, 18:50 pm
por fary
|
|
|
WhatsApp añade más elementos para usar la app en varios móviles a la vez
Noticias
|
wolfbcn
|
0
|
1,049
|
15 Noviembre 2019, 14:47 pm
por wolfbcn
|
|
|
¿Existe algún algoritmo para escribir las pemutaciones de n elementos sin almacenar las de n-1 elementos?
Programación General
|
fzp
|
3
|
5,229
|
24 Octubre 2021, 23:06 pm
por fzp
|
|