none
Generar número automaticamente

    Pregunta

  • Buenas tardes, estoy intentando que a través de un botón me sume un número de 1 en 1 y lo muestre en un label, pero me dice que la operación aritmética provoca desbordamiento. 

    En el evento click del botón le pongo lo siguiente,

     Dim a As Integer = 1
                Do
                    a = a + 1

                Loop

                Label12.Text = a

    Estaría bien así o como es la mejor manera de hacerlo.

    Gracias por vuestra ayuda


    óscar marés

    sábado, 11 de marzo de 2017 18:22

Respuestas

  • Hola oscar marés,

    Lo que pasa es que estás realizando un loop infinito, si te das cuenta dentro del Do-Loop incrementas la variable  +1 pero nunca le dices cuando va a acabar (te falta agregar Loop Until a > algúnNumero), y claro está que este se ejecutará hasta que se produzca un desbordamiento de memoria como te está indicando.

    Instrucción Do...Loop (Visual Basic)

    Podrías ayudarte con un While.

    Dim num As Integer = 1
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
        'Mientras la variable "num" sea menor a 20 ejecutamos lo siguiente
        While num < 20
    
            'Incrementamos el valor de la variable
            num += 1
    
            'Asignamos el valor al Label
            Label12.Text = num.ToString()
    
            'Aplicamos un pausa de 100 milisegundos para poder verlo
            Thread.Sleep(100)
    
            Application.DoEvents()
        End While
    End Sub

    Pruébalo y comentas como te va.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    sábado, 11 de marzo de 2017 19:00
  • oscar marés,

    Sería conveniente que leas la parte teórica del aporte y no sólo te concentres en el código adjunto.

    Mencioné que la variable debes declararla a nivel de clase, al declarar la variable 'a' dentro del evento Load la variable tiene un ámbito de método por tanto no es visible dentro del evento clic del botón.

    Public Class Form1 'Clase
    	Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    		'...
    	End Sub
    	
    	Dim a As Integer = 0 'Variable declarada a nivel de la clase Form1
    
    	Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btnBorrar.Click
    
    		a += 1;
    		
    		Label1.Text =  a.ToString
    
    	End Sub
    End Sub


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 11 de marzo de 2017 19:05

Todas las respuestas

  • oscar marés,

    Obtienes la excepción 'OverFlowException' porque no estableces un limite (condición) para la cantidad de veces que se incrementará en una unidad la variable 'a', por tanto provocas desbordamiento.

    Por ejemplo, si deseas incrementar en una unidad la variable 'a' puedes utilizar la siguiente instrucción:

    Dim a As Integer = 0
    
    Do While a < 10
    	a = a + 1
    	'Forma reducida: a += 1;
    
    	MessageBox.Show(a.ToString)
    Loop

    Sin embargo, si lo que buscas es incrementar la variable 'a' por cada vez que se produce el evento clic de un botón entonces debes declarar la variable a nivel de clase, por ejemplo:

    Dim a As Integer = 0
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
    	a += 1; 'Se incrementa en una unidad la variable a
    	
    	Label12.Text =  a.ToString
    
    End Sub


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 11 de marzo de 2017 18:54
  • Ok muchísimas gracias!

    Me pongo a ello


    óscar marés

    sábado, 11 de marzo de 2017 18:55
  • Hola de nuevo!

    He declarado la variable a en el load del form y en el botón me da error a la hora de utilizarla


    óscar marés

    sábado, 11 de marzo de 2017 18:58
  • Hola oscar marés,

    Lo que pasa es que estás realizando un loop infinito, si te das cuenta dentro del Do-Loop incrementas la variable  +1 pero nunca le dices cuando va a acabar (te falta agregar Loop Until a > algúnNumero), y claro está que este se ejecutará hasta que se produzca un desbordamiento de memoria como te está indicando.

    Instrucción Do...Loop (Visual Basic)

    Podrías ayudarte con un While.

    Dim num As Integer = 1
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
        'Mientras la variable "num" sea menor a 20 ejecutamos lo siguiente
        While num < 20
    
            'Incrementamos el valor de la variable
            num += 1
    
            'Asignamos el valor al Label
            Label12.Text = num.ToString()
    
            'Aplicamos un pausa de 100 milisegundos para poder verlo
            Thread.Sleep(100)
    
            Application.DoEvents()
        End While
    End Sub

    Pruébalo y comentas como te va.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    sábado, 11 de marzo de 2017 19:00
  • Logrado!

    Muchas gracias y perdón por las molestias


    óscar marés

    sábado, 11 de marzo de 2017 19:00
  • Lo que en realidad quiero es generar un número de ticket cada vez que le de a nuevo pedido, por eso no quería darle un tope, pero me guardo tu código que seguro que me hará falta algún día y es bueno tener donde fijarte.

    Muchas gracias!

    Por cierto, como podéis ver soy muy nuevo en esto. ¿Cómo puedo hacer a la hora de guardar en una bd access el número de ticket sólo una vez? que no se repita tantas veces como valores introduzco en la bd desde un datagrid.

    Gracias de nuevo.


    óscar marés

    sábado, 11 de marzo de 2017 19:04
  • oscar marés,

    Sería conveniente que leas la parte teórica del aporte y no sólo te concentres en el código adjunto.

    Mencioné que la variable debes declararla a nivel de clase, al declarar la variable 'a' dentro del evento Load la variable tiene un ámbito de método por tanto no es visible dentro del evento clic del botón.

    Public Class Form1 'Clase
    	Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    		'...
    	End Sub
    	
    	Dim a As Integer = 0 'Variable declarada a nivel de la clase Form1
    
    	Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btnBorrar.Click
    
    		a += 1;
    		
    		Label1.Text =  a.ToString
    
    	End Sub
    End Sub


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 11 de marzo de 2017 19:05
  • Fue responderte y darme cuenta, gracias.

    ya está solucionado


    óscar marés

    sábado, 11 de marzo de 2017 19:07