Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

VB.NET: Dicas de Programação #6

DateTimePicker – Sem Selecção (nulo)

   

O DateTimePicker é um excelente controlo para seleccionar e mostrar datas ou horas. Não necessita de validação, é fácil de seleccionar ou incrementar, permite uma introdução directa e é visualmente bastante agradável. Mas, e como não há regra sem excepção, tem um grande defeito: não tem uma possibilidade directa simples de indicar que não existe escolha, ou seja, colocar uma selecção a nulo.

   

Quando estamos a inserir ou a mostrar dados, o controlo DateTimePicker indica sempre uma data/hora. Isto obriga a uma adaptação por parte do programador, criando um conjunto de soluções alternativas, para indicar que não existe nenhuma selecção. Há quem coloque uma data (tipo 01-01-1900), há quem coloque uma checkbox para habilitar/desabilitar o controlo e há quem simplesmente não o utilize.

 

   

A melhor solução, e é obviamente a minha opinião, é mostrar sem nada (em branco), indicando que não tem selecção. Para fazer isto é necessário o seguinte:

   

DATA

   

Para mostrar a data em branco é necessário definir o controlo DateTimePicker com o formato Custom (personalizado) e indicar um espaço em branco (“ “)

   

    Me.DateTimePicker1.Format = DateTimePickerFormat.Custom

    Me.DateTimePicker1.CustomFormat = " "

   

Depois, e quando o utilizador seleccionar uma data, repomos o formato normal

   

    Private Const EmptySpace As String = " "

   

    ' Detecta que foi alterado um valor(data) no DateTimePicker

    Private Sub DateTimePicker1_ValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) _

                                        Handles DateTimePicker1.ValueChanged

   

        ' Verifica se o texto é um espaço em branco

        If DateTimePicker1.Text = EmptySpace Then

   

            ' Define o formato como Shot (formato DD-MM-YYYY) e dá um

            ' enter para fechar (CloseUp) da janela que está aberta

            Me.DateTimePicker1.Format = DateTimePickerFormat.Short

            SendKeys.Send("{ENTER}")

   

        End If

   

    End Sub

   

   

HORA

   

Como no caso anterior é necessário definir o controlo DateTimePicker com o formato Custom (personalizado) e indicar um espaço em branco (“ “). O problema é que neste caso o utilizador inicia a alteração da hora/ através dos botões UpDown uma vez que não consegue introduzir manualmente (não permite o focus uma vez que não tem valores). Para detectarmos que o utilizador clicou com o rato num botão de incremento/decremento é necessário fazer o override ao WndProc, uma vez que os eventos MouseDown ou MouseUp não detectam os botões.

   

O melhor é criar um controlo personalizado em que se define este processo. No exemplo o controlo tem o nome de myDateTimePicker.

   

   

  Me.MyDateTimePicker1.ShowUpDown = True

  Me.MyDateTimePicker1.Format = DateTimePickerFormat.Custom

  Me.MyDateTimePicker1.CustomFormat = " ""

   

O código para o controlo personalizado, fazendo o override ao WndProc é o seguinte:

   

           

Public Class myDateTimePicker

    Inherits DateTimePicker

   

    Const EmptySpace As String = " "

   

    ' Constante que verifica se foi utilizado o botão esquerdo do rato

    Private Const WM_LBUTTONDOWN = &H201

   

    ' Overrides ao WndProc

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

   

        ' Caso seja o botão esquerdo e o texto esteja com um espaço em branco

        If m.WParam = WM_LBUTTONDOWN Then

            If Me.Text = EmptySpace Then

   

                Me.Format = DateTimePickerFormat.Time

   

            End If

        End If

   

        MyBase.WndProc(m)

   

    End Sub

   

End Class

   

   

Para terminar, pode-se ainda apagar a formatação quando o utilizador pressionar a tecla DEL, nos eventos KeyUp, KeyDown ou KeyPress.

   

   

    Private Sub MyDateTimePicker1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) _

                     Handles MyDateTimePicker1.KeyDown

   

        ' Caso a tecla seja a DELETE

        If e.KeyCode = Keys.Delete Then

            Me.MyDateTimePicker1.Format = DateTimePickerFormat.Custom

            Me. MyDateTimePicker1.CustomFormat = " "

        End If

   

    End Sub

   

   

Este é um exemplo de como melhorar a utilização deste controlo tornando-o quase “perfeito”.

   

 

StopWatch Medindo o Tempo de Execução

   

Existem formas diferentes de construir código de modo a executar algo. Umas mais rápidas, umas mais simples ou mesmo mais versáteis. As operações mais demoradas estão normalmente relacionadas com a gestão de dados (bases de dados, ficheiros, etc.) mas as pequenas optimizações em conjunto, podem melhorar a performance da aplicação. Nos casos de duvida, em que qual é o método mais rápido para fazer algo, o melhor mesmo é testar.

   

O StopWatch permite medir de uma forma bastante simples o tempo de execução, utilizando muito pouco código. O método para testar o tempo de execução de diferentes métodos é sempre o mesmo, ou seja:

   

  .  ' Cria-se uma nova instância

    Dim stopWatch As New Stopwatch

   

    ' Inicia-se a contagem

    stopWatch.Start()

   

    ' Faz-se um ciclo com várias repetições para verificar o tempo que demorou

    ' a executar. Caso o código já seja demorado, não é necessário ciclo

    For x As Integer = 0 To 10000

        ' código a testar

    Next

   

    ' Para-se a contagem

    stopWatch.Stop()

   

    ' Mostra-se o tempo que demorou a executar em milisegundos

    Debug.WriteLine(stopWatch.ElapsedMilliseconds.ToString)

   

Depois repetem-se algumas vezes, coloca-se o código de comparação a testar e comparam-se os resultados obtidos. Pode ser necessário ajustar o número de repetições no ciclo de maneira a diferenciar melhor os resultados.

   

Podem-se ainda melhorar a visualização, especialmente em tarefas mais demoradas, utilizando o TimeSpan. Depois de parar o Stopwatch, através do método Stop(), pode-se fazer o seguinte:

   

      ' Coloca o tempo total na variável do tipo TimeSpan.

      Dim ts As TimeSpan = stopWatch.Elapsed

   

      ' Mostra a informação dividida em Horas, Minutos, Segundo e Milisegundos.

      Dim totalTime As String = _

String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10)

      Debug.WriteLine(totalTime)

   

   

O exemplo mostrar como aplicar e executar testes de velocidade de código, com o objectivo de melhorar a performance da aplicação.

 

PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!

5 comentários:

Anónimo disse...

Boas Paulino!

Antes de mais, parabéns!

Bem, a minha dúvida é como colocar o dia de ontem ao fazer o load de um form num datetimepicker...

Exemplo:
dia (hoje) : 02-06-2010

Valor do timepicker : 01-06-2010

Desde já obrigado!

Aguardo resposta :)

Anónimo disse...

Olá!

Sou o mesmo que colocou a questão...

Já encontrei solução, resolvi assim:
DateTimePicker1.Value = DateTime.Today.AddDays(-1)

Espero que ajude outros...

Obrigado!

CUMPS

Daniel Duarte disse...

Boas

Nao sei se me pode ajudar, mas como é que eu incremente o DateTimePicker ? eu estou a utiliza-lo com o arduino, e gostaria que uma tarefa fosse realizada dos dias á mesma hora.

Obrigado

Cumprimentos

Daniel Duarte disse...

Boas

Nao sei se me pode ajudar, mas como é que eu incremento o DateTimePicker ? eu estou a utiliza-lo com o arduino, e gostaria que uma tarefa fosse realizada todos dias á mesma hora.

Obrigado

Cumprimentos

Jorge Paulino disse...

Poderia fazer algo como:

DateTimePicker1.Value = DateTimePicker1.Value.AddDays(1)

Mensagens Recentes



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico