 VB.NET
- Criando um cronômetro com stopwatch e Timer
VB.NET
- Criando um cronômetro com stopwatch e Timer
Este artigo eu mostro como criar um cronômetro simples usando a classe StopWatch e o componente Timer.
Aproveitando o artigo eu também vou mostrar como realizar algumas tarefas básicas usando o VB .NET :
Então antes de iniciar a prática vamos falar um pouco da classe StopWatch.
A classe Stopwatch fornece um conjunto de métodos e propriedades que você pode usar para medir de uma maneira mais precisa o tempo transcorrido.
O classe Stopwatch é muito útil para calcular o tempo que foi gasto entre dois intervalos de tempo em uma aplicação VB .NET.
Para usar o objeto Stopwatch  
você precisa chamar o seu método Start para iniciar a
contagem do tempo; o método Stop interrompe a contagem. O
método Reset é útil para limpar a contagem do tempo
iniciando o contador.
Temos a seguir a
sequência das etapas usadas para usar esta classe:
| 'Primeiro você cria uma nova instância da classe Dim cronometro As New Stopwatch ' Em seguida você inicia a contagem do tempo cronometro.Start() ' Aguarda a realização da operação VB .NET ' Após o encerramento da tarefa você para a contagem do tempo cronometro.Stop() ' Por último você exibe o tempo gasto para executar a tarefa em milisegundos Debug.WriteLine(stopWatch.ElapsedMilliseconds.ToString) | 
Uma instância da classe
StopWatch pode estar em execução (Running) ou parada (Stopped),
para determinar o estado atual de uma instância StopWatch você
usa o método IsRunning.
O tempo gasto pode ser consultado através das propriedades Elapsed,
ElapsedMiliseconds ou ElapsedTicks, e isso pode ser
feito enquando a instância estiver em execução ou parada.
O método Reset é usado para limpar o tempo gasto acumulado em uma instância existente da classe StopWatch.
Criando um Cronômetro
Para exemplificar a utilização da classe StopWatch vou criar um cronômetro simples usando o Visual Basic 2008 Express Edition.
Abra o VB 2008 Express Edition e crie um novo projeto do tipo Windows Forms com o nome cronometro;
A seguir inclua os seguintes componentes no formulário padrão form1.vb:
Agora defina as seguintes propriedades do formulário form1.vb:
Defina o seguinte leiaute no formulário:
|  | 
1- Definindo um formulário elíptico
Para alterar o formato retangular padrão do formulário podemos usar o evento Paint do formulário e usando a classe Graphics criando um objeto pelo método CreateGraphics() para em seguida desenharmos uma elipse e preenchendo-a com uma cor definida.
|    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
        Dim gr As System.Drawing.Graphics = Me.CreateGraphics()
        ' preenche a elipse.
        gr.FillEllipse(System.Drawing.Brushes.Coral, 0, 0, _
            Me.ClientSize.Width - 5, _
            Me.ClientSize.Height - 5)
    End Sub | 
Obs: Para obter o efeito desejado a propriedade BorderStyle do formulário deve ser definida como None.
2- Usando o controle Timer
No evento Tick do controle Timer estamos verificando se existe uma instância da classe StopWatch em execução(Running), e, neste caso obtemos o tempo gasto e o colocamos em uma variável do tipo TimeSpan para em seguida exibir o resultado formatado em horas, minutos e segundos e milisegundos e exibimos os valores no DataGridView.
| Private Sub Cronometro_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cronometro.Tick
        If crono.IsRunning Then
         'Coloca o tempo total na variável do tipo TimeSpan
            Dim ts As TimeSpan = crono.Elapsed
          ' Mostra a informação dividida em Horas, Minutos, Segundo e Milisegundos.
           Me.txtCronometro.Text = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10)
           'incluir a informação no DataGridView
           If lapAtiva Then
                  Me.dgvTempos.Rows.Add(Me.dgvTempos.Rows.Count, txtCronometro.Text)
                  lapAtiva = False
           End If
End If
End Sub | 
3- Iniciando o cronômetro
Para iniciar o cronômetro definimos o código abaixo no evento Click do botão Iniciar.
O código verifica se existe uma instância em execução da classe StopWatch e neste caso para a contagem de tempo da instância e altera as propriedades dos botões de comando, caso contrário, inicia a contagem de tempo;
|  Private Sub btnIniciar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIniciar.Click
        If crono.IsRunning Then
            crono.Stop()
            btnIniciar.Text = "Iniciar"
            btnTempo.Text = "ReIniciar"
            btnSalvar.Enabled = True
            btnRemover.Enabled = True
        Else
            crono.Start()
            btnIniciar.Text = "Parar"
            btnTempo.Text = "Tempo"
            btnSalvar.Enabled = False
            btnRemover.Enabled = False
        End If
    End Sub | 
4- Obtendo uma tomada de tempo
No evento Click do botão Tempo, definimos o código abaixo onde alteramos a propriedade da variável lapAtiva para True de forma a exibir os dados no DatagridView através do evento Tick do controle Timer. Se a propriedade Text do botão for diferente de "Tempo" usamos a propriedade Reset() para limpar a contagem do tempo reiniciando o contador.
| Private Sub btnTempo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTempo.Click
        If btnTempo.Text = "Tempo" Then
            If crono.IsRunning Then
                lapAtiva = True
            End If
        Else
            txtCronometro.Text = "00:00:00.00"
            btnTempo.Text = "Tempo"
            crono.Reset()
        End If
    End Sub | 
5- Salvando os dados do DataGridView em um arquivo texto
Podemos salvar os dados de tempos tomados e exibidos no DataGridView; para isso definimos a rotina salvaTempos() cujo código é mostrado a seguir.
Nele obtemos a data atual no formato longo e removemos os dois pontos para montar a variável caminho que define o caminho e nome do arquivo que será salvo. Dessa forma teremos arquivos com nomes distintos a cada tomada de tempo.
Em seguida criamos um objeto StreamWriter e percorrermos o DataGridView salvando os dados das duas células existentes.
| Private Sub salvaTempos()
        Dim data As Date = Now
        Dim valor As String = data.ToLongTimeString.Replace(":", "")
        Dim caminho As String = "c:\dados\tempos" & valor & ".txt"
        Using writer As New StreamWriter(caminho)
            For Each row As DataGridViewRow In Me.dgvTempos.Rows
                writer.WriteLine(String.Format("{0},{1}", _
                row.Cells(0).Value, _
                row.Cells(1).Value))
            Next
        End Using
    End Sub | 
6- Limpando as linhas do DataGridView
Para limpar as linhas do DataGridView usamos o método Clear da classe Rows. Isso vai funcionar pois o nosso DataGridView esta sendo usando no modo não vinculado e não temos um datasource associado ao mesmo. O código é o seguinte:
| Private Sub btnRemover_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRemover.Click
        dgvTempos.Rows.Clear()
    End Sub  | 
7- Salvando os dados do DataGridView
Para salvar os dados apenas chamamos a rotina salvaTempos() já definida no evento Click do botão Salvar:
| Private Sub btnSalvar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalvar.Click
        salvaTempos()
    End Sub	 | 
8- Encerrando a aplicação
Para encerrar basta definir o código abaixo no evento Click do botão Sair:
| Private Sub btnSair_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSair.Click
        If MsgBox("Deseja encerrar ?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
            Close()
        End If
    End Sub | 
Executando o projeto e efetuando algumas tomadas de tempos teremos como resultado o formulário abaixo e o arquivo salvo com o nome tempos111321.txt, os tempos tomados sendo exibidos no bloco de notas:
|  |  | 
Embora simples a aplicação apresenta alguns conceitos básicos e mostra como efetuar algumas tarefas envolvendo os controles Timer e DataGridView.
Eu sei é apenas VB .NET, mas eu
gosto...
Referências:
José Carlos Macoratti