quinta-feira, 11 de setembro de 2008

1

Simular a nova propriedade HintText do Delphi2009

Olá Pessoal,

Fiquei muito entusiasmado com os novos recursos e componentes da VCL, e um deles que é de muita utilidade é a nova propriedade HintText presente no TEdit, ela permite que você defina um texto padrão a ser exibido no Edit quando a propriedade text não tiver nenhum valor.

Bom, como eu sei que nem todos podem migrar imediatamente e desfrutar desse novo recurso, resolvi demonstrar como é possível simular o HintText utilizando qualquer versão do Delphi.

Veja o exemplo:

unit uFormPadrao;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, XPMan;

type
TFormPadrao = class(TForm)
procedure FormCreate(Sender: TObject);
private
procedure TextHintOnEnter(Sender: TObject);
procedure TextHintOnExit(Sender: TObject);
{ Private declarations }
public
{ Public declarations }
end;

var
FormPadrao: TFormPadrao;

implementation

{$R *.dfm}

Const
DefaultColor: TColor = clBlack;

procedure TFormPadrao.FormCreate(Sender: TObject);
var
i: Integer;
begin
for i := 0 to ComponentCount - 1 do
begin
if Components[i] is TEdit then
begin
TEdit(Components[i]).OnEnter := TextHintOnEnter;
TEdit(Components[i]).OnExit := TextHintOnExit;
TextHintOnExit(TEdit(Components[i]));
end;
end;
end;

procedure TFormPadrao.TextHintOnEnter(Sender: TObject) ;
begin
if Sender is TEdit then
begin
if TEdit(Sender).Text = TEdit(Sender).Hint then
TEdit(Sender).Text := EmptyStr;
TEdit(Sender).Font.Color := DefaultColor;
end;
end;

procedure TFormPadrao.TextHintOnExit(Sender: TObject) ;
begin
if Sender is TEdit then
begin
if TEdit(Sender).Text = EmptyStr then
begin
TEdit(Sender).Text := TEdit(Sender).Hint;
TEdit(Sender).Font.Color := clGray;
end;
end;
end;
end.

Para que todos os forms tenham a funcionalidade você pode criar um form Padrao e utilizar a herança para fazer o trabalho para você.

Veja o nosso exemplo funcionando:

Bom a única observação é que na hora de utilizar esse valor (seja para gravar no banco ou apenas exibir ao usuário) você deve verificar se o text é igual ao hint, se estiver igual significa que Text está vazio.

É isso ai! um grande abraço a todos.

quarta-feira, 10 de setembro de 2008

0

Delphi Tour 2009

     Pessoal, hoje tive o prazer de participar do Delphi Tour 2009. E posso afirmar que a nova versão está repleta de grandes novidades. Dentre elas, as que mais me chamaram a atenção foram:

  • Build Configuration
  • Generics
  • Métodos Anonimos
  • Novos DataSnap (Esse em especial está um show)  
   Além é claro de 100% de suporte a UNICODE e novos componentes da VCL (destaque para o Ribbon Controls). 

   Já está disponível para donwload a versão trial, então vale apenas baixar e conferir pessoalmentes todas essas novidades.

Vamos lá pessoal. Delphi 2009 na cabeça!

terça-feira, 2 de setembro de 2008

4

Algorítimo para validação de CNH

Olá comunidade,

Hoje resolvi disponibilizar um algoritmo para a validação de CNH, essa função já contempla os dois modelos de CNH. Aproveitem!


function ValidaCNH(cnh: string): Boolean;
function valida_new_cnh(cnh: String): Boolean;
var
Soma, Conta, Dv, Digito, i: Integer;
CnhN: String;
NumerosIguais: Boolean;
begin
Result := False;
NumerosIguais := True;

CnhN := FormatFloat('00000000000', StrToFloat(trim(cnh)));
Soma := 0;

{Validando se todos o números são iguais}
for i := 1 to length(CnhN) - 1 do
if CnhN[1] <> CnhN[i] then
NumerosIguais := False;

if NumerosIguais then
Exit;

for i := 1 to length(CnhN) - 2 do
Soma := Soma + (StrtoInt(CnhN[i]) * (i + 1));

Conta := (Soma div 11) * 11;
if (Soma - Conta) < 2 then
Dv := 0
else
Dv := 11 - (Soma - Conta);

Digito := StrToInt(CnhN[10]);

if Digito = Dv then
Result := True;
end;

function valida_old_cnh(cnh: String): Boolean;
var
Soma, Conta, Dv, Digito, i: Integer;
CnhN: String;
NumerosIguais: Boolean;
begin
Result := False;
NumerosIguais := True;;

CnhN := FormatFloat('000000000', StrToFloat(trim(cnh)));
Soma := 0;

{Validando se todos o números são iguais}
for i := 1 to length(CnhN) - 1 do
if CnhN[1] <> CnhN[i] then
NumerosIguais := False;

if NumerosIguais then
Exit;

for i := 1 to length(CnhN) - 1 do
Soma := Soma + (StrtoInt(CnhN[i]) * (i + 1));

Digito := StrToInt(CnhN[9]);
Conta := Soma mod 11;

if Conta = 10 then
Conta := 0;

if Digito = Conta then
result := True;
end;
begin
result := (valida_new_cnh(cnh) or valida_old_cnh(cnh));
end;



Bom eu testei com algumas CNH's e ela funcionou na boa, se tiverem problema me avisem.

Abraço a todos.