检测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、这里是选择生成项…

第一百五十期: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…

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

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

歌谣致学习编程的你们

目录 致学习编程的你们&#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的…

配置文件 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(在原…

mybatis学习(9):mybatis连接mysql数据库

首先本地安装一个mysql数据库 修改账号密码 我的是root 123 并用navicate测试连接 数据库为mybatis 表名为users 我们看一下目录结构 直接上代码 user类 package com.edu.hpu.domain;/*** author Administrator*user表所对应的实体类*/ public class User {//实体类的属…

C#创建xml文件

View Code 1 XmlDocument doc new XmlDocument();2 XmlDeclaration dec doc.CreateXmlDeclaration("1.0", "GB2312", null);3 doc.AppendChild(dec);4 //创建一个根节点&#xff08;一级&#xff09;5 …

推荐几个.NET开源图表组件 [转]

转自&#xff1a;http://blog.csdn.net/liujien/archive/2005/10/03/494509.aspx推荐几个.NET开源图表组件&#xff0c;希望大家发行有其它的可以添加一下&#xff0c;说明&#xff1a;因为没有记录在哪里下载&#xff0c;所以大部分只能让大家亲自搜索一下&#xff1a; &#…

MapReduce原理与设计思想

简单解释 MapReduce 算法 一个有趣的例子 你想数出一摞牌中有多少张黑桃。直观方式是一张一张检查并且数出有多少张是黑桃&#xff1f; MapReduce方法则是&#xff1a; 给在座的所有玩家中分配这摞牌让每个玩家数自己手中的牌有几张是黑桃&#xff0c;然后把这个数目汇报给你你…

mybatis学习(11): sql server配置管理器请求失败或服务未及时响应

遇到这种情况&#xff0c;打开sql server配置管理器&#xff0c;双击【sql server网络配置】将其展开&#xff0c;双击子项【MSSQLSERVER的协议】&#xff0c;在右面的内容窗口中找到【VIA】选项将其设置为禁用就可以了。

宰相的智慧

春节的时候回北京的火车上&#xff0c;看到火车的杂志介绍央视即将播出《神探狄仁杰3》&#xff0c;一直对这部电视剧充满期待。上周我在网上看完了《神探狄仁杰3》的“黑衣社”部分&#xff0c;拍的真好看。 看《神探狄仁杰1》(《武朝迷案》)幽州案时&#xff0c;有一个镜头给…

mybatis学习(12)com.microsoft.sqlserver.jdbc.SQLServerException: 通过端口 1433 连接到主机 127.0.0.1 的 TCP/IP

检查SQL Server Configuration Manager 确定实例名为“SKYSQLEXPRESS”下的TCP/IP已经开启了&#xff1a; sql2014配置(系统为Windows8.1) 一般地可以在下图路径中找到: 进入配置管理器界面如图: 右击“TCP/IP”选择“属性”(或双击“TCP/IP”)&#xff0c;选择“IP地址”选项…

windows下eclipse调试hadoop详解

1)下载Eclipse http://www.eclipse.org/downloads/ Eclipse Standard 4.3.2 64位 2) 下载Hadoop版本对应的eclipse插件 我的hadoop是1.0.4&#xff0c;因此下载hadoop-eclipse-plugin-1.0.4.jar 下载地址&#xff1a;http://download.csdn.NET/detail/m_star_jy_sy/7376169 3&a…

WPF中得到一个控件相对其他控件的坐标

加入想得到按钮btnTest左上角相对于主窗体winTest的坐标&#xff0c;可以用如下方法&#xff1a;btnTest.TranslatePoint(new Point(0, 0), winTest) 这个方法返回一个Point类型的值。 转载于:https://www.cnblogs.com/pdfw/archive/2008/04/08/1141836.html