![]() |
|
|
|
|
#1
|
||||
|
||||
|
Вот везде пишут, как прочитать или получить капчу, а у меня возникла необходимость ее создать=)
Предположим так: Возьмем Memo и при oncreate формы, впендюрим туда некий текст(случайный). А вот edit, если в него вписать текст из Memo и нажать на button, вызываем функцию... ну мол сообщение, что все ок, а если текст не такой как в мемо то, пишем мол ошибочка=) |
|
#2
|
||||
|
||||
|
но это я так, простенько обьяснил,
что не понятно мне конкретно это, как создать в место мемо капчу в timage и проверять разумеется |
|
#3
|
||||
|
||||
|
Вариант 1.
Написать функцию, которая будет рисовать на канве буквочки и циферки, в эту функцию будет передаваться твоя рандомная строчка, по завершении работы функция вернет тебе, например, хеш текста твоей капчи. При вводе в едит ты сравнишь хеши текста в эдите и самой капчи. |
|
#4
|
||||
|
||||
|
Код не мой. Взял с какого-то сайта, уже не помню где
![]() Код:
type
TForm1 = class(TForm)
Image1: TImage;
Button1: TButton;
EditCaptcha: TEdit;
procedure Button1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure Captcha_(Code: Integer);
procedure SetCaptcha_;
function TestCaptcha(C: String): Boolean;
end;
var
Form1: TForm1;
CurCod: Integer;
implementation
{$R *.dfm}
procedure TForm1.Captcha_(Code: Integer);
const
lines = 6;
var
x,y,g : integer;
str : string;
begin
Image1.Canvas.Brush.Color := clWhite;
Image1.Canvas.Brush.Style := bsSolid;
Image1.Canvas.FillRect(Image1.Canvas.ClipRect);
if (Code < 99999) or (Code > 1000000) then
Image1.Canvas.TextOut(4,4,'INVALID CODE');
for x := 0 to Image1.Width - 1 do
for y := 0 to Image1.Height - 1 do
if Random(1000) mod 2 = 0 then begin
g := Random(100)+100;
Image1.Canvas.Pixels[x,y] := rgb(g,g,g);
end;
Image1.Canvas.Brush.Style := bsClear;
for x := 1 to 6 do begin
g := Random(100)+100;
case Random(3) of
0 : Image1.Canvas.Font.Color := rgb(g,0,0);
1 : Image1.Canvas.Font.Color := rgb(0,g,0);
2 : Image1.Canvas.Font.Color := rgb(0,0,g);
end;
case random(2) of
0 : Image1.Canvas.Font.Style := [fsBold];
1 : Image1.Canvas.Font.Style := [];
end;
Image1.Canvas.Font.Size := 15 + Random(6);
Image1.Canvas.TextOut((x-1)*15+10, random(image1.Height-Image1.Canvas.TextHeight('1')), IntToStr(Code)[x]);
end;
Image1.Canvas.Pen.Color := clBlack;
for x := 0 to lines - 1 do begin
Image1.Canvas.MoveTo(0, Random(Image1.Height));
Image1.Canvas.LineTo(Image1.Width, Random(Image1.Height));
end;
end;
procedure TForm1.SetCaptcha_;
begin
Randomize;
CurCod := Random(899999) + 100000;
Captcha_(CurCod);
end;
function TForm1.TestCaptcha(C: String): Boolean;
begin
Result := IntToStr(CurCod) = C;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if(not(TestCaptcha(EditCaptcha.Text))) then begin
ShowMessage('Капча не верна');
EditCaptcha.Clear;
SetCaptcha_;
Exit;
end;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
SetCaptcha_;
end; |
|
#5
|
||||
|
||||
|
вариантов много:
![]() Код:
function CreateCaptcha(s: String): TBitmap;
var
i: Integer;
x: Integer;
y: Integer;
a: Integer;
procedure CanvasSetAngle(C: TCanvas; A: Single);
var
LogRec: TLogFont;
begin
GetObject(C.Font.Handle, SizeOf(LogRec), @LogRec);
DeleteObject(C.Font.Handle);
LogRec.lfEscapement:=Trunc(A*10);
C.Font.Handle:=CreateFontIndirect(LogRec);
end;
begin
Result:=TBitmap.Create;
Result.Canvas.Font.Name:='Comic Sans MS';
Result.Canvas.Font.Size:=16;
Result.Width:=2*Result.Canvas.TextWidth('W')*(Length(s)+2);
Result.Height:=50;
Result.Canvas.Brush.Color:=clWhite;
Result.Canvas.FillRect(Rect(0, 0, Result.Width, Result.Height));
Result.Canvas.Brush.Style:=bsClear;
for i:=1 to 5*Result.Width do
begin
Result.Canvas.Pen.Color:=Random($ffffff);
x:=Random(Result.Width);
y:=Random(Result.Height);
Result.Canvas.MoveTo(x, y);
Result.Canvas.LineTo(x+Random(2), y+Random(2));
end;
x:=Result.Canvas.TextWidth('W');
for i:=1 to Length(s) do
begin
a:=Random(90)-45;
CanvasSetAngle(Result.Canvas, a);
Result.Canvas.Font.Color:=Random($ffffff);
Result.Canvas.TextOut(x, Result.Height div 2, s[i]);
Inc(x, 2*Result.Canvas.TextWidth('W'));
end;
Result.Canvas.Pen.Color:=clBlack;
end;http://data.cod.ru/90139 |