Principales respuestas
Acceso a objetos generados en tiempo de ejecución

Pregunta
-
En primer lugar un saludo al foro ya que hoy me estreno.
Tengo una aplicación que crea un numero de objetos(Botones) que puede variar en función de las necesidades. Una vez creados necesito que , en función del botón pulsado modifique las propiedades del resto pero no todos, solo los que cumplan unas condiciones, algo parecido al juego del busca minas. El problema es que una vez creados se identificar cual ha sido pulsado pero no se como referirme al resto de botones.
Muchas gracias.
domingo, 5 de febrero de 2012 17:22
Respuestas
-
Bienvenido Arepez, de esta forma puedes acceder a todos los botones del formulario y aplicarle las propiedades que desees:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load For i As Integer = 0 To Me.Controls.Count - 1 If Me.Controls(i).GetType().Name = "Button" Then Dim btn As Button = CType(Me.Controls(i), Button) btn.Text = "Prueba " & i End If Next End Sub
Lo que hacemos es recorrer todos los controles del formulario. Si el tipo de control de la interacción actual es "Button" obtenemos el mismo y le aplicamos las propiedades deseadas.Saludos.
Santiago Ezequiel Rueda
santiagorueda@live.com.ar
Blog
¡Gadget MSDN Español!
Entre Ríos
Argentina- Propuesto como respuesta Eduardo PorteschellerModerator martes, 7 de febrero de 2012 12:51
- Marcado como respuesta Enrique M. MontejoModerator domingo, 19 de febrero de 2012 12:08
domingo, 5 de febrero de 2012 19:59 -
"Arepez" escribió:
> Pero la idea es, por ejemplo simular el movimiento del caballo
> de ajedrez. Cuando pulse un boton de un cuadro de 8x8 deshabilite
> el resto de los botones excepto aquellos donde el movimiento del
> caballo es válido.Hola:
Siempre y cuando conozcas las casillas del tablero de ajedrez a las que puede "saltar" el caballo, deshabilitarías las no permitidas aplicando la técnica que te comento a continuación.
Como hablas de deshabilitar los controles Button distintos a aquel donde se ha hecho el clic con el ratón, en lugar de utilizar el evento Click del ratón, entiendo que sería mejor que utilizarías los eventos MouseDown (cuando se pulsa el ratón) y MouseUp (cuando se libera), de ésta manera los controles estarán deshabilitados mientras el jugador tenga pulsado el botón del ratón, habilitándose de nuevo cuando deje de pulsar el botón del ratón.
En el evento Load del formulario instalarías los controladores de evento para todos los control Button de la siguiente manera:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
' Instalamos el controlador para el evento Click
' de todos los controles Button existentes en el
' formulario actual.
'
For Each item As Button In Me.Controls.OfType(Of Button)
AddHandler item.MouseDown, AddressOf ButtonOnMouseDown
AddHandler item.MouseUp, AddressOf ButtonOnMouseUp
Next
End SubY en los procedimientos correspondientes ejecutarías el siguiente código:
Private Sub ButtonOnMouseDown(sender As Object, e As MouseEventArgs)
' Referenciamos el control Button
' que ha desencadenado el evento.
'
Dim currentButton As Button = DirectCast(sender, Button)
' Seleccionamos los controles Button distintos
' al actual control Button.
'
Dim lista = (From button As Button In Me.Controls.OfType(Of Button) _
Where button.Name.ToUpperInvariant() <> _
currentButton.Name.ToUpperInvariant() _
Select button).ToList()
For Each item As Button In lista
' Deshabilitamos el control
item.Enabled = False
Next
End Sub
Private Sub ButtonOnMouseUp(sender As Object, e As MouseEventArgs)
' Habilitamos todos los controles Button
' existentes en el formulario actual.
'
For Each item As Button In Me.Controls.OfType(Of Button)
item.Enabled = True
Next
End SubAl estar utilizando consultas LINQ, necesitas estar compilando tu proyecto de Visual Basic con la versión 3.5 o superior de .NET (Visual Basic 2008 o superior).
Adapta el ejemplo a tus necesidades.
Un saludo
Enrique Martínez
[MS MVP - VB]Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.
Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.
Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.
- Editado Enrique M. MontejoModerator martes, 7 de febrero de 2012 8:32
- Propuesto como respuesta Eduardo PorteschellerModerator martes, 7 de febrero de 2012 12:51
- Marcado como respuesta Enrique M. MontejoModerator domingo, 19 de febrero de 2012 12:08
martes, 7 de febrero de 2012 8:15Moderador -
hola
tienes alguna forma de nombrarlos o identificar que botones accioner ante una conficion
porque podrias aplicar la tecnica que aqui comento
http://social.msdn.microsoft.com/Forums/es/vbes/thread/e4a8cfa6-c1f0-4736-9d37-11fa9577777e
quizas sea de utilidad
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina- Propuesto como respuesta Eduardo PorteschellerModerator martes, 7 de febrero de 2012 12:51
- Marcado como respuesta Enrique M. MontejoModerator domingo, 19 de febrero de 2012 12:08
domingo, 5 de febrero de 2012 18:13 -
Saludo Arepez, hoy en dia es mucho mas facil de realizar con el uso de linq como te lo expresa Santiago Ezequiel Rueda y aplicando la tecnica de Leandro Tuttini en donde te dice que le asigne el mismo controlador de evento a todos los controles, serian cosa de un par de linea como esta.
Private Sub button_MouseEnter(sender As Object, e As EventArgs) Dim BotonActual As Button = DirectCast(sender, Button) For Each item As Button In Me.Controls.OfType(Of Button)().[Select](Function(b) b).Where(Function(c) c.Name <> BotonActual.Name) ' deshabilito todos los demas controles item.Enabled = False Next End Sub Private Sub button_MouseLeave(sender As Object, e As EventArgs) For Each item As Button In Me.Controls.OfType(Of Button)().[Select](Function(b) b) ' habilito todos los controles item.Enabled = True Next End Sub
En el ejemplo no le coloque en el evento clic sino en el evento MouseEnter y MouseLeave que se disparan cuando coloca el puntero del raton encima del control y cuando lo retira haciendo que los demas controle se deshabiliten.Angel R. Jimenez G.
Software Development
Santo Domingo
Republica Dominicana
My Blog- Propuesto como respuesta Eduardo PorteschellerModerator martes, 7 de febrero de 2012 12:51
- Marcado como respuesta Enrique M. MontejoModerator domingo, 19 de febrero de 2012 12:08
lunes, 6 de febrero de 2012 23:29
Todas las respuestas
-
hola
tienes alguna forma de nombrarlos o identificar que botones accioner ante una conficion
porque podrias aplicar la tecnica que aqui comento
http://social.msdn.microsoft.com/Forums/es/vbes/thread/e4a8cfa6-c1f0-4736-9d37-11fa9577777e
quizas sea de utilidad
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina- Propuesto como respuesta Eduardo PorteschellerModerator martes, 7 de febrero de 2012 12:51
- Marcado como respuesta Enrique M. MontejoModerator domingo, 19 de febrero de 2012 12:08
domingo, 5 de febrero de 2012 18:13 -
Bienvenido Arepez, de esta forma puedes acceder a todos los botones del formulario y aplicarle las propiedades que desees:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load For i As Integer = 0 To Me.Controls.Count - 1 If Me.Controls(i).GetType().Name = "Button" Then Dim btn As Button = CType(Me.Controls(i), Button) btn.Text = "Prueba " & i End If Next End Sub
Lo que hacemos es recorrer todos los controles del formulario. Si el tipo de control de la interacción actual es "Button" obtenemos el mismo y le aplicamos las propiedades deseadas.Saludos.
Santiago Ezequiel Rueda
santiagorueda@live.com.ar
Blog
¡Gadget MSDN Español!
Entre Ríos
Argentina- Propuesto como respuesta Eduardo PorteschellerModerator martes, 7 de febrero de 2012 12:51
- Marcado como respuesta Enrique M. MontejoModerator domingo, 19 de febrero de 2012 12:08
domingo, 5 de febrero de 2012 19:59 -
Muchas gracias ya que esta iteración me servirá mas adelante.
Pero la idea es, por ejemplo simular el movimiento del caballo de ajedrez. Cuando pulse un boton de un cuadro de 8x8 deshabilite el resto de los botones excepto aquellos donde el movimiento del caballo es válido. Hasta Visual Basic 6 era relativamente sencillo ya que podias crear objetos con índice, por ejemplo Boton(i) y referirte a cada un de ellos mediante dicho índice, pero ahora no veo como.
Gracias.
lunes, 6 de febrero de 2012 22:15 -
Saludo Arepez, hoy en dia es mucho mas facil de realizar con el uso de linq como te lo expresa Santiago Ezequiel Rueda y aplicando la tecnica de Leandro Tuttini en donde te dice que le asigne el mismo controlador de evento a todos los controles, serian cosa de un par de linea como esta.
Private Sub button_MouseEnter(sender As Object, e As EventArgs) Dim BotonActual As Button = DirectCast(sender, Button) For Each item As Button In Me.Controls.OfType(Of Button)().[Select](Function(b) b).Where(Function(c) c.Name <> BotonActual.Name) ' deshabilito todos los demas controles item.Enabled = False Next End Sub Private Sub button_MouseLeave(sender As Object, e As EventArgs) For Each item As Button In Me.Controls.OfType(Of Button)().[Select](Function(b) b) ' habilito todos los controles item.Enabled = True Next End Sub
En el ejemplo no le coloque en el evento clic sino en el evento MouseEnter y MouseLeave que se disparan cuando coloca el puntero del raton encima del control y cuando lo retira haciendo que los demas controle se deshabiliten.Angel R. Jimenez G.
Software Development
Santo Domingo
Republica Dominicana
My Blog- Propuesto como respuesta Eduardo PorteschellerModerator martes, 7 de febrero de 2012 12:51
- Marcado como respuesta Enrique M. MontejoModerator domingo, 19 de febrero de 2012 12:08
lunes, 6 de febrero de 2012 23:29 -
"Arepez" escribió:
> Pero la idea es, por ejemplo simular el movimiento del caballo
> de ajedrez. Cuando pulse un boton de un cuadro de 8x8 deshabilite
> el resto de los botones excepto aquellos donde el movimiento del
> caballo es válido.Hola:
Siempre y cuando conozcas las casillas del tablero de ajedrez a las que puede "saltar" el caballo, deshabilitarías las no permitidas aplicando la técnica que te comento a continuación.
Como hablas de deshabilitar los controles Button distintos a aquel donde se ha hecho el clic con el ratón, en lugar de utilizar el evento Click del ratón, entiendo que sería mejor que utilizarías los eventos MouseDown (cuando se pulsa el ratón) y MouseUp (cuando se libera), de ésta manera los controles estarán deshabilitados mientras el jugador tenga pulsado el botón del ratón, habilitándose de nuevo cuando deje de pulsar el botón del ratón.
En el evento Load del formulario instalarías los controladores de evento para todos los control Button de la siguiente manera:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
' Instalamos el controlador para el evento Click
' de todos los controles Button existentes en el
' formulario actual.
'
For Each item As Button In Me.Controls.OfType(Of Button)
AddHandler item.MouseDown, AddressOf ButtonOnMouseDown
AddHandler item.MouseUp, AddressOf ButtonOnMouseUp
Next
End SubY en los procedimientos correspondientes ejecutarías el siguiente código:
Private Sub ButtonOnMouseDown(sender As Object, e As MouseEventArgs)
' Referenciamos el control Button
' que ha desencadenado el evento.
'
Dim currentButton As Button = DirectCast(sender, Button)
' Seleccionamos los controles Button distintos
' al actual control Button.
'
Dim lista = (From button As Button In Me.Controls.OfType(Of Button) _
Where button.Name.ToUpperInvariant() <> _
currentButton.Name.ToUpperInvariant() _
Select button).ToList()
For Each item As Button In lista
' Deshabilitamos el control
item.Enabled = False
Next
End Sub
Private Sub ButtonOnMouseUp(sender As Object, e As MouseEventArgs)
' Habilitamos todos los controles Button
' existentes en el formulario actual.
'
For Each item As Button In Me.Controls.OfType(Of Button)
item.Enabled = True
Next
End SubAl estar utilizando consultas LINQ, necesitas estar compilando tu proyecto de Visual Basic con la versión 3.5 o superior de .NET (Visual Basic 2008 o superior).
Adapta el ejemplo a tus necesidades.
Un saludo
Enrique Martínez
[MS MVP - VB]Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.
Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.
Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.
- Editado Enrique M. MontejoModerator martes, 7 de febrero de 2012 8:32
- Propuesto como respuesta Eduardo PorteschellerModerator martes, 7 de febrero de 2012 12:51
- Marcado como respuesta Enrique M. MontejoModerator domingo, 19 de febrero de 2012 12:08
martes, 7 de febrero de 2012 8:15Moderador