none
Ayuda con un juego de palabras RRS feed

  • Pregunta

  • Hola.

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            If Timer1.enabled Then
                Timer1.Stop()
            Else
                Timer1.Start()
            End If
        End Sub
    
        Dim Bttn As Button
        Private Sub NuevoButton()
            Bttn = New Button
            Bttn.SetBounds(0, 0, 50, 50)
            Panel1.Controls.Add(Bttn)
        End Sub
    
        Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
            Dim tops As Boolean = False
            If Bttn.Top >= (Panel1.height - 50 * Panel1.Controls.Count) Then
                tops = True
                If Bttn.Top = 0 Then
                    tops = False : Timer1.stop()
                End If
            Else
                Bttn.Top += 50
            End If
            If tops AndAlso tops Then
                NuevoButton()
            End If
        End Sub
    

    El código anterior crea un nuevo Button en un Panel y va descendiendo hasta llegar abajo del Panel. Cuando esto ocurre, se crea otro nuevo Button y va descendiendo hasta que se topa con el Button que ya existe. Así hasta que se llena el Panel con Buttons apilados verticalmente.
    Mi pregunta es, que puedo hacer si elimino uno o varios Buttons que están en medio de la columna de Buttons, los que estén por encima de los ya eliminados bajen automáticamente hasta quedar encima de los de abajo que no he eliminado?
    Muchas gracias por las respuesta que puedan ofrecer.

    lunes, 6 de abril de 2015 23:46

Respuestas

  • Prueba este ejemplo.

    Al saltar el timer recorro todos los botones para comprobar si alguno se tiene que mover, si no creo uno nuevo.

    Le he añadido un controlador de evento click para que al pulsar un botón se elimine y poder probar la funcionalidad:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            If Timer1.enabled Then
                Timer1.Stop()
            Else
                Timer1.Interval = 50
                Timer1.Start()
            End If
        End Sub
    
        Private Sub NuevoButton()
            Dim Bttn As Button = New Button
            Bttn.SetBounds(0, 0, 50, 50)
            AddHandler Bttn.Click, AddressOf BlockButton_Click
            Panel1.Controls.Add(Bttn)
        End Sub
    
        Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
            Dim nuevoBoton As Boolean = True
            Dim botones As IEnumerable(Of Button) = Panel1.Controls.Cast(Of Control).Where(Function(c) TypeOf c Is Button).Cast(Of Button)().OrderByDescending(Function(b) b.Top)
            Dim top = Panel1.Height
            For Each boton As Button In botones
                If (boton.Top + boton.Height < top) Then
                    nuevoBoton = False
                    If (top - boton.Top - boton.Height > 10) Then
                        boton.Top += 10
                    Else
                        boton.Top = top - boton.Height
                    End If
                    Application.DoEvents()
                End If
                top = boton.Top
            Next
            If nuevoBoton Then NuevoButton()
        End Sub
    
        Private Sub BlockButton_Click(sender As Object, e As EventArgs)
            Dim boton As Button = sender
            Panel1.Controls.Remove(boton)
            boton.Dispose()
        End Sub

    • Marcado como respuesta Raf.Man martes, 7 de abril de 2015 10:03
    martes, 7 de abril de 2015 8:21

Todas las respuestas

  • Dim Cnt as integer = 0 (contador de TabIndex automático)

    Dim Bttn As Button Private Sub NuevoButton() Bttn = New Button Bttn.SetBounds(0, 0, 50, 50)

    Bttn.TabIndex=(cnt+1)

    Panel1.Controls.Add(Bttn) End Sub

    Private Sub ChangeButtons(byval BtnTabIndex as integer, byval MinTabIndex as integer)

    ''En caso de que no te bases en el 0-x puedes usar un minimo de tab index, para saber cuándo

    detener la creación y recorrer botones:

    Dim Location as system.drawing.point = new system.drawing.point(button.location)

    for each Ctl as control in Me.controls

    If typeof Ctl is Button then

    Dim BtnLocation as integer = ctl.location If ctl.tabindex < BtnTabIndex & ctl.tabindex> MinTabIndex then

    ctl.tabindex = ctltabindex+1

    Dim Space as integer = 5 'Algun espacio Deseado Entre Botones

    ctl.location = new system.drawing.point( Btnlocation.x+50+Btnlocation.y+50+Space)

    End if

    End if

    Next

    Now This Have To Happen On Every Click in The Button You're Creating, And I Don't know how to create an Event

    So as this far.. Good Luck!

    martes, 7 de abril de 2015 0:55
  • Gracias por la respuesta Raul_G_M

    Pero parece que no funciona.

    Lo que funcionarías es algo parecido a lo que se produce en el juego Tetris cuando no quedan espacios vacíos en alguna fila. Que al desaparecer la fila, las que están por encima bajan hasta encontrarse con las que quedan abajo.

    ¡Animación vertical! ...Horizontal sería para agregar un nuevo Button en una posición aleatoria cada vez para que vaya bajando hasta encontrar otro Button.

    martes, 7 de abril de 2015 7:23
  • Prueba este ejemplo.

    Al saltar el timer recorro todos los botones para comprobar si alguno se tiene que mover, si no creo uno nuevo.

    Le he añadido un controlador de evento click para que al pulsar un botón se elimine y poder probar la funcionalidad:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            If Timer1.enabled Then
                Timer1.Stop()
            Else
                Timer1.Interval = 50
                Timer1.Start()
            End If
        End Sub
    
        Private Sub NuevoButton()
            Dim Bttn As Button = New Button
            Bttn.SetBounds(0, 0, 50, 50)
            AddHandler Bttn.Click, AddressOf BlockButton_Click
            Panel1.Controls.Add(Bttn)
        End Sub
    
        Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
            Dim nuevoBoton As Boolean = True
            Dim botones As IEnumerable(Of Button) = Panel1.Controls.Cast(Of Control).Where(Function(c) TypeOf c Is Button).Cast(Of Button)().OrderByDescending(Function(b) b.Top)
            Dim top = Panel1.Height
            For Each boton As Button In botones
                If (boton.Top + boton.Height < top) Then
                    nuevoBoton = False
                    If (top - boton.Top - boton.Height > 10) Then
                        boton.Top += 10
                    Else
                        boton.Top = top - boton.Height
                    End If
                    Application.DoEvents()
                End If
                top = boton.Top
            Next
            If nuevoBoton Then NuevoButton()
        End Sub
    
        Private Sub BlockButton_Click(sender As Object, e As EventArgs)
            Dim boton As Button = sender
            Panel1.Controls.Remove(boton)
            boton.Dispose()
        End Sub

    • Marcado como respuesta Raf.Man martes, 7 de abril de 2015 10:03
    martes, 7 de abril de 2015 8:21