下面的代码是在TEdit的Change事件中进行判断的例子:procedure TForm1.Edit1Change(Sender: TObject); const sCheck = 'Hello'; //要判断的字符串 var AEdit: TEdit; iPos : Integer; begin AEdit := TEdit(Sender); iPos := Pos(sCheck, AEdit.Text); if iPos > 0 then begin ShowMessage ('You type "' + sCheck + '"'); AEdit.Text := AnsiReplaceStr(AEdit.Text, sCheck, ''); AEdit.SelStart := iPos - 1; end; end;
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;type TIDCheck=class( TObject) protected m_INTCheck:array of integer;//结果的检测用 m_TimeCheck:array of integer;//时间的检测用 m_INT:array of integer; //真实保存的结果 m_Time:array of integer; //真实保存的时间间隔 m_Begin:integer;//检测录入的字符第一个开始时间。 m_MaxTime:Smallint;//超出该时间证明不是ID的录入时间范围 m_Length:integer;//读取长度 m_LastResult:string;//上一次读取的结果 procedure DoClear;//当检测到符合清空条件的,则还原所有变量 function CheckID:Boolean; function GetIDResult:string; procedure DoAddKey(var key:word);//符合条件的进行处理。 public aForm:TForm; function KeyDownCheck(var key:word):string; property IDResult:string read GetIDResult; property LastResult:string read m_LastResult; constructor Create(MaxTime:integer=30;Length:integer=10); destructor Destroy; override; end;
TForm1 = class(TForm) Timer1: TTimer; Memo1: TMemo; Edit1: TEdit; procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormShow(Sender: TObject); private { Private declarations } m_End,m_first:integer; IDTest:TIDCheck; public { Public declarations } end; var Form1: TForm1;implementation{$R *.dfm} function TIDCheck.CheckID: Boolean; begin if m_INTCheck[m_Length-1]<0 then result:=false else result:=true; end;constructor TIDCheck.Create(MaxTime: integer;Length:integer); begin m_MaxTime:=MaxTime; m_Length:=Length; SetLength(m_INTCheck,m_Length); SetLength(m_TimeCheck,m_Length); SetLength(m_INT,m_Length); SetLength(m_Time,m_Length); DoClear; end;destructor TIDCheck.Destroy; begin Finalize(m_INTCheck); Finalize(m_TimeCheck); Finalize(m_INT); Finalize(m_Time); inherited; end;procedure TIDCheck.DoAddKey(var key: word); var i:Smallint; begin for i:=0 to m_Length-1 do if m_INTCheck[i]<0 then begin m_INTCheck[i]:=key; m_TimeCheck[i]:=GetTickCount-m_Begin; m_Begin:=GetTickCount; break; end; if i=m_Length then//没有空间记录,把所有数据前移并把新的放在最后一位。 begin for i:=1 to m_Length-1 do begin m_INTCheck[i-1]:=m_INTCheck[i]; m_TimeCheck[i-1]:=m_TimeCheck[i]; end; m_INTCheck[m_Length]:=key; m_TimeCheck[m_Length]:=GetTickCount-m_Begin; m_Begin:=GetTickCount; end; if (m_TimeCheck[i]>=m_MaxTime) and (i>0) then //超出ID卡读取范围则清空 DoClear; end;procedure TIDCheck.DoClear; var i:integer; begin for i:=0 to m_Length-1 do begin m_INTCheck[i]:=-1; m_INT[i]:=-1; m_TimeCheck[i]:=-1; m_Time[i]:=-1; end; m_Begin:=0; aForm.Caption:=aForm.Caption+'clear'; end;function TIDCheck.GetIDResult: string; var i:Shortint; begin if CheckID then begin for i:=0 to m_Length-1 do result:=result+char(m_INTCheck[i]); end; end;function TIDCheck.KeyDownCheck(var key:word):string; begin result:=''; case key of 48..57:DoAddKey(key); 13:begin if checkid then //检测到结果则把结果返回 begin result:=GetIDResult; m_LastResult:=result; DoClear;//清空重新处理。 end else DoClear;//清空重新处理。 end; else//非数字的要清空并重新处理 DoClear; end; end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var aStr:string; begin { if key=13 then begin m_end:=GetTickCount; memo1.Lines.Add('结束:'+inttostr(m_end-m_first)); m_first:=0; end else begin if m_first=0 then begin m_first:=GetTickCount; memo1.Lines.Add('开始'); end; end; if key=13 then begin m_first:=0; exit; end; if m_first=0 then begin m_first:=GetTickCount; end else begin memo1.Lines.Add('Key:'+char(key)+'keyCode'+inttostr(key)+'时间:'+inttostr(GetTickCount-m_first)); m_first:=GetTickCount; end; } aStr:=IDTest.KeyDownCheck(key); if length(aStr)>0 then begin memo1.Lines.Add(aStr); key:=0; end; { if self.ActiveControl is TEdit then TEdit(self.ActiveControl).Text:=; } end;procedure TForm1.FormShow(Sender: TObject); begin memo1.Clear; m_End:=0; m_first:=0; IDTest:=TIDCheck.Create; IDTest.aForm:=self; end;end.还是感谢上面的两位,pazee 的想法和我的想法一样,不过,是根据时间来进行处理而已。和我当初的想法一样。谢谢。
m_INT:array of integer; //真实保存的结果 m_Time:array of integer; //真实保存的时间间隔 上面两个变量好像没用的。这个是一个ID卡读取的方法,能判断出读取出一串连续快速出现的字符串。现在为止适合ID卡的读取,其他的还没测试,一些参数说明后面有注释的,需要的可以参考一下!
const
sCheck = 'Hello'; //要判断的字符串
var
AEdit: TEdit;
iPos : Integer;
begin
AEdit := TEdit(Sender);
iPos := Pos(sCheck, AEdit.Text);
if iPos > 0 then
begin
ShowMessage ('You type "' + sCheck + '"');
AEdit.Text := AnsiReplaceStr(AEdit.Text, sCheck, '');
AEdit.SelStart := iPos - 1;
end;
end;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;type
TIDCheck=class( TObject)
protected
m_INTCheck:array of integer;//结果的检测用
m_TimeCheck:array of integer;//时间的检测用
m_INT:array of integer; //真实保存的结果
m_Time:array of integer; //真实保存的时间间隔
m_Begin:integer;//检测录入的字符第一个开始时间。
m_MaxTime:Smallint;//超出该时间证明不是ID的录入时间范围
m_Length:integer;//读取长度
m_LastResult:string;//上一次读取的结果
procedure DoClear;//当检测到符合清空条件的,则还原所有变量
function CheckID:Boolean;
function GetIDResult:string;
procedure DoAddKey(var key:word);//符合条件的进行处理。
public
aForm:TForm;
function KeyDownCheck(var key:word):string;
property IDResult:string read GetIDResult;
property LastResult:string read m_LastResult;
constructor Create(MaxTime:integer=30;Length:integer=10);
destructor Destroy; override;
end;
TForm1 = class(TForm)
Timer1: TTimer;
Memo1: TMemo;
Edit1: TEdit;
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
m_End,m_first:integer;
IDTest:TIDCheck;
public
{ Public declarations }
end;
var
Form1: TForm1;implementation{$R *.dfm}
function TIDCheck.CheckID: Boolean;
begin
if m_INTCheck[m_Length-1]<0 then
result:=false
else
result:=true;
end;constructor TIDCheck.Create(MaxTime: integer;Length:integer);
begin
m_MaxTime:=MaxTime;
m_Length:=Length;
SetLength(m_INTCheck,m_Length);
SetLength(m_TimeCheck,m_Length);
SetLength(m_INT,m_Length);
SetLength(m_Time,m_Length);
DoClear;
end;destructor TIDCheck.Destroy;
begin
Finalize(m_INTCheck);
Finalize(m_TimeCheck);
Finalize(m_INT);
Finalize(m_Time);
inherited;
end;procedure TIDCheck.DoAddKey(var key: word);
var
i:Smallint;
begin
for i:=0 to m_Length-1 do
if m_INTCheck[i]<0 then
begin
m_INTCheck[i]:=key;
m_TimeCheck[i]:=GetTickCount-m_Begin;
m_Begin:=GetTickCount;
break;
end;
if i=m_Length then//没有空间记录,把所有数据前移并把新的放在最后一位。
begin
for i:=1 to m_Length-1 do
begin
m_INTCheck[i-1]:=m_INTCheck[i];
m_TimeCheck[i-1]:=m_TimeCheck[i];
end;
m_INTCheck[m_Length]:=key;
m_TimeCheck[m_Length]:=GetTickCount-m_Begin;
m_Begin:=GetTickCount;
end;
if (m_TimeCheck[i]>=m_MaxTime) and (i>0) then //超出ID卡读取范围则清空
DoClear;
end;procedure TIDCheck.DoClear;
var
i:integer;
begin
for i:=0 to m_Length-1 do
begin
m_INTCheck[i]:=-1;
m_INT[i]:=-1;
m_TimeCheck[i]:=-1;
m_Time[i]:=-1;
end;
m_Begin:=0;
aForm.Caption:=aForm.Caption+'clear';
end;function TIDCheck.GetIDResult: string;
var
i:Shortint;
begin
if CheckID then
begin
for i:=0 to m_Length-1 do
result:=result+char(m_INTCheck[i]);
end;
end;function TIDCheck.KeyDownCheck(var key:word):string;
begin
result:='';
case key of
48..57:DoAddKey(key);
13:begin
if checkid then //检测到结果则把结果返回
begin
result:=GetIDResult;
m_LastResult:=result;
DoClear;//清空重新处理。
end
else
DoClear;//清空重新处理。
end;
else//非数字的要清空并重新处理
DoClear;
end;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
aStr:string;
begin
{
if key=13 then
begin
m_end:=GetTickCount;
memo1.Lines.Add('结束:'+inttostr(m_end-m_first));
m_first:=0;
end
else
begin
if m_first=0 then
begin
m_first:=GetTickCount;
memo1.Lines.Add('开始');
end;
end; if key=13 then
begin
m_first:=0;
exit;
end; if m_first=0 then
begin
m_first:=GetTickCount;
end
else
begin
memo1.Lines.Add('Key:'+char(key)+'keyCode'+inttostr(key)+'时间:'+inttostr(GetTickCount-m_first));
m_first:=GetTickCount;
end;
}
aStr:=IDTest.KeyDownCheck(key);
if length(aStr)>0 then
begin
memo1.Lines.Add(aStr);
key:=0;
end;
{
if self.ActiveControl is TEdit then
TEdit(self.ActiveControl).Text:=;
}
end;procedure TForm1.FormShow(Sender: TObject);
begin
memo1.Clear;
m_End:=0;
m_first:=0;
IDTest:=TIDCheck.Create;
IDTest.aForm:=self;
end;end.还是感谢上面的两位,pazee 的想法和我的想法一样,不过,是根据时间来进行处理而已。和我当初的想法一样。谢谢。
m_Time:array of integer; //真实保存的时间间隔
上面两个变量好像没用的。这个是一个ID卡读取的方法,能判断出读取出一串连续快速出现的字符串。现在为止适合ID卡的读取,其他的还没测试,一些参数说明后面有注释的,需要的可以参考一下!