none
ProgressBar no se ve bien como deberia. RRS feed

  • Pregunta

  • Bueno tengo un formulario MDI y el login esta dentro de el es decir cuando cargo el sistema la ventana login esta dentro de este cuando escribo los datos este desaparece y el menu se habilita

    El tema es que tengo un progress bar cuando este llega al 100% se cierra y da pase a lo que comento.

    Pero el efecto no se ve bien, porque este solo llega a 99% y la barra tb no termina imagino de forma interna este llega al 100% y entonces da paso  pero la idea es que este se llene completo y abajo diga 100% poara recien dar pase, esteticamente eso seria lo correcto.

    mi codigo es:

    Private Sub IncrementoPbar(ByVal sender As Object, ByVal e As EventArgs)
            ProgressBar2.Increment(1)
            Label4.Text = ProgressBar2.Value.ToString() + "% Completado"
            If ProgressBar2.Value = ProgressBar2.Maximum Then
                Time.Stop()
                Me.Close()
                Principal.MenuStrip1.Enabled = True
            End If
        End Sub
    
        Private Sub conteoTime(sender As Object, e As EventArgs)
            CType(sender, Timer).Stop()
            Me.ProgressBar2.Style = ProgressBarStyle.Blocks 
        End Sub
    
        Public Sub showProgressL()
            Dim time As New Timer()
            time.Interval = 25
            AddHandler time.Tick, AddressOf IncrementoPbar
            time.Start()
        End Sub

    Saludos y Gracias


    PD. Este es llamado en el boton acceder. Probando no poner me.close este si llega al 100% la idea es que despues de eso recien se ejecute me.close


    sábado, 1 de abril de 2017 16:45

Respuestas

  • Hola, intenta con este codigo:

        Dim ProgressValue As Integer = 0
        Dim progressFactor As Integer = 10
        Private Sub IncrementoPbar(ByVal sender As Object, ByVal e As EventArgs)
            ProgressValue += 1
            If ProgressValue < 100 Then
                ProgressBar2.Value = ProgressValue * progressFactor
                Label4.Text = ProgressValue.ToString + "% Completado"
                ProgressBar2.Value = ProgressValue * progressFactor - 1
            ElseIf ProgressValue = 100 Then
                ProgressBar2.Value = 100 * progressFactor
                ProgressBar2.Value = 100 * progressFactor - 1
                ProgressBar2.Value = 100 * progressFactor
                ProgressBar2.Refresh()
                Label4.Text = "100% Completado"
            End If
            If ProgressValue > 150 Then
                Time.Stop()
                Threading.Thread.Sleep(1000)
                Me.Close()
                Principal.MenuStrip1.Enabled = True
            End If
        End Sub
    
        Private Sub conteoTime(sender As Object, e As EventArgs)
            CType(sender, Timer).Stop()
            Me.ProgressBar2.Style = ProgressBarStyle.Blocks
        End Sub
    
        Public Sub showProgressL()
            'Dim time As New Timer()
            Time.Interval = 25
            AddHandler Time.Tick, AddressOf IncrementoPbar
            ProgressBar2.Maximum = 100 * progressFactor
            Time.Start()
        End Sub
    

    Este es un problema conocido, ya que la barra de progreso tiene una animacion predefinida.

    Espero que te sirva.

    Saludos.

    • Marcado como respuesta Javier Roque lunes, 3 de abril de 2017 17:35
    lunes, 3 de abril de 2017 15:18
  • Prueba entonces asi:

     Dim ProgressValue As Integer = 0
        Dim ProgressIncrement As Integer = 1 'controlas velocidad de incremento
        Dim progressFactor As Integer = 10000 'entre mas grande, el brinco al final sera menos notorio
        Dim Reached As Boolean = False
        Private Sub IncrementoPbar(ByVal sender As Object, ByVal e As EventArgs)
            ProgressValue += ProgressIncrement
            If ProgressValue < 100 Then
                ProgressBar2.Value = ProgressValue * progressFactor
                Label4.Text = ProgressValue.ToString + "% Completado"
                ProgressBar2.Value = ProgressValue * progressFactor - 1
            Else
                Reached = True
            End If
    
            If Reached Then
                ProgressBar2.Value = 100 * progressFactor
                ProgressBar2.Value = 100 * progressFactor - 1
                ProgressBar2.Value = 100 * progressFactor
                ProgressBar2.Refresh()
                Label4.Text = "100% Completado"
            End If
    
            If ProgressValue > 100 Then
                Time.Stop()
                Threading.Thread.Sleep(1000) 'controlas tiempo de cerrado
                Me.Close()
                Principal.MenuStrip1.Enabled = True
            End If
        End Sub
    
        Private Sub conteoTime(sender As Object, e As EventArgs)
            CType(sender, Timer).Stop()
            Me.ProgressBar2.Style = ProgressBarStyle.Blocks
        End Sub
    
        Public Sub showProgressL()
            'Dim time As New Timer()
            Time.Interval = 25 ' controlas tiempo de actualizacion
            AddHandler Time.Tick, AddressOf IncrementoPbar
            ProgressBar2.Maximum = 100 * progressFactor
            Time.Start()
        End Sub
    Saludos.

    • Marcado como respuesta Javier Roque lunes, 3 de abril de 2017 23:10
    lunes, 3 de abril de 2017 18:42

Todas las respuestas

  • Fíjate que en  IncrementoPbar cuando llegas al Maximum inmediatamente haces un Close, con lo que se cierra el formulario y no da oportunidad de que se visualice el valor que justo un par de líneas más arriba le has metido al ProgressBar. Prueba a poner un Application.DoEvents() justo después de asignar los valores al progressbar y al label. Posiblemente seguido de una pequeñísima pausa (por ejemplo un Sleep(100)) para que dé tiempo a que se vea.

    sábado, 1 de abril de 2017 17:27
  • Sale esto:

    lo del sleep no entendi a quien pertenece? Threading.Thread.Sleep(100)

    agrego eso y ya no cierra xD (Me.Close)


    sábado, 1 de abril de 2017 17:37
  • lo del sleep no entendi a quien pertenece? 

    System.Threading.Thread.Sleep(100).

    Pero no hay ninguna razón para que eso impida que se cierre, salvo que haya alguna otra circunstancia extraña, como por ejemplo que el Timer se esté disparando más rápido que eso, y el Application.DoEvents le dé la oportunidad de re-entrar en la rutina antes de que llegue al Time.Stop(). Pon el Sleep DESPUËS del Time.Stop(), justo antes del Me.Close().

    sábado, 1 de abril de 2017 18:20
  • Es asi como lo tengo despues del stop y antes del close pero llega al 100% el texto pero el progress bar no llena todo
    sábado, 1 de abril de 2017 19:41
  • Revisa a ver qué valor tiene el progressbar en su propiedad Maximum, no vaya a ser que por alguna razón no sea 100.

    Si no es eso, pon un punto de ruptura con el debugger y sigue la ejecución paso a paso examinando los valores de las variables, a ver si encuentras algo que no se comporte como esperabas.

    sábado, 1 de abril de 2017 21:12
  • Esta en 100 y cuando hago paso a paso si se ve que la barra se llena y marca 100% como decir en camara lenta lo hace pero en ejecucion normal.no se ve asi lleno del todo no apenas le falta pokisimo para llenar y pasa.

    En ocasiones la barra avanza de dos en dos aveces de uno en uno cuando esta x llegar al maximo

    Del 86% se pasa al 91% y luego sigue
    Pero hay algo con el.timer bueno el intervalo esta en 25 cuando lo pongo 100 la barra llega casi a llenar no llena 

    sábado, 1 de abril de 2017 21:41
  • He notado algo el time.interval alli esta el detalle del efecto. si le pongo menos por ejemplo 10 los numeros llegan a 100% pero la barra solo queda a la mitad, si le pongo 200 la barra llega casi a terminar pero si aumento la secuencia es lenta y demoraria entonces tener el acceso. 

    Que opciones tengo de mejorar eso.

    sábado, 1 de abril de 2017 22:04
  • Le voy hacer algo para que esto funcione mejor y luego de presionar un boton recien desaparesca eso va.ser mejor que esto de la barra.se vea. Ya que no encuentro otra forma de solucionarlo
    lunes, 3 de abril de 2017 2:08
  • Hola:

    Un truco sería salir en el 101% ;-), prueba lo siguiente:

    Private Sub IncrementoPbar(ByVal sender As Object, ByVal e As EventArgs)
       If ProgressBar2.Value = ProgressBar2.Maximum Then
          Time.Stop()
          Me.Close()
          Principal.MenuStrip1.Enabled = True
       Else
          ProgressBar2.Increment(1)
          Label4.Text = ProgressBar2.Value.ToString() + "% Completado"
       End If
    End Sub

    Espero que te sirva.

    Un saludo

    lunes, 3 de abril de 2017 10:47
  • Hola, intenta con este codigo:

        Dim ProgressValue As Integer = 0
        Dim progressFactor As Integer = 10
        Private Sub IncrementoPbar(ByVal sender As Object, ByVal e As EventArgs)
            ProgressValue += 1
            If ProgressValue < 100 Then
                ProgressBar2.Value = ProgressValue * progressFactor
                Label4.Text = ProgressValue.ToString + "% Completado"
                ProgressBar2.Value = ProgressValue * progressFactor - 1
            ElseIf ProgressValue = 100 Then
                ProgressBar2.Value = 100 * progressFactor
                ProgressBar2.Value = 100 * progressFactor - 1
                ProgressBar2.Value = 100 * progressFactor
                ProgressBar2.Refresh()
                Label4.Text = "100% Completado"
            End If
            If ProgressValue > 150 Then
                Time.Stop()
                Threading.Thread.Sleep(1000)
                Me.Close()
                Principal.MenuStrip1.Enabled = True
            End If
        End Sub
    
        Private Sub conteoTime(sender As Object, e As EventArgs)
            CType(sender, Timer).Stop()
            Me.ProgressBar2.Style = ProgressBarStyle.Blocks
        End Sub
    
        Public Sub showProgressL()
            'Dim time As New Timer()
            Time.Interval = 25
            AddHandler Time.Tick, AddressOf IncrementoPbar
            ProgressBar2.Maximum = 100 * progressFactor
            Time.Start()
        End Sub
    

    Este es un problema conocido, ya que la barra de progreso tiene una animacion predefinida.

    Espero que te sirva.

    Saludos.

    • Marcado como respuesta Javier Roque lunes, 3 de abril de 2017 17:35
    lunes, 3 de abril de 2017 15:18
  • Buenos Dias, funciona bastante bien, pero hay una observacion, si le doy cerrar sesion desde el menu e ingreso los datos, la barra va lentisisisimo. Pero igual lo que se quiere lo hace.

    Gracias

    lunes, 3 de abril de 2017 16:32
  • Prueba entonces asi:

     Dim ProgressValue As Integer = 0
        Dim ProgressIncrement As Integer = 1 'controlas velocidad de incremento
        Dim progressFactor As Integer = 10000 'entre mas grande, el brinco al final sera menos notorio
        Dim Reached As Boolean = False
        Private Sub IncrementoPbar(ByVal sender As Object, ByVal e As EventArgs)
            ProgressValue += ProgressIncrement
            If ProgressValue < 100 Then
                ProgressBar2.Value = ProgressValue * progressFactor
                Label4.Text = ProgressValue.ToString + "% Completado"
                ProgressBar2.Value = ProgressValue * progressFactor - 1
            Else
                Reached = True
            End If
    
            If Reached Then
                ProgressBar2.Value = 100 * progressFactor
                ProgressBar2.Value = 100 * progressFactor - 1
                ProgressBar2.Value = 100 * progressFactor
                ProgressBar2.Refresh()
                Label4.Text = "100% Completado"
            End If
    
            If ProgressValue > 100 Then
                Time.Stop()
                Threading.Thread.Sleep(1000) 'controlas tiempo de cerrado
                Me.Close()
                Principal.MenuStrip1.Enabled = True
            End If
        End Sub
    
        Private Sub conteoTime(sender As Object, e As EventArgs)
            CType(sender, Timer).Stop()
            Me.ProgressBar2.Style = ProgressBarStyle.Blocks
        End Sub
    
        Public Sub showProgressL()
            'Dim time As New Timer()
            Time.Interval = 25 ' controlas tiempo de actualizacion
            AddHandler Time.Tick, AddressOf IncrementoPbar
            ProgressBar2.Maximum = 100 * progressFactor
            Time.Start()
        End Sub
    Saludos.

    • Marcado como respuesta Javier Roque lunes, 3 de abril de 2017 23:10
    lunes, 3 de abril de 2017 18:42
  • Gracias Quedo bien.
    lunes, 3 de abril de 2017 23:10