Apos duas semanas em função deste programa de biometria, hoje do nada consegui que funcionasse completamente como eu desejava.
E o que tive que mudar foram somente o local da criação de algumas variavel e objetos, mas eu não conseguia enxergar.
Abaixo o programa para que todos que venham necessitar trabalhar com biometria, não passem o sufoco que passei.
Código: |
unit UBiometria; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Comobj, DBClient, DB, StdCtrls, EditNew, Buttons, ComCtrls, Grids, DBGrids, Mask; type TFBiometria = class(TForm) BtnCapturar: TBitBtn; BtnIdentificacao: TBitBtn; TextUserID: TEditN; Label12: TLabel; MedCpfFunc: TMaskEdit; SpbCpf: TSpeedButton; EdtNome: TEditN; Label2: TLabel; BtnNovo: TBitBtn; DBGrid1: TDBGrid; procedure BtnIdentificacaoClick(Sender: TObject); procedure BtnCapturarClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure SpbCpfClick(Sender: TObject); procedure MedCpfFuncEnter(Sender: TObject); procedure MedCpfFuncExit(Sender: TObject); procedure MedCpfFuncKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure MedCpfFuncKeyPress(Sender: TObject; var Key: Char); procedure MedCpfFuncKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure BtnNovoClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } procedure busca_Digital; end; const NBioAPIERROR_NONE = 0; NBioAPI_FIR_PURPOSE_VERIFY = 1; NBioAPI_DEVICE_ID_NONE = 0; NBioAPI_DEVICE_ID_FDP02_0 = 1; NBioAPI_DEVICE_ID_FDU01_0 = 2; NBioAPI_DEVICE_ID_AUTO_DETECT = 255; var FBiometria: TFBiometria; objNBioBSP : variant; objDevice : variant; objExtraction : variant; objIndexSearch : variant; implementation {$R *.dfm} uses UProc, UDm, USispo; procedure TFBiometria.BtnCapturarClick(Sender: TObject); // captura do aparelho a digital. var nUserID : integer; szFir : wideString; begin if Trim(MedCpfFunc.Text)='' then Begin Showmessage('Informe CPF funcionário'); MedCpfFunc.SetFocus; exit; End; nUserID := 0; if TextUserID.Text <> '' then // codigo do funcionario (ID) begin nUserID := StrToInt(TextUserID.Text); objDevice.Open(NBioAPI_DEVICE_ID_AUTO_DETECT) ; // abre aparelho biometrico if objDevice.ErrorCode <> 0 Then Begin ShowMessage('Falha na abertura do aparelho biometrico !'); close; exit; End; objExtraction.Enroll(nUserID, 0); // ler impressão digital if objExtraction.ErrorCode <> NBioAPIERROR_NONE Then Begin ShowMessage('Erro de leitura !'); close; exit; End; objDevice.Close(NBioAPI_DEVICE_ID_AUTO_DETECT); // fecha aparelho biometrico szFir := objExtraction.TextEncodeFIR; // captura string gerada pela DLL objIndexSearch.AddFIR(szFir, nUserID); if (objIndexSearch.ErrorCode = NBioAPIERROR_NONE) Then // salva string no banco de dados se não tiver erro. begin Dm.SQLFuncionario.Close; Dm.SQLFuncionario.SQL.Clear; Dm.SQLFuncionario.SQL.Add('Update bfuncionario'); Dm.SQLFuncionario.SQL.Add(' Set FuDigital='+QuotedStr(szFir)); // mysql FuDigital tipo Text Dm.SQLFuncionario.SQL.Add(' where (FuCPF='+QuotedStr(trim(MedCpfFunc.Text))+')'); Dm.SQLFuncionario.ExecSQL; end else ShowMessage('Falha na extração da digital !'); end else ShowMessage('Informar usuario'); end; procedure TFBiometria.BtnIdentificacaoClick(Sender: TObject); // identifica usuario pela digital. var szFir : wideString; str : wideString; User_id : Integer; ListItem : TListItem ; begin objDevice.Open(NBioAPI_DEVICE_ID_AUTO_DETECT) ; // abre aparelho biometrico if objDevice.ErrorCode <> NBioAPIERROR_NONE then begin str := objDevice.ErrorDescription; ShowMessage('Falha no aparelho biométrico !'); Exit; end; objExtraction.Capture(NBioAPI_FIR_PURPOSE_VERIFY); // captura digital if objExtraction.ErrorCode = NBioAPIERROR_NONE then begin objDevice.Close(NBioAPI_DEVICE_ID_AUTO_DETECT); szFir := objExtraction.TextEncodeFIR; // busca string da digital objIndexSearch.IdentifyUser(szFir, 5); // identifica digital com o da memoria com nivel 5 de segurança if objIndexSearch.ErrorCode <> NBioAPIERROR_NONE then ShowMessage('Funcionario não identificado !') else Begin User_id := objIndexSearch.UserID; // pega o ID showmessage('Funcionario identificado com sucesso '+inttostr(User_id)); Dm.SQLFuncionario.Close; // busca o funcionario pela ID informada. Dm.SQLFuncionario.SQL.Clear; Dm.SQLFuncionario.SQL.Add('Select * from bfuncionario'); Dm.SQLFuncionario.SQL.Add(' where idbfuncionario=:idbfuncionario'); Dm.SQLFuncionario.Close; Dm.SQLFuncionario.ParamByName('idbfuncionario').AsInteger:=User_id; Dm.SQLFuncionario.Open; if Dm.SQLFuncionario.Eof then showmessage('Funcionario não localizado pelo codigo fornecido') else Begin MedCpfFunc.Text:=Dm.SQLFuncionario.FieldByName('FuCpf').AsString; EdtNome.Text:=Dm.SQLFuncionario.FieldByName('FuNome').AsString; End; End; end else ShowMessage('Falha na extração da biometria !'); objDevice.Close(NBioAPI_DEVICE_ID_AUTO_DETECT); end; procedure TFBiometria.BtnNovoClick(Sender: TObject); var i:integer; begin ActiveControl:=nil; // forca saida com on exit dos edit's for i := 0 to ComponentCount -1 do if Components[i] is TEdit then begin TEdit(Components[i]).Text := ''; end; MedCpffunc.Enabled:=true; MedCpffunc.Text:=''; MedCpffunc.EditMask:=''; Busca_Digital; MedCpfFunc.SetFocus; end; procedure TFBiometria.busca_Digital; var nUserID : integer; szFir : wideString; begin if objIndexSearch.ErrorCode <> NBioAPIERROR_NONE then begin ShowMessage('Falha ao iniciar sistema de biometria!'); end else Begin Caption := Caption + ' - Versão : v' + objNBioBSP.MajorVersion + '.' + objNBioBSP.MinorVersion; objIndexSearch.ClearDB; Dm.SQLFuncionario.Close; // inicia banco de dados Dm.SQLFuncionario.SQL.Clear; Dm.SQLFuncionario.SQL.Add('Select * from bfuncionario'); Dm.SQLFuncionario.Close; Dm.SQLFuncionario.Open; Dm.SQLFuncionario.First; while not(Dm.SQLFuncionario.Eof) do begin if Dm.SQLFuncionario.FieldByName('FuDigital').AsString<>'' then Begin nUserID:=Dm.SQLFuncionario.FieldByName('idbfuncionario').AsInteger; szFir:=Dm.SQLFuncionario.FieldByName('FuDigital').AsString; objIndexSearch.AddFIR(szFir,nUserID); // coloca na memoria as strings armazenadas no BD. if objIndexSearch.ErrorCode <> NBioAPIError_None then Showmessage('Erro ao ler dados'); End; Dm.SQLFuncionario.Next; end; Dm.SQLFuncionario.Close; Dm.SQLFuncionario.SQL.Clear; End; end; procedure TFBiometria.FormClose(Sender: TObject; var Action: TCloseAction); begin objNBioBSP := 0; objDevice := 0; objExtraction := 0; objIndexSearch := 0; end; procedure TFBiometria.FormCreate(Sender: TObject); begin //Create NBioBSP object objNBioBSP := CreateOleObject('NBioBSPCOM.NBioBSP'); // uses Comobj objDevice := objNBioBSP.Device; objExtraction := objNBioBSP.Extraction; objIndexSearch := objNBioBSP.IndexSearch; TextUserID.Text := '1'; end; procedure TFBiometria.FormShow(Sender: TObject); begin BtnNovo.Click; end; procedure TFBiometria.MedCpfFuncEnter(Sender: TObject); begin MedCPFFunc.EditMask:=''; end; procedure TFBiometria.MedCpfFuncExit(Sender: TObject); begin If trim(MedCPFFunc.Text)<>'' then Begin MedCpfFunc.Enabled:=false; If length(trim(MedCPFFunc.Text))=11 then MedCpfFunc.EditMask:='000.000.000-00;0;' else Begin If length(trim(MedCPFFunc.Text))=14 then MedCpfFunc.EditMask:='00.000.000/0000-00;0;'; end; Dm.SQLFuncionario.Close; Dm.SQLFuncionario.SQL.Clear; Dm.SQLFuncionario.SQL.Add('Select * from bfuncionario'); Dm.SQLFuncionario.SQL.Add(' where FuCpf=:FuCpf'); Dm.SQLFuncionario.Close; Dm.SQLFuncionario.ParamByName('FuCpf').AsString:=MedCpfFunc.Text; Dm.SQLFuncionario.Open; if Dm.SQLFuncionario.Eof then Begin showmessage('Funcionario não localizado'); MedCpfFunc.SetFocus; exit; End; EdtNome.Text:=Dm.SQLFuncionario.fieldbyname('FuNome').AsString; TextUserID.Text:=inttostr(Dm.SQLFuncionario.FieldByName('idbfuncionario').AsInteger); End else EdtNome.Text:=''; end; procedure TFBiometria.MedCpfFuncKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if key = 13 then Perform(Wm_NextDlgCtl,0,0); end; procedure TFBiometria.MedCpfFuncKeyPress(Sender: TObject; var Key: Char); begin // aceitar somente numeros de 0 a 9. If Key<>#8 then If not ((Key in ['0'..'9'])) then Key:=#0; end; procedure TFBiometria.MedCpfFuncKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin If key=113 then // f2 pesquisa SpbCpf.Click; end; procedure TFBiometria.SpbCpfClick(Sender: TObject); begin MedCpfFunc.EditMask:=''; MedCpfFunc.SetFocus; F2Pesquisa(FBiometria,nil,3); If trim(MedCpfFunc.Text)<>'' then Begin EdtNome.SetFocus; end; end; end. |
Aparelho biometrico Fingkey Hamster da Nitgen.
MAIS DETALHES IMPORTANTES NO LINK ABAIXO:
http://www.activedelphi.com.br/forum/viewtopic.php?p=435338&sid=55c54c170fd8d0855a91f00425cb593b