quinta-feira, 17 de março de 2011

Captcha em Delphi


Esta é uma dica interessante principalmente para quem trabalha com webbroker. Se você não sabe do que estamos falando, leia este artigo sobre captcha, no wikipedia.

Para fazer este exemplo, crie uma nova aplicação e adicione ao formulário um componente TImage, um TEdit e um TButton. Configure a propriedade CharCase do TEdit para ecUpperCase.

No código fonte, vamos declarar a função que fará a geração do código e da imagem. Vá à seção public e faça:

  public
    { Public declarations }
    function GeraImagem(Img: TImage): string;

Em seguida, pressionando CTRL + SHIFT + C, fazemos a implementação da função:

function TForm1.GeraImagem(Img: TImage): string;
const
  f: array [0..4] of string = ('Courier New', 'Impact', 'Times New Roman',
                               'Verdana', 'Arial');
  s = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  c: array [0..14] of TColor = (clAqua, clBlack, clBlue, clFuchsia, clGray,
                                clGreen, clLime, clMaroon, clNavy, clOlive,
                                clPurple, clRed, clSilver, clTeal, clYellow);
var
  i, x, y: integer;
  r: string;

begin
  randomize;
  Img.Width := 160;
  Img.Height := 60;
  for i := 0 to 3 do
    r := r + s[Random(length(s)-1)+1];

  with Img.Picture.Bitmap do
  begin
    width := Img.Width;
    Height := Img.Height;
    Canvas.Brush.Color := $00EFEFEF;
    Canvas.FillRect(Img.ClientRect);

    for i := 0 to 3 do
    begin
      Canvas.Font.Size := random(20) + 20;
      Canvas.Font.Name := f[High(f)];
      Canvas.Font.Color := c[random(High(c))];
      Canvas.TextOut(i*40,0, r[i+1]);
    end;

    for i := 0 to 2 do
    begin
      Canvas.Pen.Color := c[random(High(c))];
      Canvas.Pen.Width := 2;
      canvas.MoveTo(random(Width), 0);
      Canvas.LineTo(random(Width), Height);
      Canvas.Pen.Width := 1;
      x := random(Width-10);
      y := random(Height-10);
      Canvas.Rectangle(x, y, x+10, y+10);
    end;
  end;

  Result := r;
end;

Para testar, primeiro devemos adicionar uma variável global, conforme abaixo:

var
  Form1: TForm1;
  validapost: string;

Agora, no evento onClick do botão, fazemos a validação:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if (Edit1.Text = validapost) then
    Application.MessageBox('Parabéns, muito bem!', 'Sucesso',
    MB_OK + MB_ICONINFORMATION)
  else
    Application.MessageBox('Ops! Você errou.', 'Falhou',
    MB_OK + MB_ICONWARNING);
  FormShow(self);
end;

E por último, o evento onShow do form, que chamará a função para gerar uma nova imagem:

procedure TForm1.FormShow(Sender: TObject);
begin
  Edit1.Clear;
  Edit1.SetFocus;
  validapost := GeraImagem(Image1);
end;

Agora é só rodar e brincar com seu captcha! Espero que tenham gostado!

Clique aqui para baixar o código fonte de exemplo. (206 KB)

Nenhum comentário:

Postar um comentário