Arquivo do mês: setembro 2008

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.

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 pessoalmente todas essas novidades.
Vamos lá pessoal. Delphi 2009 na cabeça!

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&#91;10&#93;);

   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&#91;1&#93; <> 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.