none
Barra de Progreso en un tiempo determinado. Ayuda! RRS feed

  • Pregunta

  • Buenas, soy nuevo en este foro, tengo una duda. Mi  programa en una parte muestra por un label las horas que faltan para la salida del trabajo. Lo hice con un timer y el codigo es el siguiente:

         

        Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick

            Dim a As Date
            Dim b As Date

            a = TimeOfDay
            b = "13:00:00"

            Label2.Text = "Faltan " & (b - a).ToString & " Hs. de Trabajo"

    Se que quizas no es lo convencional. No entiendo muy bien todavía como funciona TimeOfDay ni como hacer operaciones correctamente con ellos, de momento este codigo funciona bien para mi.

    La duda surge porque quiero colocar debajo un "PROGRESSBAR" por cada minuto que pase hasta la salida. La salida siempre es a las 13:00. Pero El programa se puede abrir a cualquier hora de la mañana, entonces el intervalo es variable. Me explican como hacerlo? Gracias!










        End Sub

    miércoles, 3 de enero de 2018 3:56

Respuestas

  • Hola:
    En un Form como el de la imagen

    Copia y Pega el siguiente código

    Public Class Form1
        Private mTotalSegundos As Integer
        Private mParcialSegundos As Integer
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.lblValorIni.Text = Now.ToString
            Dim Fin As DateTime = DateAdd(DateInterval.Hour, 13, Date.Today)
            Me.lblValorFin.Text = Fin.ToString
            Dim lTsInicio As New TimeSpan(CDate(Me.lblValorIni.Text).Ticks)
            Dim lTsFin As New TimeSpan(CDate(Me.lblValorFin.Text).Ticks)
            Dim lTDiferencias As TimeSpan = TimeSpan.op_Subtraction(lTsFin, lTsInicio)
            Dim lsDiferencia As String = String.Format("{0:00}:{1:00}:{2:00}", lTDiferencias.Hours, lTDiferencias.Minutes, lTDiferencias.Seconds)
            Me.lblDiferencia.Text = lsDiferencia
            mTotalSegundos = (lTDiferencias.Hours * 3600) + (lTDiferencias.Minutes * 60) + lTDiferencias.Seconds
            ' iniciar el temporizador
            Me.Timer1.Interval = 10000            '10 segundos
            Me.Timer1.Start()
        End Sub

        Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
            mParcialSegundos += 10
            Me.ProgressBar1.Value = CInt((mParcialSegundos * 100) / mTotalSegundos)
            Dim liFalta As Integer = mTotalSegundos - mParcialSegundos
            Dim liHoras As Integer = CInt(liFalta \ 3600)
            liFalta -= liHoras * 3600
            Dim liMinutos As Integer = CInt(liFalta \ 60)
            liFalta -= liMinutos * 60
            Me.lblFalta.Text = String.Format("{0:00}:{1:00}:{2:00}", liHoras, liMinutos, liFalta)
            If mParcialSegundos >= mTotalSegundos Then
                Me.Timer1.Stop()
            End If
        End Sub
    End Class

    Un saludo desde Bilbo
    Carlos
    miércoles, 3 de enero de 2018 9:11
  • Puedes inicializa la barra de progreso con

    Dim a As Date
    Dim b As Date

    a = TimeOfDay
    b = "13:00:00"

    ProgressBar1.Minimum = 0
    ProgressBar1.Maximum = DateDiff(DateInterval.Second, a, b)

    y en el Timer ir actualizándola con

    ProgressBar1.Value = ProgressBar1.Maximum - DateDiff(DateInterval.Second, a, b)


    Saludos, Javier J

    • Marcado como respuesta Manu2324 miércoles, 3 de enero de 2018 13:43
    miércoles, 3 de enero de 2018 8:09

Todas las respuestas

  • Puedes inicializa la barra de progreso con

    Dim a As Date
    Dim b As Date

    a = TimeOfDay
    b = "13:00:00"

    ProgressBar1.Minimum = 0
    ProgressBar1.Maximum = DateDiff(DateInterval.Second, a, b)

    y en el Timer ir actualizándola con

    ProgressBar1.Value = ProgressBar1.Maximum - DateDiff(DateInterval.Second, a, b)


    Saludos, Javier J

    • Marcado como respuesta Manu2324 miércoles, 3 de enero de 2018 13:43
    miércoles, 3 de enero de 2018 8:09
  • Hola:
    En un Form como el de la imagen

    Copia y Pega el siguiente código

    Public Class Form1
        Private mTotalSegundos As Integer
        Private mParcialSegundos As Integer
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.lblValorIni.Text = Now.ToString
            Dim Fin As DateTime = DateAdd(DateInterval.Hour, 13, Date.Today)
            Me.lblValorFin.Text = Fin.ToString
            Dim lTsInicio As New TimeSpan(CDate(Me.lblValorIni.Text).Ticks)
            Dim lTsFin As New TimeSpan(CDate(Me.lblValorFin.Text).Ticks)
            Dim lTDiferencias As TimeSpan = TimeSpan.op_Subtraction(lTsFin, lTsInicio)
            Dim lsDiferencia As String = String.Format("{0:00}:{1:00}:{2:00}", lTDiferencias.Hours, lTDiferencias.Minutes, lTDiferencias.Seconds)
            Me.lblDiferencia.Text = lsDiferencia
            mTotalSegundos = (lTDiferencias.Hours * 3600) + (lTDiferencias.Minutes * 60) + lTDiferencias.Seconds
            ' iniciar el temporizador
            Me.Timer1.Interval = 10000            '10 segundos
            Me.Timer1.Start()
        End Sub

        Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
            mParcialSegundos += 10
            Me.ProgressBar1.Value = CInt((mParcialSegundos * 100) / mTotalSegundos)
            Dim liFalta As Integer = mTotalSegundos - mParcialSegundos
            Dim liHoras As Integer = CInt(liFalta \ 3600)
            liFalta -= liHoras * 3600
            Dim liMinutos As Integer = CInt(liFalta \ 60)
            liFalta -= liMinutos * 60
            Me.lblFalta.Text = String.Format("{0:00}:{1:00}:{2:00}", liHoras, liMinutos, liFalta)
            If mParcialSegundos >= mTotalSegundos Then
                Me.Timer1.Stop()
            End If
        End Sub
    End Class

    Un saludo desde Bilbo
    Carlos
    miércoles, 3 de enero de 2018 9:11
  • Hola Javier!! Muchisimas gracias por contestar! Funcionó de maravillas!! Te marco como respuesta porque anduvo, pero aun asi me tira dos errores.

    Primero: Cuando llega al horario de completarse, que serian 13 hs, "El valor de '8289' no es válido para 'Value'. 'Value' debería estar entre 'minimum' y 'maximum'." Creo que con un if lo soluciono contemplando que llego a su fin...

    Segundo: suponiendo que me en vez de las 13 hs, el fin del trabajo es a las 03 hs (tenia ese horario porque escribi mal y alli me salto el error) y que ahora son las 10:00hs en mi pc. Me tira el siguiente error: "El valor de '-28048' no es un valor válido para 'Maximum'. 'Maximum' debe ser mayor o igual que 0." Este error no se como solucionar.

    Ahora voy a investigar que hace DateDiff(Date!Interval.Second, a, b) porque todavia me falta mucho por aprender! Saludos! y Gracias por tu respuesta!

    miércoles, 3 de enero de 2018 13:54
  • Hola Carlos! Me sirve de mucha ayuda tu respuesta porque tengo que aprender sobre como trabajar con fechas y horas en VB.! Muchas gracias por responder! Saludos desde Chaco, Argentina!
    miércoles, 3 de enero de 2018 13:56
  • Hola! Soy nuevo en el foro. Mi problema es el siguiente. Necesito mostrar un "progressbar" que se incremente en el rango de horario de las 6:30 de la mañana hasta las 13:00 hs que es el tiempo que falta para terminar el trabajo, es decir que la barra este llena a las 13 hs. Y que contemple por ejemplo si ejecuto el programa a las 9 de la mañana que la barra se encuentre a la mitad.

    No lo he podido conseguir, solo hice que funcione con mínimo "0" pero no puedo trabajar con tipo "date" ya que progressbar trabaja con integer si mal no entiendo. Espero su ayuda. Muchas gracias!

    jueves, 4 de enero de 2018 0:18
  • Hola, 

    Para hacerlo muy fino supondremos que modificamos el intervalo cada minuto por lo que necesitamos establecer el rango del progress en valores de 0 a 6,5 horas(que son 390 min)

    Ahora se necesita activar un timer a las 630 de la mañana este timer se ejecuta una vez cada 24 horas(24*60*60*1000 milisengundos de intervalo) Le llamaresmos TimerControlDiario, siempre estara activo y verificara que si la hora actual (DAteTime.Now.Hour>=6 && Datetime.Now.Minute>=630) entonces inicializará el progress al maximo (que sera´390) y activará un segundo timer que llamaremos TimerControlBArraPRogreso .

    El Timer Control Barra Progreso se ejecuta cada 60 segundos (60*1000 mili segundos de intervalo) y lo que hace es decrementar en -(1) cada valor del progress bar (propiedad value) sempre que sea mayor el mínimo establecido (que sera 0) en caso de ser 0 se parará a si mismo (parar el timer TimerControlBarraProgreso)

    Saludos.

    • Propuesto como respuesta Pablo Rubio jueves, 4 de enero de 2018 16:32
    jueves, 4 de enero de 2018 1:00
  • Lo que ocurre es que si la hora actual (a) supera el valor de b la función DateDiff devuelve un valor negativo por lo que ProgressBar1.Value supera el valor máximo. Para controlar esto basta con que hagas:

    Dim Valor as Long = ProgressBar1.Maximum - DateDiff(DateInterval.Second, a, b)
    If Valor <= ProgressBar1.Max AndAlso Valor >= ProgressBar1.Min Then
        ProgressBar1.Value = Valor
    End If

    En el segundo caso que planteas ocurre lo mismo. Como la hora b es anterior a la hora a, DateDiff devuelve un valor negativo. Puedes usar Span controlando esta situación de una forma parecida a esta:

    Public Class Form1

        Dim a As Date
        Dim b As Date = "03:00:00"

        Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick

            a = TimeOfDay

            Dim span As TimeSpan

            If b >= a Then
                span = b - a
            Else
                span = (CDate("23:59:59") - a) + (b - CDate("00:00:00"))
            End If

            ProgressBar1.Value = ProgressBar1.Maximum - Math.Abs(span.TotalSeconds)

            Label2.Text = "Faltan " & span.Hours & " Hs., " & span.Minutes & " Min., " & span.Seconds & " Seg. de Trabajo"
        End Sub

        Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
            Dim span As TimeSpan
            a = TimeOfDay
            If b >= a Then
                span = b - a
            Else
                span = (CDate("23:59:59") - a) + (b - CDate("00:00:00"))
            End If
            ProgressBar1.Minimum = 0
            ProgressBar1.Maximum = Math.Abs(span.TotalSeconds)
        End Sub
    End Class


    Saludos, Javier J

    • Propuesto como respuesta Pablo Rubio viernes, 5 de enero de 2018 15:51
    jueves, 4 de enero de 2018 7:47
  • Hola:
    Mira el siguiente enlace

    https://social.msdn.microsoft.com/Forums/es-ES/22b0714e-b737-427f-a09d-21d24ed2a7a7/barra-de-progreso-en-un-tiempo-determinado-ayuda?forum=vbes

    Hay tienes un ejemplo, solo tienes que adaptarlo a tus necesidades
    Un saludo desde Bilbo
    Carlos
    • Propuesto como respuesta Pablo Rubio jueves, 4 de enero de 2018 15:15
    jueves, 4 de enero de 2018 7:53