zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    Spring Boot拦截器实现并和swagger集成后使用拦截器的配置问题
    .Net
    Spring+MyBatis实现数据库读写分离方案
    JS通过百度地图API获取当前定位信息
    DevExpress安装说明
    sql server 多行数据合并成一列
    sql数据行转列
    html居中定位
    c#使用多线程的几种方式示例详解
    sql server数据字符串分割功能sql
  • 原文地址:https://www.cnblogs.com/kfarvid/p/2251448.html
Copyright © 2011-2022 走看看