AJUSTE CRONOMETRO REGRESSIVO

LEANDRORIBAS 15/12/2012 08:55:05
#415998
Srs Bom Dia !!!

Tenho o referido código abaixo referente a um cronometro regressivo, estou com problemas no label pois não consigo adicionar o zero a esquerda do mesmo para que fique com o formato padrão de um cronometro (EX: 01:09), peço ajuda aos experte[ô]s para a solução do caso:

Private Sub iniciar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles iniciar.Click
Timer1.Interval = 1000
Label2.Text = NumericUpDown1.Value
Timer1.Enabled = True
iniciar.Enabled = False
parar.Enabled = True
reiniciar.Enabled = False
End Sub

Private Sub parar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles parar.Click
Timer1.Stop()
parar.Enabled = False
reiniciar.Enabled = True

End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If Label3.Text = 0 Then
Label3.Text = 60
Label2.Text -= 1
End If
Label3.Text -= 1
End Sub

Private Sub reiniciar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles reiniciar.Click
Timer1.Interval = 1000
Timer1.Enabled = True
iniciar.Enabled = False
parar.Enabled = True
End Sub

End Class
MARCELO.TREZE 15/12/2012 17:55:28
#416012
o código acima se refere a vb.net favor postar no fórum vb.net

porém em vb6 seria assim

Label3.Text = Format(60,[Ô]00:00[Ô])
PROFESSOR 15/12/2012 21:59:56
#416018
Bom, em relação á formatação, se você está formatando como Hora um inteiro ou um duplo e não uma data, pode usar o StringFormat da seguinte forma:

Label3.Text = String.Format([Ô]{0:mm:ss}[Ô], Date.FromOADate(seuValorInteiroOuDuplo))


Mas, cronômetro ? De fato, eu nunca havia pensado nesse assunto, que eu me lembre. Parece simples, então pensei quase de imediato, já que está usando a .Net, porquê não usar o TimeSpan ?
Explico:
Um cronômetro funcionaria de forma análoga á um timer, porém reversa, ou seja, dado um intervalo, a contagem é regressiva. Além disso, ao término do intervalo, o cronômetro deveria [Ô]avisar[Ô] que o tempo permitido se esgotou. Gostei do desafio !
Dessa forma, fiz agora uma classe WinForms (mas que pode ser facilmente adaptada para outras saídas), baseada em Timer e TimeSpan, simulando um cronômetro simples, com dois eventos: Tick (ocorre sempre que 1 segundo se passa) e Timeout (ocorre quando o intervalo de tempo se esgora), e que pode ser de alguma ajuda para você. Estou postando aqui.

Imports Microsoft.VisualBasic
Imports System

Public Class Cronometro
Implements IDisposable

#Region [Ô] Variáveis de trabalho [Ô]
[ô][ô][ô] <summary>
[ô][ô][ô] Temporizador.
[ô][ô][ô] </summary>
[ô][ô][ô] <remarks></remarks>
Private WithEvents mTimer As Timer
[ô][ô][ô] <summary>
[ô][ô][ô] Momento de início da contagem.
[ô][ô][ô] </summary>
[ô][ô][ô] <remarks></remarks>
Private mAgora As DateTime = Nothing
[ô][ô][ô] <summary>
[ô][ô][ô] Mantém o status da instância.
[ô][ô][ô] </summary>
[ô][ô][ô] <remarks></remarks>
Private mDisposedValue As Boolean = False
[ô][ô][ô] <summary>
[ô][ô][ô] Mantém o intervalo de atualização em segundos.
[ô][ô][ô] </summary>
[ô][ô][ô] <remarks></remarks>
Private mDelayInSeconds As Integer = 60
[ô][ô][ô] <summary>
[ô][ô][ô] Mantém o texto representando o tempo decorrido.
[ô][ô][ô] </summary>
[ô][ô][ô] <remarks></remarks>
Private mElapsedTimeString As String = [Ô][Ô]
[ô][ô][ô] <summary>
[ô][ô][ô] Mantém o TimeSpan relacionado ao tempo decorrido.
[ô][ô][ô] </summary>
[ô][ô][ô] <remarks></remarks>
Private mElapsedTime As TimeSpan = Nothing
#End Region

#Region [Ô] Evento público [Ô]
[ô][ô][ô] <summary>
[ô][ô][ô] Ocorre sempre que o Timer dispara com o intervalo definido.
[ô][ô][ô] </summary>
[ô][ô][ô] <param name=[Ô]sender[Ô]></param>
[ô][ô][ô] <param name=[Ô]e[Ô]></param>
[ô][ô][ô] <remarks></remarks>
Public Event Tick(ByVal sender As Object, ByVal e As EventArgs)
[ô][ô][ô] <summary>
[ô][ô][ô] Ocorre sempre que o intervalo definido se esgota.
[ô][ô][ô] </summary>
[ô][ô][ô] <param name=[Ô]sender[Ô]></param>
[ô][ô][ô] <param name=[Ô]e[Ô]></param>
[ô][ô][ô] <remarks></remarks>
Public Event TimeOut(ByVal sender As Object, ByVal e As EventArgs)
#End Region

#Region [Ô] Propriedades públicas somente-leitura [Ô]
[ô][ô][ô] <summary>
[ô][ô][ô] Configura o intervalo padrão.
[ô][ô][ô] </summary>
[ô][ô][ô] <value>Inteiro, representando o intervalo em segundos.</value>
[ô][ô][ô] <returns>Inteiro, representando o intervalo em segundos.</returns>
[ô][ô][ô] <remarks></remarks>
Public Property DelayInSeconds As Integer
Set(value As Integer)
Me.mDelayInSeconds = value
Me.Pause()
Me.mTimer = New Timer
With Me.mTimer
.Enabled = True
.Interval = TimeSpan.FromSeconds(Me.mDelayInSeconds).Seconds
.Stop()
End With
End Set
Get
Return Me.mDelayInSeconds
End Get
End Property
[ô][ô][ô] <summary>
[ô][ô][ô] Retorna o texto que representa o tempo decorrido.
[ô][ô][ô] </summary>
[ô][ô][ô] <returns>String. Texto representando o tempo decorrido.</returns>
[ô][ô][ô] <remarks></remarks>
Public ReadOnly Property [ElapsedTimeString] As String
Get
Return Me.mElapsedTimeString
End Get
End Property
#End Region

#Region [Ô] Tratamento da instância [Ô]
[ô][ô][ô] <summary>
[ô][ô][ô] Construtor básico (sem parâmetros).
[ô][ô][ô] Assume que o intervalo será de 60 segundos.
[ô][ô][ô] </summary>
[ô][ô][ô] <remarks></remarks>
Public Sub New()
End Sub
[ô][ô][ô] <summary>
[ô][ô][ô] Construtor básico (sem parâmetros).
[ô][ô][ô] </summary>
[ô][ô][ô] <param name=[Ô]parDelayInSeconds[Ô]>Inteiro. Intervalo inicial.</param>
[ô][ô][ô] <remarks></remarks>
Public Sub New(ByVal parDelayInSeconds As Integer)
Me.mDelayInSeconds = parDelayInSeconds
Me.mTimer = New Timer
With Me.mTimer
.Enabled = True
.Interval = Me.mDelayInSeconds
.Stop()
End With
End Sub
[ô][ô][ô] <summary>
[ô][ô][ô] Destruidor efetivo.
[ô][ô][ô] </summary>
[ô][ô][ô] <param name=[Ô]disposing[Ô]>Informa se a instância permanece ativa ou não.</param>
[ô][ô][ô] <remarks></remarks>
Protected Overridable Sub Disposer(disposing As Boolean)
If (Not Me.mDisposedValue) Then
If (disposing) Then
If (Me.mTimer IsNot Nothing) Then
With Me.mTimer
Try
.Stop()
.Enabled = False
Catch ex As Exception
End Try
.Dispose()
End With
Me.mTimer = Nothing
End If
End If
End If
Me.mDisposedValue = True
End Sub
[ô][ô][ô] <summary>
[ô][ô][ô] Destruidor interno.
[ô][ô][ô] </summary>
[ô][ô][ô] <remarks></remarks>
Protected Overrides Sub Finalize()
Disposer(False)
MyBase.Finalize()
End Sub
[ô][ô][ô] <summary>
[ô][ô][ô] Destruidor padrão.
[ô][ô][ô] </summary>
[ô][ô][ô] <remarks></remarks>
Public Sub Dispose() Implements IDisposable.Dispose
Disposer(True)
GC.SuppressFinalize(Me)
End Sub
#End Region

#Region [Ô] Métodos públicos [Ô]
[ô][ô][ô] <summary>
[ô][ô][ô] Inicia o contador. Opcionalmente reinicia
[ô][ô][ô] o horário da contagem.
[ô][ô][ô] </summary>
[ô][ô][ô] <param name=[Ô]restart[Ô]>
[ô][ô][ô] Booleano, opcional.
[ô][ô][ô] Se verdadeiro, reinicia o horário inicial.
[ô][ô][ô] Padrão como verdadeiro
[ô][ô][ô] </param>
[ô][ô][ô] <remarks></remarks>
Public Sub [Start](Optional restart As Boolean = True)
If restart Then Me.mAgora = Now
Me.mTimer.Start()
End Sub
[ô][ô][ô] <summary>
[ô][ô][ô] Encerra o contador. Opcionalmente reinicia
[ô][ô][ô] o horário da contagem.
[ô][ô][ô] </summary>
[ô][ô][ô] <param name=[Ô]restart[Ô]>
[ô][ô][ô] Booleano, opcional.
[ô][ô][ô] Se verdadeiro, reinicia o horário inicial.
[ô][ô][ô] Padrão como verdadeiro
[ô][ô][ô] </param>
[ô][ô][ô] <remarks></remarks>
Public Sub [Pause](Optional restart As Boolean = True)
Me.mTimer.Stop()
End Sub
#End Region

#Region [Ô] Mapeamento de evento [Ô]
[ô][ô][ô] <summary>
[ô][ô][ô] No evento Tick do Timer interno, disparar o evento Tick
[ô][ô][ô] deste componente.
[ô][ô][ô] </summary>
[ô][ô][ô] <param name=[Ô]sender[Ô]>Objeto (no caso, o timer interno)</param>
[ô][ô][ô] <param name=[Ô]e[Ô]>Parâmetros do evento</param>
[ô][ô][ô] <remarks></remarks>
Private Sub mTimer_Tick(sender As Object, e As EventArgs) Handles mTimer.Tick
Static iCount As Integer = 0
Static bAutoStop As Boolean = False
If (iCount >= (Me.mDelayInSeconds - 1)) Then iCount = 0
iCount += 1
If (iCount > 0) Then
Me.mElapsedTime = (DateTime.Now - Me.mAgora)
Dim ts As New TimeSpan(TimeSpan.FromSeconds(Me.mDelayInSeconds).Ticks - Me.mElapsedTime.Ticks)
Me.mElapsedTimeString = ts.ToString([Ô]mm\:ss[Ô])
Dim iElapsed As Integer = ts.Ticks
If (iElapsed > 1) Then
RaiseEvent Tick(Me, e)
Else
Me.Pause()
RaiseEvent TimeOut(Me, e)
End If
End If
End Sub
#End Region
End Class


Para usar a classe, um exemplo, em um formulário com dois botões e um label, faça o seguinte código:

    [ô] - Aqui eu crio a instância da classe, com 15 segundos de intervalo (tempo-limite).
Private WithEvents contador As New Cronometro(15)

[ô] - No evento Tick, atualizar o label no formulário.
Private Sub contador_Tick(sender As Object, e As EventArgs) Handles contador.Tick
With Label2
.Text = contador.ElapsedTimeString
.ForeColor = Color.Black
.BackColor = SystemColors.Control
End With
End Sub

[ô] - No evento Timeout, atualizar o label no formulário.
Private Sub contador_TimeOut(sender As Object, e As EventArgs) Handles contador.TimeOut
With Label2
.Text = [Ô]Tempo Esgotado[Ô]
.ForeColor = Color.Maroon
.BackColor = Color.Yellow
End With
End Sub

[ô] - Este botão inicia o cronômetro (o contador, bem como a hora de início)
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
contador.Start()
End Sub

[ô] - Este botão pausa ou reiinicia o cronômetro mantendo a hora de início original.
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Static ok As Boolean = False
If ok = False Then
Button2.Text = [Ô]Reiniciar[Ô]
contador.Pause(False)
ok = True
Else
Button2.Text = [Ô]Pausar[Ô]
contador.Start(False)
ok = False
End If
End Sub


Espero que ajude.
Faça seu login para responder