检测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>=48and (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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423894.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mybatis学习(6):IntelliJ IDEA 如何创建一个普通的 Java 项目,及创建 Java 文件并运行

一、创建 Java 项目&#xff1a; 1、打开 IDEA 软件&#xff0c;点击界面上的 Create New Project 2、出现以下界面&#xff0c;选中 Java&#xff0c;然后选择 JDK&#xff0c;最后点击 Next&#xff0c;进行下一步&#xff08;我的是 jdk1.8&#xff09; 3、这里是选择生成项…

解决(?)问题

问题从来都没有真正的解决&#xff0c;所谓的解决问题只不过是在将一个问题转移成另一个问题而已 转载于:https://www.cnblogs.com/shadow-abyss/p/11248042.html

asp.net中获得客户端的IP地址

因为要在项目中取到客户端IP,在网上搜了下相关资料,其中有一篇文章总结的比较详细,这里就把一些我用的上总结一下 方便以后查阅. 通常我们都通过下面的代码获得IP: string ip System.Web.HttpContext.Current.Request.UserHostAddress; 或 string ip System.Web.HttpCon…

第一百五十期:Java程序员必备:异常的十个关键知识点

总结了Java异常十个关键知识点&#xff0c;面试或者工作中都有用哦&#xff0c;加油。异常是指阻止当前方法或作用域继续执行的问题。比如你读取的文件不存在&#xff0c;数组越界&#xff0c;进行除法时&#xff0c;除数为0等都会导致异常。 前言 总结了Java异常十个关键知识点…

学用 TStringGrid [1] - ColCount、RowCount、Cells

本例功能:1、获取 StringGrid 的行数、列数;2、给单元赋值.运行效果图://示例代码: unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ExtCtrls, Grids;typeTForm1 class(TForm)StringGrid1: TStringG…

第六章 设计程序架构 之 设计实现WebSocket策略

1. 概述 传统网页的通信方式是请求-响应模式&#xff0c;每次请求-响应都是新的连接。连接的建立和断开也是需要消耗资源的。 WebSocket是基于TCP协议&#xff0c;实现单个连接上的双向通信。 本章内容包括&#xff1a; 异步读写字符串和二进制数据、选择连接丢失策略、何时使用…

第一百五十一期:最新计算机技能需求排名出炉:Python仅排第三,第一你猜得到吗?

除了编程语言之外&#xff0c;要想找一份计算机相关的工作&#xff0c;还需要很多其他方面的技能。最近&#xff0c;来自美国求职公司 Indeed 的一份报告显示&#xff1a;在全美工作技能需求中&#xff0c;数据库语言 SQL、编程语言 Java 分列前两位。 除了编程语言之外&#x…

Java学习笔记_身份验证机制

身份验证机制&#xff08;authentication&#xff09;&#xff1a;确定一个用户具有自己声称的那个身份 应用程序关心用户是否通过了验证而不关心是通过何种方式进行的验证&#xff1f;&#xff1f;&#xff1f; 授权&#xff08;访问控制&#xff1a;authorization&#xff09…

歌谣致学习编程的你们

目录 致学习编程的你们&#xff0c;希望对大家有所帮助&#xff0c;纯属个人学习经验 前言 学习路线 个人网课学习平台 个人推荐两款软件 个人对于参加培训的看法 个人博客写作 同事同学资源 总结 前言 我是歌谣&#xff0c;一个致力于成为一名优秀的技术革新人员。高…

开发者福音!面向Web场景的云开发服务正式开放!

导 语 继支持小程序开发之后&#xff0c;云开发也支持Web使用啦&#xff01;开发者们可以使用云开发提供的云端能力&#xff0c;直接开发网站应用&#xff0c;如PC端网页、公众号中的网页等。由此开发者可以在网站应用中借助云函数实现业务逻辑&#xff0c;通过与云数据库、对象…

PetShop4.0--转载

以下文章转载于http://www.cnblogs.com/dragonlhf/archive/2006/07/30/463110.html petshop是微软推出的企业级程序架构随着asp.net 2.0推出了petshop4.0&#xff0c;正好这几天没有事&#xff0c;研究一下&#xff0c;学习一下2.0的新特性&#xff0c; 它包括…

mybatis学习(7):Windows下安装MySQL详细教程

1、安装包下载。 下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/ 点击下载之后&#xff0c;可以选择注册Oracle账号&#xff0c;也可以跳过直接下载。 下载完成后&#xff0c;选择一个磁盘内放置并解压。 2 安装教程 &#xff08;1&#xff09;配置环境变量 变量…

[NLP] 相对位置编码(二) Relative Positional Encodings - Transformer-XL

1. Motivation 在Transformer-XL中&#xff0c;由于设计了segments&#xff0c;如果仍采用transformer模型中的绝对位置编码的话&#xff0c;将不能区分处不同segments内同样相对位置的词的先后顺序。 比如对于$segment_i$的第k个token&#xff0c;和$segment_j$的第k个token的…

SendMessage函数的常用消息及其应用

文本框控件通常用于输入和编辑文字。它属于标准 Windows 编辑控件的一个子类,所以它支持所有 编辑控件消息?这儿讲述的技术也适用于由其他厂商设计的 , 以Windows编辑控件类为基础的其他控件? 函数原型: Declare Function SendMessage Lib "user32" Alias "Se…

配置文件 web.config 的讨论

可以直接修改&#xff0c;修改后立即生效&#xff0c;无需重新编译&#xff0c;可以把数据连接对象直接加到web.config 中&#xff0c;从而方便修改&#xff0c;如果写在类中的话&#xff0c;修改后需要重新编译1、所有的配置都必须放在<configuration></configuratio…

mybatis学习(8):The server time zone value '???ú±ê×??±??' is unrecognized or represents more

【报错信息】 【百度翻译】 服务器时区值???????无法识别或表示多个时区。如果要利用时区支持&#xff0c;必须配置服务器或JDBC驱动程序&#xff08;通过ServerTimeZone配置属性&#xff09;&#xff0c;以使用更具体的时区值 【解决方法】 数据库连接配置conf.xml(在原…

Interesting Finds: 2008.03.17

.NET: LINQ Framework Design Guidelines 使用 Visual Studio 分析器找出应用程序瓶颈 Add Support for "Set" Collections to .NET Debug: ASP.NET Case Study: Hang on WaitOne, WaitAny or WaitMultiple Web: Silverlight 2 Developer Poster Syndication 资源 Ar…

Linux 常用的帮助命令

linux 常用的帮助命令 1.help -相当于man的简化版 例如&#xff1a;vim –help 2.man: 详细介绍vim的用法 例如&#xff1a;man vim 3.info:偏重介绍文档 例如&#xff1a; info vim

用进程管理的方法进行自我时间管理

用进程管理的方法进行自我时间管理 操作系统为了实现大的吞吐量&#xff0c;处理器的高效利用&#xff0c;各类资源的平衡使用&#xff0c;短的周转时间&#xff0c;快的响应时间&#xff0c;有保障的截止时间&#xff0c;设计了很多进程调度算法。而人类的思想成果是可以迁移的…

b/s c/s结构的区别!

1 引言 散进散出货物或者称为大宗入出库货物的管理是综合仓库管理的主要内容??1??2??。目前&#xff0c;随着信息技术和网络技术的发展&#xff0c;“信息高速公路”建设已在全球拉开序幕&#xff0c;传统的ClientServer??简称CS??网络应用系统模式在开放性与信息的发…