Olá pessoal, recebi um e-mail de um amigo, perguntando o seguinte:

“Wesley como eu posso fazer para criar uma tela de navegação com o TDateTimePicker, onde ao clicar no botão que represente ">" ele avance 1 mês, e quando clicar no "<" ele retroceda 1 mês.”

Pensando nisto, eu fiz um layout básico e montei uma estrutura com o seguinte.

Listagem 1: Lista de Componentes


    Label1: TLabel;
    Label2: TLabel;
    EdtDataFinal: TDateTimePicker;
    BtnMesProximo: TBitBtn;
    BtnMesAnterior: TBitBtn;
    EdtDataInicial: TDateTimePicker;

Veja como ficou meu layout

Figura 1. Layout

Figura 1. Layout

A minha ideia foi a seguinte, sempre pegar o último dia do mês(Data Final) e não alterar o dia inicial( Data Inicial ), mas isso você pode modificar sem problemas.

Iniciaremos Declarar uses na unit DateUtils.

Listagem 2: Declarando uses em DataUtils


unit uFrmPrincipal;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ComCtrls, DateUtils;

Bom temos 2 TBitBtn, o primeiro se chama BtnMesProximo e o segundo BtnMesAnterior, vamos implementar o clique do BtnMesProximo.

Listagem 3: Implementando o onClick do BtnMesProximo


procedure TFrmPrincipal.BtnMesProximoClick(Sender: TObject);
Var
  xDia, xMes, xAno : Word;
  xDataFinal : TDateTime;
begin
  EdtDataInicial.DateTime := IncMonth(EdtDataInicial.DateTime,1);
  xDataFinal              := IncMonth(EdtDataFinal.DateTime,1);
  DecodeDate(xDataFinal, xAno, xMes, xDia);
  xDia                    := DaysInMonth(xDataFinal);
  EdtDataFinal.DateTime   := EncodeDate(xAno,XMes, xDia);
end;

Neste momento vamos implementar o click do BtnMesProximo

Listagem 4: Implementando o onClick do BtnMesProximo


procedure TFrmPrincipal.BtnMesAnteriorClick(Sender: TObject);
Var
  xDia, xMes, xAno : Word;
  xDataFinal : TDateTime;
begin
  EdtDataInicial.DateTime := IncMonth(EdtDataInicial.DateTime,-1);
  xDataFinal              := IncMonth(EdtDataFinal.DateTime,-1);
  DecodeDate(xDataFinal, xAno, xMes, xDia);
  xDia                    := DaysInMonth(xDataFinal);
  EdtDataFinal.DateTime   := EncodeDate(xAno,XMes, xDia);
end;

Clicando no BtnMesProximo você irá ver o seguinte:

Clicando no BtnMesProximo

Figura 2. Clicando no BtnMesProximo

Clicando no BtnMesAnterior você irá ver o seguinte:

Clicando no BtnMesAnterior

Figura 3. Clicando no BtnMesAnterior

Neste artigo foi mostrado como podemos utilizar as funções IncMonth e DaysInMonth, conforme foi falado, neste código iremos sempre apontar para o último dia do mês no EdtDataFinal, mas isso pode ser modificado.

Você pode usar este “recursos” para relatórios, ou qualquer outro tipo de filtro dentro do seu sistema onde você tenha um recurso de filtragem por data.

Um abraço e até o próximo artigo.