首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

Delphi 身份证读取。弹出窗体【附上所有代码】

2013-09-05 
Delphi 身份证读取。弹出窗体【附上全部代码】unit Main_UinterfaceusesWindows, Messages, SysUtils, Varia

Delphi 身份证读取。弹出窗体【附上全部代码】


unit Main_U;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OBThread, jpeg, StdCtrls, ExtCtrls,IDCardClass_U;

type
  TIDCardRead_F = class(TForm)
    img_Cover: TImage;
    obthrd_ReadID: TOBThread;
    lbl_Info: TLabel;
    lbl_Con: TLabel;
    BtnGlyph_Read: TImage;
    BtnGlyph_UnRead: TImage;
    ID_Addr: TLabel;
    ID_Birth: TLabel;
    ID_Depart: TLabel;
    ID_ID: TLabel;
    ID_Name: TLabel;
    ID_Nation: TLabel;
    ID_NewAddr: TLabel;
    ID_Sex: TLabel;
    ID_Time: TLabel;
    Image_XP: TImage;
    ImageClose: TImage;
    ImageMin: TImage;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure ImageCloseClick(Sender: TObject);
    procedure obthrd_ReadIDExecute(Sender: TObject; params: Pointer);
    procedure BtnGlyph_ReadClick(Sender: TObject);
    procedure BtnGlyph_UnReadClick(Sender: TObject);
    procedure ImageMinClick(Sender: TObject);
    procedure img_CoverMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    UsbOrCom: string;
    Port,pucSn,puiCHMsgLen,puiPHMsgLen: integer;
    StartReadID,PortEnable: Boolean;
    IDCard: TIDCard;
    procedure ReadIDCard();//读身份证
    { Private declarations }
  public
    { Public declarations }
  end;

var
  IDCardRead_F: TIDCardRead_F;

implementation
uses IDCardDll_U ;
{$R *.dfm}

procedure TIDCardRead_F.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  IDCard.Destroy;


  StartReadID:= False;
  if PortEnable then
    SDT_ClosePort(Port);
end;

procedure TIDCardRead_F.FormCreate(Sender: TObject);
begin
  IDCard:= TIDCard.Create;
  PortEnable:= OpenUsbPort(Port);
  if PortEnable then
  begin
    UsbOrCom:= 'U';//连接的类型是通过Usb端口
    lbl_Con.Caption:= '连接类型:USB口连接';
    lbl_Con.Font.Color:= clGreen;
  end
  else begin
    PortEnable:= OPenComPort(Port);
    if PortEnable then
    begin
      UsbOrCom:= 'C' ;   //连接的类型是通过Com端口
      lbl_Con.Caption:= '连接类型:串口连接';
      lbl_Con.Font.Color:= clGreen;
    end
    else begin
      UsbOrCom:='';
      lbl_Con.Caption:= '连接类型:端口错误导致未连接';
      lbl_Con.Font.Color:= clRed;
    end;
  end;
  if not PortEnable then
    BtnGlyph_Read.Enabled:= False;
  StartReadID:= True;
  if (StartReadID) and (PortEnable) then
    BtnGlyph_ReadClick(nil);
end;

procedure TIDCardRead_F.ImageCloseClick(Sender: TObject);
begin
  Close;
end;

procedure TIDCardRead_F.ReadIDCard;
var
  iRet : integer;
begin
  while (PortEnable) and (StartReadID) do
  begin
    Sleep(1000);
    iRet:= SDT_StartFindIDCard(Port, pucSn, 1); //查卡
    if iRet = 159 then
      iRet:= SDT_SelectIDCard(Port,pucSn,1) //选卡
    else Continue;
    if iRet= 144 then
    begin
      puiCHMsgLen:=0;
      puiPHMsgLen:=0;
      iRet:= SDT_ReadBaseMsgToFile(1001, 'wz.txt',puiCHMsgLen, 'zp.wlt',puiPHMsgLen,1); //存储文件
    end
    else Continue;
    if iRet =144 then
    begin
      UsbOrCom:='U';//连接的类型是通过Usb端口


      if UsbOrCom ='U' then
        iRet := GetBmp('zp.wlt',2)
      else if UsbOrCom='C' then //如果连接的类型是Com端口
        iRet := GetBmp('zp.wlt',1);
想在这里判断数据库内是否存在这个身份证信息。如果存在打开一个窗体显示信息
      if iRet=1 then
      begin
        Image_XP.Picture.LoadFromFile('zp.bmp');
        IDCard.InitInfo(ExtractFilePath(Application.ExeName) +'wz.txt');
        ID_Name.Caption:= IDCard.Name;
        ID_Sex.Caption:= IDCard.Sex_CName;
        ID_Nation.Caption:= IDCard.NATION_CName;
        ID_Birth.Caption:= IDCard.BIRTH;
        ID_Addr.Caption:= IDCard.ADDRESS;
        ID_ID.Caption:= IDCard.IDC;
        ID_Depart.Caption:= IDCard.REGORG;
        ID_Time.Caption:= IDCard.STARTDATE +'-'+IDCard.ENDDATE;
        DeleteFile('zp.bmp');
        DeleteFile('wz.txt');
      end
      else Continue;
    end;
  end;
end;

procedure TIDCardRead_F.obthrd_ReadIDExecute(Sender: TObject;
  params: Pointer);
begin
  ReadIDCard ;
end;

procedure TIDCardRead_F.BtnGlyph_ReadClick(Sender: TObject);
begin
  StartReadID:= True;
  BtnGlyph_Read.Visible:= False;
  BtnGlyph_UnRead.Visible:= True;
  obthrd_ReadID.Execute(nil);
end;

procedure TIDCardRead_F.BtnGlyph_UnReadClick(Sender: TObject);
begin
  BtnGlyph_Read.Visible:= True;
  BtnGlyph_UnRead.Visible:= False;
  StartReadID:= False;
end;

procedure TIDCardRead_F.ImageMinClick(Sender: TObject);
begin
  IDCardRead_F.WindowState:= wsMinimized;
end;

procedure TIDCardRead_F.img_CoverMouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
  if ssleft in shift then
    Releasecapture;
  perform(WM_SYSCOMMAND,$F012,0);


end;

end.


{$A+,B-,C+,D+,E-,F-,G+,H+,I+,J+,K-,L+,M-,N+,O+,P+,Q-,R-,S-,T-,U-,V+,W-,X+,Y+,Z1}

unit OBThread;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls;

type
  TNotifyEventParams=procedure(Sender : TObject; params : pointer) of object;
  TOBThread = class(TComponent)
  private
    FThreadCount : Integer;
    FExclusif : boolean;
    FRunOnCreate : boolean;
    FOnbegin : TNotifyEvent;
    FOnExecute : TNotifyEventParams;
    FOnFinish : TNotifyEvent;
    FOnFinishAll : TNotifyEvent;
    FFreeOnTerminate : boolean;
    FAbout: String;
    procedure DoCreate;
    procedure DoTerminate(Sender : TObject);
  protected
  public
    constructor Create(AOwner : TComponent); override;
    destructor Destroy; override;
  published
    function Execute(p : pointer):Thandle;
    function OneThreadIsRunning : boolean;
    function GetPriority(Thread:Thandle):TThreadPriority;
    procedure SetPriority(Thread:THandle;Priority:TThreadPriority);
    procedure QuitThread(Thread:Thandle);
    procedure Suspend(Thread:Thandle);
    procedure Resume(Thread:Thandle);
    property About : String read FAbout write FAbout;
    property Exclusif : boolean read FExclusif write FExclusif;
    property RunOnCreate : boolean read FRunOnCreate write FRunOnCreate;
    property FreeOnTerminate : boolean read FFreeOnTerminate write FFreeOnTerminate;
    property Onbegin : TNotifyEvent read FOnbegin write FOnBegin;
    property OnExecute : TNotifyEventParams read FOnExecute write FOnExecute;
    property OnFinish : TNotifyEvent read FOnFinish write FOnFinish;
    property OnFinishAll : TNotifyEvent read FOnFinishAll write FOnFinishAll;


  end;

  TOBHideThread = class(TThread)
  private
    FExecuteEvent : TNotifyEventParams;
    FParams : pointer;
  public
    constructor Create(event : TNotifyEventParams; params : pointer); virtual;
    procedure Execute; override;
  end;

  procedure Synchronize(Method: TNotifyEvent);
  procedure SynchronizeParams(Method: TNotifyEventParams; p : pointer);
  
implementation

var
   mtx : THandle;

procedure Synchronize(Method : TNotifyEvent);
begin
   WaitForSingleObject(mtx, INFINITE);
   Method(nil);
   ReleaseMutex(mtx);
end;

procedure SynchronizeParams(Method : TNotifyEventParams; p : pointer);
begin
   WaitForSingleObject(mtx, INFINITE);
   Method(nil, p);
   ReleaseMutex(mtx);
end;

constructor TOBThread.Create(AOwner : TComponent);
begin
   inherited Create(AOwner);
   FThreadCount:=0;
   FRunOnCreate:=true;
   FExclusif:=true;
   FreeOnTerminate:=true;
end;

destructor TOBThread.Destroy;
begin
   inherited Destroy;
end;

function TOBThread.Execute(p : pointer):Thandle;
var
  HideThread : TOBHideThread;
begin
   result:=0;
   if Assigned(FOnExecute) then
   begin
      if Exclusif then
        if OneThreadIsRunning then exit;
      inc(FThreadCount);
      HideThread:=TOBHideThread.Create(FOnExecute, p);
      HideThread.FreeOnTerminate:=FFreeOnTerminate;
      HideThread.OnTerminate:=DoTerminate;
      DoCreate;
      if FRunOnCreate then
         HideThread.Resume;
      result:=HideThread.ThreadID;
   end;
end;

function TOBThread.GetPriority(Thread:Thandle):TThreadPriority;
begin
   result:=tpIdle;
   if Thread<>0 then result:=TThreadPriority(GetThreadPriority(thread));


end;

procedure TOBThread.SetPriority(Thread:THandle;Priority:TThreadPriority);
begin
   SetThreadPriority(Thread,integer(priority));
end;

procedure TOBThread.QuitThread(Thread:Thandle);
begin
   TerminateThread(Thread,0);
end;

procedure TOBThread.Suspend(Thread:Thandle);
begin
   SuspendThread(Thread);
end;

procedure TOBThread.Resume(Thread:Thandle);
begin
   ResumeThread(thread);
end;

procedure TOBThread.DoCreate;
begin
   if Assigned(FOnBegin) then
     FOnBegin(nil);
end;

procedure TOBThread.DoTerminate;
begin
   dec(FThreadCount);
   if Assigned(FOnFinish) then
     FOnFinish(nil);
   if FThreadCount=0 then
     if Assigned(FOnFinishAll) then
       FOnFinishAll(nil);
end;

function TOBThread.OneThreadIsRunning : boolean;
begin
   result:=FThreadCount>0;
end;




{*****************************************************}
constructor TOBHideThread.Create(event : TNotifyEventParams; params : pointer);
begin
   inherited Create(true);
   FExecuteEvent:=event;
   FParams:=params;
end;
{*****************************************************}
procedure TOBHideThread.Execute;
begin
   FExecuteEvent(nil, FParams);
end;
{*****************************************************}
   
initialization
  mtx:=CreateMutex(nil, false, 'VCLJvThreadMutex');
finalization
  CloseHandle(mtx);
end.



[解决办法]
这个没有设备也白搭。可能不同的设备驱动,开发接口也不一样。

热点排行