由于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卡的输入或者是其它卡的输入。相关推荐

  1. 如何区分电梯卡为id卡ic卡_UID卡是什么?和IC卡、ID卡有什么区别?

    原标题:UID卡是什么?和IC卡.ID卡有什么区别? 生活中,我们经常用到门禁卡.考勤卡.电梯卡还有停车卡,这些功能是怎么实现的呢?这是靠卡里封装的芯片和线圈来实现各种功能,不同的芯片频率.容量.读写 ...

  2. 卡硬工具箱说系统服务器,卡硬工具箱有什么用处功能 卡硬工具箱检测电脑配置教程...

    卡硬工具箱是一款很实用的电脑检测工具,大家知道怎么使用吗?很多用户想检测自己的电脑配置,电脑上看不出,需要下载检测工具如卡硬工具箱,不过很多用户下载完以后不知道怎么用.下面小编在这里为大家介绍下卡硬工 ...

  3. Adobe Photoshop 软件在使用文字输入功能时出现卡顿

    文章目录 关于使用 Adobe Photoshop 软件在使用文字输入功能时出现卡顿的应对措施 问题描述:在ps软件内输入文字,电脑程序卡顿 应对措施1: 在电脑底部任务栏找到输入法图标,单击鼠标右键 ...

  4. 卡顿监测 · 方案篇 · Android卡顿监测指导原则

    一.引言 Hello,我是小木箱,欢迎来到小木箱成长营系列教程,今天将分享卡顿监测 · 方案篇 · Android卡顿监测指导原则.小木箱从七个维度将Android卡顿监测技术方案解释清楚. 第一个维 ...

  5. SD/TF卡驱动(二)--------SD卡程序初始化流程以及读写

    说明: ①测试的SD卡为高容量卡,支持SD卡2.0协议,容量为16G ②采用GPIO模拟SPI时序的方式对SD卡进行驱动,很方便移植到没有硬件SPI或者SDIO的MCU,对于这类MCU,只需要将对应的 ...

  6. scum开服务器延迟高怎么办,人渣SCUM卡顿优化方法 人渣SCUM卡顿怎么办

    人渣SCUM卡顿优化方法 人渣SCUM卡顿怎么办 2018-09-05 09:32:15来源:SCUM吧/fabulis编辑:野狐禅评论(0) <人渣SCUM>卡顿不流畅怎么优化呢?不少玩 ...

  7. 编写一个函数,该函数能判断一个英文句子str(带空格)中是否含有某个单词w,如“How old are you?”含有“old”。在main函数中输入一个英文句子,再输入一个单词,如果英文句子中含有那

    题目要求: 编写一个C程序,实现以下功能: 编写一个函数,该函数能判断一个英文句子str(带空格(升级版))中是否含有某个单词w,如"How old are you?"含有&quo ...

  8. 自定义日期输入控件-解决需要用户输入日期的麻烦控制

    一般情况下使用文本框的,由于但无法很好的控制用户输入的格式通常都会写一个输入格式的说明如:1999-12-12,虽然用多个组合的下拉菜单可以解决问题,但是似乎不太方便操作.后来用梅花雨的日期控件,确实 ...

  9. 直到输到-1停止 c语言,python新人求助raw_input()问题,不断提示输入字元或数字直到输入空值停止提示。...

    python新人求助raw_input()问题,不断提示输入字元或数字直到输入空值停止提示.以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶 ...

  10. 评分卡模型(一)评分卡建模实战

    评分卡模型(一)评分卡建模实战 小P:我看你做的这些数据挖掘,虽然预测结果挺准的,但是完全不知道怎么来的啊 小H:其实在风控领域有个很流行的评分卡模型,可以很直观的告诉你什么特征加分,什么特征减分,每 ...

最新文章

  1. sql not in 用法_SQL 语法速成手册
  2. runloop - 介绍
  3. A-Frame WEB VR框架初体验
  4. 【形式语言与自动机】图灵机
  5. python编程入门教程100例_Python3入门经典100例(60-70)
  6. Ubuntu 系统进不去 左上角减号
  7. mysql lost connection to server during query
  8. 【动态规划】LeetCode 1143最长公共子序列
  9. 面向对象17:抽象类和抽象方法、创建抽象类的匿名子类对象、模板方法设计模式
  10. 首届魔都ArchData技术峰会进入倒计时
  11. keil5 项目管理
  12. 利用java的jsoup实现:短视频无水印下载
  13. MATLAB app designer中全局变量的使用
  14. 关于Android Bluetooth(安卓蓝牙)在车载产品中的使用变化
  15. 自尊是人生的高尚境界
  16. “车”的故事,我的信息化建设和管理愚见
  17. 一个不错的免费打电话的程序
  18. LaTex单词的间隔
  19. 为什么C语言永远不会过时?
  20. 笔记本电脑只能搜索到部分WiFi

热门文章

  1. Taro+react开发(28)本地用require线上不必
  2. [vue] 什么是双向绑定?原理是什么?
  3. [css] 说说你对CSS样式覆盖规则的理解
  4. [vue] vue中怎么重置data?
  5. [vue-element]项目中有使用过ElementUI吗?有遇到过哪些问题?它的使用场景主要是哪些?
  6. 前端学习(2445):分页的实现
  7. 前端学习(2330):angular之二级路由
  8. 前端学习(1645):前端系列实战课程之留言板功能实现
  9. 前端学习(1296):第三方模块nodemon
  10. 第八十三期:这些高性能负载均衡架构知识点,90%的人分不清!