locked
Acceso a objetos generados en tiempo de ejecución RRS feed

  • 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
    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 Sub

    Y 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 Sub

    Al 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.


    martes, 7 de febrero de 2012 8:15
    Moderador
  • 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
    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

    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
    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
    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

    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 Sub

    Y 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 Sub

    Al 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.


    martes, 7 de febrero de 2012 8:15
    Moderador