Dicas Delphi – Funções da VCL para Data e Hora com Delphi

Salve, salve amigos,

Em algum momento do dia-a-dia desenvolvendo aplicações, surge a necessidade de manipularmos datas e horários. Diante deste cenário, surgem determinadas dúvidas que requerem conhecimentos matemáticos. Para não nos deixar de cabelo em pé com estes cálculos, a VCL tem um vasto conjunto de classes e métodos que ajuda nestes cálculos. Neste artigo, vamos verificar que funções são essas e exemplificar através de situações reais a aplicabilidade das mesmas.
DateUtils a unit mágica
As classes e métodos que irão nos ajudar neste artigo fazem parte da unit DateUtils e foram testadas no Delphi 2000 e 2010. A maior parte está disponível na versão 7 do Delphi também.
É importante saber que poderemos representar datas e horários através do tipo TDateTime, que mapeia um tipo double, onde a parte inteira corresponde a Data e a parte decimal corresponde a Hora. O tipo TDate ou TTime podem ser utilizados e estes mapeiam o TDateTime.
Se uma variável do tipo TDateTime recebe 0, a data equivalente será 30/12/1899 e a hora 00:00:00. Caso a data seja 29/12/1899 e o horário 06:00, o valor no formato double será -1.25, mas não será necessário trabalhar com números, pois a unit DateUtils irá ajudar muito.

Métodos para criação de datas
Ao criar ou ler variáveis do tipo TDateTime, muitos desenvolvedores se preocupam com o formato: DD/MM/AAAA, AAAA/DD/MM, MM/DD/AAAA.. Outras preocupações, em muitos casos, surgem devido ao formato de data da máquina. Mas esta preocupação não é necessária, pois basta saber utilizar os métodos EncodeDate, EncodeTime, DecodeDate.e DecodeTime.
O método EncodeDate nos ajuda a criar variáveis, passando como parâmetro: dia, mês e ano para o EncodeTime, também serão passados: hora, minuto, segundo e milesegundo.

var
Data : TDateTime;
begin
Data := EncodeDate(
2010, 10, 28 );
ShowMessage( DateToStr(Data) );

// Lendo uma variável Data
var
Dia, Mes, Ano : Word;
begin

DecodeDate(Date, Ano, Mes, Dia);

ShowMessage( ‘Dia : ‘ + InttoStr(Dia) + #13 +
‘Mês : ‘ + InttoStr(Mes) + #13 +
‘Ano : ‘ + InttoStr(Ano) );

Neste exemplo será apresentando Dia : 4 // Mês : 4 // Ano : 2006, independente da configuração de data e hora da máquina.

Calculando Dias
Calcular quantos dias existem entre duas datas, quantos dias na semana, quantos dias no mês, considerar o ano bissexto e outras informações são fundamentais quando você tem que fazer cálculo de juros, dias úteis e outros cálculos. Vejamos alguns métodos que podem nos ajudar.

// Quantos dias existem em cada mês do ano
Const
S : String = ‘%s: %d dias’;
var
Y, M: Integer;
Meses: String;
begin

Y := 2006; //Ano que estará sendo considerado neste exemplo
for M := 1 to 12 do
begin
Meses := Meses + Format(S, [ShortMonthNames[M],MonthDays[IsLeapYear(Y), M]]) +#13;
end;

ShowMessage(Meses);

O exemplo acima irá resultar em quantos dias existem em cada mês do ano de 2006. O resultado será: 

jan: 31 dias // fev: 28 dias // mar: 31 dias // abr: 30 dias // mai: 31 dias // jun: 30 dias // jul: 31 dias // ago: 31 dias // set: 30 dias // out: 31 dias // nov: 30 dias // dez: 31 dias //
Perceba que utilizamos o array ShortMonthNames, que retorna o nome de cada mês, abreviado de acordo com o idioma do Windows. Você poderá sobrescrever os nomes dos meses para cada um deles, caso queira que sua aplicação utilize a sua 
maneira. Outro array utilizado é o MonthDays, que é bidimensional e irá retornar o número de dias para cada mês considerando o ano bisexto através do método IsLeapYear, que retorna True ou False (1 ou 0).

{Incrementando Dia, Mês, Ano, Semana, Hora, Minuto, Segundo, …..}
var
Y, M: Integer;
Hoje : TDateTime;
AnoQueVem : TDateTime;
begin

Hoje := Date; // considere que hoje é 25/04/2006

AnoQueVem := IncYear(Hoje, 1);

ShowMessage(DateToStr(AnoQueVem));
// resultado será 25/04/2007

O Exemplo acima irá incrementar a data de hoje em 1 ano: diversas são as funções para o incremento de data e hora, são elas:

Nome da Função
Unit
IncMonth
SysUtils
IncAMonth
SysUtils
IncYear
DateUtils
IncWeek
DateUtils
IncDay
DateUtils
IncHour
DateUtils
IncMinute
DateUtils
IncSecond
DateUtils
IncMilliSecond
DateUtils
As funções acima certamente irão lhe ajudar nas operações com data e hora.

Outro grupo de funções muito útil é o relacionado a intervalos de data e hora. Todas as funções abaixo citadas estão na unit DateUtils e recebem um parâmetro do tipo TDateTime.
Nome da Função
Unit
YearsBetween
Retorna o número de anos entre um intervalo
MonthsBetween
Retorna o número de meses entre um intervalo
WeeksBetween
Retorna o número de semanas entre um intervalo
DaysBetween
Retorna o número de dias entre um intervalo
HoursBetween
Retorna a quantidade de horas entre um intervalo
MinutesBetween
Retorna a quantidade de minutos entre um intervalo
SecondsBetween
Retorna a quantidade de segundos entre um intervalo
MilliSecondsBetween
Retorna q quantidade de milesegundos entre um intervalo

 
 Take care

Anúncios

Dicas Delphi – Mudando a cor de fundo de linhas diferentes em um Listbox

Salve, salve amigos,

Crie uma nova aplicação, insira um Listbox e altere a propriedade Style para lbOwnerDrawFixed, depois clique na propriedade Items (…) e digite alguns valores em linhas diferentes. Copie o código abaixo no evento OnDrawItem do Listbox.

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
myColor: TColor;
myBrush: TBrush;
begin
myBrush := TBrush.Create;
with (Control as TListBox).Canvas do
begin
if not Odd(Index) then
myColor := clSilver
else
myColor := clWhite;
myBrush.Style := bsSolid;
myBrush.Color := myColor;
Windows.FillRect(handle, Rect, myBrush.Handle);
Brush.Style := bsClear;
TextOut(Rect.Left, Rect.Top,(Control as TListBox).Items[Index]);
MyBrush.Free;
end;
end;

Não se esqueça de incluir valores no Listbox para que possa ser visto o efeito das cores. Execute a aplicação e veja a o funcionamento.
Take care!

Dicas Delphi – Limpando Componentes Automaticamente

Salve, salve amigos,

Uma função que faz a limpeza automática dos componentes da tela, como Edit’s, Memo’s, etc.
Procedure para limpar somente os Edits:

Por wandinhodelphiweb – http://www.activedelphi.com.br

procedure LimpaEdit; 
var
i : Integer;
begin
for
i := 0 to ComponentCount -1 do
if
Components[i] is TEdit then
TEdit(Components[i]).Text := '';
end;

E agora uma mais genérica, que utiliza a classe TCustomEdit, limpando automaticamente os Memo’s e todos os outros componentes que herdam desta classe:

procedure LimpaEdit (Form: TForm); 
var
i : Integer;
begin
for
i := 0 to Form.ComponentCount - 1 do
if Form.Components[i] is TCustomEdit then
(Form.Components[i] as TCustomEdit).Clear;
end;
 
 
Take care 


					

Dicas Delphi – Criando um Gerador de Senhas

Salve, salve amigos,

Veja nesta dica um código simples mas bastante útil, que gera senhas aleatórias podendo conter somente numeros, somente letras ou letras e números.
Primeiramente, vamos ao tutorial: insira em um form um Edit, abaixo dele um RadioGroup e depois outro Edit. Nesse RadioGroup, procure pela propriedade
Items no Object Inspector e adicione o seguinte: 
Somente números Somente letras Letras e números
Após isso, adicione dois Buttons. No primeiro mude a propriedade Caption para “Gerar” e o segundo “Limpar”. No OnClick do botao “Gerar” coloque o seguinte código:

Por http://www.activedelphi.com.br

procedure TForm1.Button1Click(Sender: TObject);
const
letras = 'abcdefghijklmnopqrstuvxwyzABCDEFGHIJKLMNOPQRSTUVXWYZ';
numeros = '1234567890';
letrasnumeros = letras + numeros;
var
i: integer;
begin
try

Edit2.Clear;
for i := 1 to StrToInt(Edit1.Text) do
begin

if RadioGroup1.ItemIndex = 0 then
Edit2.Text := Edit2.Text + numeros[random(length(numeros)) + 1]
else if RadioGroup1.ItemIndex = 1 then
Edit2.Text := Edit2.Text + letras[random(length(letras)) + 1]
else if RadioGroup1.ItemIndex = 2 then
Edit2.Text := Edit2.Text + letrasnumeros[random(length(letrasnumeros)) + 1];
end;
except
showmessage('Insira somente números no primeiro Edit');
end;
end;
Explicando
Criamos uma variavel i, do tipo inteira, que irá receber a quantidade de caracteres que o usuário quiser para a sua senha. Por isso convertemos o valor do Edit1.Text de String para Inteiro (StrToInt) dentro do for. Criamos também três constantes, adicionando a cada uma respectivamente as letras, numeros ou as duas juntas.
O comando “Try” funciona da seguinte maneira: falamos para o Delphi tentar executar esse código e, caso ele não conseguir, podemos utilizar o Except para apresentar, por exemplo, algumas mensagens de erro do que pôde acontecer. 
No exemplo, deve ser informado no Edit1 a quantidade de caracteres da senha e, caso a pessoa coloque letras ao invés de números, a função StrToInt não conseguirá ser executada. Com o Except, conseguimos informar ao usuário este problema e tiramos a mensagen de erro que o delphi emitiria, em inglês.
No segundo botão, coloque apenas:
procedure TForm1.Button2Click(Sender: TObject);
begin
Edit2.Clear;
end;
Nesse momento, compile e rode sua aplicacão, informe um número no primeiro edit, selecione um método de geração e veja a senha gerada no segundo edit. É o nosso código em funcionamento!
Take care