检测ID卡的输入或者是其它卡的输入。
由于ID卡或者是其它的一些不同類型的卡,它們只是負責模擬鍵盤的錄入,但是,它們在錄入的時候沒有一個很好的標識位可以讓我們知道當前輸入的是客戶手工錄入的字符串還是ID卡讀入的字符串,我相信,很多人在做這樣的開發時應該都遇到過這種郁悶的事,有些人的做法呢,就是在特定的位置錄入字符串就算是ID卡的讀取了,我想,這樣的方法很多人都不喜歡的了,感覺很不科學。因此,這模塊就是應這種要求而設計的,可以讓你在任何情況下,應該說,限制很少的情況下,滿足了題目的要求。廢話不多說,先看看模塊代碼:
unit?zgw_IDCheckU;interface
uses
??Windows,Dialogs;
type
??TIDCheckOKEvent?=?procedure?(IDCheckResult:string)?of?object;
??TIDCheck=class(TObject)
??protected
????m_INTCheck:array?of?integer;//結果的檢測用
????m_TimeCheck:array?of?integer;//時間的檢測用
????m_Begin:integer;//檢測錄入的字符第一個開始時間。
????m_MaxTime:Smallint;//超出該時間證明不是ID的錄入時間范圍
????m_Length:integer;//讀取長度
????m_LastResult:string;//上一次讀取的結果
????FOnIDCheck:?TIDCheckOKEvent;
????FOnIDCheck_SP:?TIDCheckOKEvent;
????procedure?DoClear;//當檢測到符合清空條件的,則還原所有變量
????function?CheckID:Boolean;
????function?GetIDResult:string;
????procedure?DoAddKey(var?key:integer);//符合條件的進行處理。
????procedure?SetOnIDCheckResult_SP(value:TIDCheckOKEvent);
??public
????function?KeyDownCheck(var?key:integer):string;
????property?IDLength:integer?read?m_Length;
????property?IDResult:string?read?GetIDResult;
????property?LastResult:string?read?m_LastResult;
????constructor?Create(MaxTime:integer=50;Length:integer=10);
????destructor?Destroy;?override;
????procedure?APPIntercept(var?Msg:TMsg;var?Handled:Boolean);//截取程序的消息,改為自己的截取過程
????property?OnIDCheckResult:?TIDCheckOKEvent?read?FOnIDCheck?write?FOnIDCheck;?????????//默認的事件
????property?OnIDCheckResult_SP:?TIDCheckOKEvent?read?FOnIDCheck_SP?write?SetOnIDCheckResult_SP;//特殊事件,當特殊事件存在時不會去執行默認事件的。
??end;
??
var
??IDCheckObj:TIDCheck;
implementation
uses
??Forms,StdCtrls,Messages;
procedure?TIDCheck.APPIntercept(var?Msg:?TMsg;?var?Handled:?Boolean);
var
??aStr:string;
begin
??if?Msg.message=WM_KEYDOWN?then
??begin
????aStr:=KeyDownCheck(Msg.wParam);
????if?length(aStr)>0?then
????begin
??????Msg.wParam:=0;
????end
????else??//沒有完整返回ID的檢測,下面是一些比較特殊的處理。
????begin
??????if?((m_TimeCheck[1]>0)?and?(m_TimeCheck[1]<=m_MaxTime)?and?not?(Screen.ActiveForm.ActiveControl?is?TCustomEdit))?then
????????Msg.wParam:=0;
????end;
????//下面是屏蔽數字的快捷鍵的,因此數字快捷鍵必須使用數字鍵盤
????if?((Msg.wParam>=48)?and?(Msg.wParam<=57))?then
????if?not?(Screen.ActiveForm.ActiveControl?is?TCustomEdit)?then
??????Msg.wParam:=0;
??end;
end;
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);
??DoClear;
end;
destructor?TIDCheck.Destroy;
begin
??Finalize(m_INTCheck);
??Finalize(m_TimeCheck);
??inherited;
end;
procedure?TIDCheck.DoAddKey(var?key:?integer);
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_TimeCheck[i]:=-1;
??end;
??m_Begin:=0;
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:integer):string;
var
??aStr:string;
??i:integer;
begin
??result:='';
??case?key?of
??48..57:DoAddKey(key);
??????13:begin
???????????if?checkid?then?//檢測到結果則把結果返回
???????????begin
?????????????result:=GetIDResult;
?????????????m_LastResult:=result;
??????????????if?Screen.ActiveForm.ActiveControl?is?TCustomEdit?then
??????????????begin
????????????????aStr:=TCustomEdit(Screen.ActiveForm.ActiveControl).Text;
????????????????Delete(aStr,length(aStr)-IDLength+1,IDLength);
????????????????i:=TCustomEdit(Screen.ActiveForm.ActiveControl).SelStart;
????????????????TCustomEdit(Screen.ActiveForm.ActiveControl).Text:=aStr;
????????????????TCustomEdit(Screen.ActiveForm.ActiveControl).SelStart:=i;
??????????????end;
?????????????if?assigned(OnIDCheckResult_SP)?then
???????????????OnIDCheckResult_SP(result)
?????????????else
?????????????begin
???????????????if?assigned(FOnIDCheck)?then
?????????????????FOnIDCheck(result);
?????????????end;
?????????????DoClear;//清空重新處理。
???????????end
???????????else
?????????????DoClear;//清空重新處理。
?????????end;
??else//非數字的要清空并重新處理
????DoClear;
??end;
end;
procedure?TIDCheck.SetOnIDCheckResult_SP(value:?TIDCheckOKEvent);
begin
??FOnIDCheck_SP:=value;
??DoClear;
end;
initialization
??IDCheckObj:=TIDCheck.Create;
finalization
??IDCheckObj.Free;
end.
?下面是它的使用方法:(對象不用創建的,引用了該模塊就可以使用,應該它在模塊引用的時候就已經創建出來的了。)
??? Application.OnMessage:=IDCheckObj.APPIntercept;(首先這里設置截獲應用程序的消息。)
??? IDCheckObj.OnIDCheckResult:=OnIDCheckReturn;(設置檢測到ID卡讀取后要執行的事件。)
調用的方法就是這么簡單了。
下面的是特殊情況下調用的方法:
IDCheckObj.OnIDCheckResult_SP:=OnIDCheckReturn;(OnIDCheckResult是默認的執行事件,如果你在某個窗體里面要求檢測到ID卡讀取后執行比較特殊的事件,而不執行默認事件的話,就要設置這個事件了,記得窗體不再激活的時候要把它設置為NULL哦,否者,其它地方會執行OnIDCheckResult_SP這個事件的)
介紹一個這個事件過程是如何定義的:procedure OnIDCheckReturn(IDCheckResult:string);
下面是我的默認事件所執行的過程,可以參考一下:
procedure TMainForm.OnIDCheckReturn(IDCheckResult: string);
var
? frm_IDCardCon:Tfrm_IDCardControl;
begin
? frm_IDCardCon:=Tfrm_IDCardControl.Create(IDCheckResult);
? if frm_IDCardCon.VIP_NO<>'' then
??? frm_IDCardCon.ShowModal
? else
??? frm_IDCardCon.Free;
end;
IDCheckResult:就是檢測到的那串字符串。我這里是檢測到就彈出窗體。不知道我這東西是否適合大家使用呢?不管適用與否,我都已經用在客戶那里啦,反應挺好的。
原創作品出自努力偷懶,轉載請說明文章出處:http://blog.csdn.net/kfarvid或?http://www.cnblogs.com/kfarvid/
轉載于:https://www.cnblogs.com/kfarvid/archive/2008/02/24/2251447.html
總結
以上是生活随笔為你收集整理的检测ID卡的输入或者是其它卡的输入。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: as3 浅复制 深复制
- 下一篇: web压力测试工具介绍