ID卡读取方法(用于区分ID卡读取出来的数据和一般人手录入的数据)

ID卡的读取方式其实是模拟一个键盘的录入而已,很简单,现在这个ID卡读取方法是为了在任何情况下把它正确读取出来的方法,例如你在tedit控件里面,当读取了ID卡时,会和其它数据混在一起,而我这种方法,能正确地读取出ID卡的正确数据,如果你同时快速按键盘又同时读取ID卡时,它是不会读出数据的,这样是为了防止读出来的数据不正确。不多说,下面是代码,还有测试用的代码一起的,我就不改了,大家可参考一下: 

 

unit Unit1;

interface

uses
  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
.


原创作品出自努力偷懒,转载请说明文章出处http://blog.csdn.net/kfarvid或 http://www.cnblogs.com/kfarvid/

转载于:https://www.cnblogs.com/kfarvid/archive/2008/01/07/2251448.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值