ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Biometria Fingkey Hamster - nitgen
Ir à página 1, 2  Próximo
 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
heliorios
Novato
Novato


Registrado: Terça-Feira, 31 de Julho de 2007
Mensagens: 48

MensagemEnviada: Qua Fev 08, 2012 3:52 pm    Assunto: Biometria Fingkey Hamster - nitgen Responder com Citação

Estou tentando desenvolver uma rotina que capture, salve em base de dados mysql e identifique o funcionario cadastrado pela biometria.
Uso Delphi 2010 com mysql, criei no cadastro de funcionarios um campo FuDigital tipo Text para armazenar a string de comparação.

O programa esta capturando, salvando e identificando se eu utilizo sem sair do sistema, mas quando saio e entro novamente não cosegue identificar, utilizo "objIndexSearch.AddFIR(szFir,nUserID);" para colocar na memoria e " objIndexSearch.IdentifyUser(szFir, 5);" para comparar.

abaixo o fonte. Se alguem ja passou por isso e puder ajudar, agradeço muito, pois pesquisei na internet e nos exemplos, mas não consegui localizar o problema.
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;
    procedure BtnIdentificacaoClick(Sender: TObject);
    procedure BtnCapturarClick(Sender: TObject);
    procedure FormCreate(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);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure busca_Digital;
  end;

const
    NBioAPIERROR_NONE = 0;
    NBioAPI_FIR_PURPOSE_VERIFY      = 1;
 //Constant for DeviceID
    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;

// nitgen/sdk/samples/com/delphi/indexsearchdp

procedure TFBiometria.BtnCapturarClick(Sender: TObject);
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
        begin
           nUserID := StrToInt(TextUserID.Text);
           // Get FIR data
           objDevice.Open(NBioAPI_DEVICE_ID_AUTO_DETECT) ;
           if objDevice.ErrorCode <> 0 Then
              ShowMessage('Falha na abertura do aparelho biometrico !');
           //Get FIR data
           objExtraction.Enroll(nUserID, 0);
           if objExtraction.ErrorCode <> NBioAPIERROR_NONE Then
              ShowMessage('Erro de leitura !');
           objDevice.Close(NBioAPI_DEVICE_ID_AUTO_DETECT);
           szFir := objExtraction.TextEncodeFIR;
           //Regist FIR to IndexSearch DB
           objIndexSearch.AddFIR(szFir, nUserID);
           if (objIndexSearch.ErrorCode = NBioAPIERROR_NONE) Then
              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);
var szFir    : wideString;
    str      : wideString;
    User_id    : Integer;
begin
   //Get FIR data
   objDevice.Open(NBioAPI_DEVICE_ID_AUTO_DETECT) ;
   if objDevice.ErrorCode <> NBioAPIERROR_NONE then
      begin
         str := objDevice.ErrorDescription;
         ShowMessage('Falha no aparelho biométrico !');
         Exit;
      end;
   objExtraction.Capture(NBioAPI_FIR_PURPOSE_VERIFY);
   if objExtraction.ErrorCode = NBioAPIERROR_NONE then
      begin
         objDevice.Close(NBioAPI_DEVICE_ID_AUTO_DETECT);
         szFir := objExtraction.TextEncodeFIR;
         //Search FIR to IndexSearch DB
         objIndexSearch.IdentifyUser(szFir, 5);
         User_id := objIndexSearch.UserID;
         showmessage(inttostr(User_id));
         if objIndexSearch.ErrorCode <> NBioAPIERROR_NONE then
            ShowMessage('Funcionario não identificado !')
         else
            showmessage('Funcionario identificado com sucesso');
      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:='';
   TextUserID.Text := '1';
   objIndexSearch.ClearDB;
   Busca_Digital;
   MedCpfFunc.SetFocus;
end;

procedure TFBiometria.busca_Digital;
var nUserID   : integer;
    szFir     : wideString;
begin
   //Create NBioBSP object
   objNBioBSP := CreateOleObject('NBioBSPCOM.NBioBSP');  // uses  Comobj
   objDevice      := objNBioBSP.Device;
   objExtraction  := objNBioBSP.Extraction;
   objIndexSearch := objNBioBSP.IndexSearch;
   //Check initialize object
   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;
        Dm.SQLFuncionario.SQL.Clear;
        Dm.SQLFuncionario.SQL.Add('Select * from bfuncionario');
        Dm.SQLFuncionario.Close;
        Dm.SQLFuncionario.Open;
        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);

                   if objIndexSearch.ErrorCode <> NBioAPIError_None  then
                      Showmessage('Erro ao ler dados');
                End;
             Dm.SQLFuncionario.Next;
          end;
      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
   Busca_Digital;
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
  //Create NBioBSP object
  objNBioBSP := CreateOleObject('NBioBSPCOM.NBioBSP');
  objDevice      := objNBioBSP.Device;
  objExtraction  := objNBioBSP.Extraction;
  objIndexSearch := objNBioBSP.IndexSearch;
   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.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
heliorios
Novato
Novato


Registrado: Terça-Feira, 31 de Julho de 2007
Mensagens: 48

MensagemEnviada: Qui Fev 09, 2012 9:22 am    Assunto: Biometria Responder com Citação

Comprei a video aula de reconhecimento de impressao digital com delphi de Eduardo Rocha, mas não estou conseguindo aplicar ao meu programa.
Não sei o que estou fazendo errado quando salvo a string digital ou na leitura. O exemplo SDK, salva em arquivo .isdb, mas gostaria de salvar em meu arquivo mysql.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
cyberdisk
Colaborador
Colaborador


Registrado: Domingo, 4 de Julho de 2010
Mensagens: 2391
Localização: São José dos Campos - SP

MensagemEnviada: Qui Fev 09, 2012 11:23 am    Assunto: Responder com Citação

jogue a figura em um TImage e depois voce pode salvar no banco como bmp ou jpg

abraço
_________________
O conhecimento abre muitas portas
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
heliorios
Novato
Novato


Registrado: Terça-Feira, 31 de Julho de 2007
Mensagens: 48

MensagemEnviada: Sex Fev 10, 2012 8:06 am    Assunto: Biometria. Responder com Citação

Bom dia. Agradeço a atenção, mas segundo estudei sobre o aparelho Fingkey Hamster, não é necessario salvar imagem e sim uma string criada pela DLL que acompanha o aparelho. Estou conseguindo gerar esta string e salva-la em banco de dados. O problema é que a função que captura a imagem, aparentemente esta correta, não reportando nenhuma mensagem de erro. Mas quando faço a leitura da impressão e vou comparar com a da memoria atraves tambem de função da DLL, esta não é localizada, retornando zero.

Se capturo a string e verifico sem sair do sistema, ele o faz correto, retornando o ID do funcionario.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
heliorios
Novato
Novato


Registrado: Terça-Feira, 31 de Julho de 2007
Mensagens: 48

MensagemEnviada: Sex Fev 10, 2012 9:07 am    Assunto: Biometria. Responder com Citação

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.
Obrigado a todos e espero que ajude.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
alexbandeira
Mestre
Mestre


Registrado: Terça-Feira, 27 de Julho de 2004
Mensagens: 812
Localização: Paulista - PE

MensagemEnviada: Sex Fev 10, 2012 8:46 pm    Assunto: Responder com Citação

Amigo:

Sua atitude é fundamental para a evolução da nossa ferramenta de trabalho.
_________________
Conhecemos um grande homem pelas pequenas atitudes.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 9098
Localização: Sinop-MT

MensagemEnviada: Sex Ago 02, 2013 8:49 am    Assunto: Responder com Citação

to tentando usar a unit postada, mas recebo a mensagem:

Citação:
Cadeia de caracteres de classe inválida.


qdo cria o obj no OnCreate do Form. alg pode dar uma forca?

to usando D7 / Hamster III

Código:
unit UBiometria;

interface

uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, Comobj, DBClient, DB, StdCtrls, Buttons, ComCtrls, Grids,
   DBGrids, Mask;

type
   TForm2 = class(TForm)
      Button1: TButton;
      Button2: TButton;
      Memo1: TMemo;
      procedure BtnIdentificacaoClick(Sender: TObject);
      procedure BtnCapturarClick(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
   Form2: TForm2;
   objNBioBSP: variant;
   objDevice: variant;
   objExtraction: variant;
   objIndexSearch: variant;

implementation

{$R *.dfm}

procedure TForm2.BtnCapturarClick(Sender: TObject); // captura do aparelho a digital.
var nUserID: integer;
   szFir: wideString;
begin
   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
      Memo1.Lines.Text := szFir;
      ShowMessage('Digital Capturada.');
   end
   else
      ShowMessage('Falha na extração da digital !');
end;

procedure TForm2.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
         showmessage('Funcionario identificado com sucesso ' + inttostr(User_id));
      end;
   end
   else
      ShowMessage('Falha na extração da biometria !');
   objDevice.Close(NBioAPI_DEVICE_ID_AUTO_DETECT);
end;

procedure TForm2.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;
   end;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   objNBioBSP := 0;
   objDevice := 0;
   objExtraction := 0;
   objIndexSearch := 0;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
   objNBioBSP := CreateOleObject('NBioBSPCOM.NBioBSP'); // uses  Comobj
   objDevice := objNBioBSP.Device;
   objExtraction := objNBioBSP.Extraction;
   objIndexSearch := objNBioBSP.IndexSearch;
end;

end.

_________________
<b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
mg.vasconcelos
Novato
Novato


Registrado: Sábado, 31 de Julho de 2010
Mensagens: 7

MensagemEnviada: Sex Ago 02, 2013 5:17 pm    Assunto: Responder com Citação

Apenas para ajudar, vou colocar a forma que eu fiz.

O meu form possui um TPanel onde eu uso o Handle para exibir a digital e um timer para verificar a cada 900ms se existe alguma digital sendo lida.

Segue o código.

Essa é a função que faz a leitura e checagem da FIR

Código:

function TdmPonto.verificafir: integer; //retorna um inteiro com o ID do funcionário
var
  szFir: widestring;
begin
  objExtraction.WindowStyle := NBioAPI_WINDOW_STYLE_INVISIBLE;
  objExtraction.FingerWnd := frmMarcPonto.pnImgDigital.Handle; //gera a imagem da digital (TPanel)
  objDevice.Open(255); //abre o dispositivo no modo Default
  if objDevice.CheckFinger <> 0 then //verifica se existe o que ler
  begin
    objExtraction.DefaultTimeout := 1500; //tempo limite
    objExtraction.Capture(NBioAPI_FIR_PURPOSE_VERIFY);
    szFir := objExtraction.TextEncodeFIR;
    objIndexSearch.IdentifyUser(szFir, 9); //aqui você gera a precisão do leitura
    if objIndexSearch.ErrorCode = NBioAPIERROR_None then
    begin
       Result := objIndexSearch.UserID; //retorna o ID do funcionário
      objDevice.Close(255); //fecha o dispositivo
    end
    else
      objDevice.Close(255); //fecha o dispositivo
  end;
end;



esse procedure carrega as FIRs no dispositivo (Eu utilizo uma base off do fire)
Código:

procedure TdmPonto.recarregar;
var
  id: integer;
  fir: widestring;
begin
  objIndexSearch.ClearDB; //apaga todas FIRs registradas
  if not idsCadFuncionario.Active then //verifica se está ativo ou não a ClientDataset se sim ele dá um refresh se não ele ativa
    idsCadFuncionario.Active := true
  else
    idsCadFuncionario.Refresh;

  idsCadFuncionario.First; // vai para o primeiro registro
  while not idsCadFuncionario.Eof do //navega pelo dataset colocando os ids e firs no dispositivo.
  begin
    id := idsCadFuncionarioIDFUNCIONARIO.AsInteger;
    fir := idsCadFuncionarioFIR.AsWideString;
    objIndexSearch.AddFIR(fir, id);
    idsCadFuncionario.Next;
  end;

end;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
mg.vasconcelos
Novato
Novato


Registrado: Sábado, 31 de Julho de 2010
Mensagens: 7

MensagemEnviada: Sex Ago 02, 2013 5:18 pm    Assunto: Responder com Citação

esse código é colocado no Show do form para inicializar tudo.
Código:

if not dmPonto.selecionaponto then
    raise Exception.Create('LEITOR NÃO CONECTADO')
  else
    dmPonto.recarregar;


a function selecionaponto é essa e serve para ativar o Leitor.
function TdmPonto.selecionaponto: boolean;
begin
  Result := true;
  objNBioBSP := 0;
  objDevice := 0;
  objExtraction := 0;
  objMatching := 0;
  objIndexSearch := 0;
  try
    objNBioBSP := CreateOleObject('NBioBSPCOM.NBioBSP');
    objDevice := objNBioBSP.Device;
    objExtraction := objNBioBSP.Extraction;
    objMatching := objNBioBSP.Matching;
    objIndexSearch := objNBioBSP.NSearch;
    objExtraction.WindowStyle := NBioAPI_WINDOW_STYLE_INVISIBLE;
  Except
    Result := false;
  end;
end;



Essa parte é quem faz o trabalho, esse é um timer com 900ms e ele fica checando se há alguma digital no leitor e se houver ele dispara o restante do código.
Código:

procedure TfrmMarcPonto.captFIRTimer(Sender: TObject);
var
  idfunc, resultado: integer;
  vardatahora: datahora;
begin
  captFIR.Enabled := false; //ele para assim evita um novo disparo.
  idfunc := 0;
  if true then //essa função eu devia ter retirado, mas era caso não houvesse leitor ele deixaria o usuário digitar.
    idfunc := dmPonto.verificafir //dispara a function verificafir
  else if edtIDFunc.Text <> '' then //não funciona para mais nada tenho que retirar mas servia para ler a entrada manual do id do funcionário.
  begin
    idfunc := strtoint(edtIDFunc.Text);
    edtIDFunc.Text := '';
  end;
  if idfunc <> 0 then //se a func verificafir retornar algo diferente de 0 então é que captou uma digital regitrada
  begin
    vardatahora := dataehora; //só para entendere isso pode ser substituido para Now, é que eu uso um horario de um servidor na internet e por isso existe essa function.
    resultado := dmPonto.preenchermarcacao(idfunc, vardatahora.Thora,
      vardatahora.Tdata);
    case resultado of
      0:
        begin
          messagedlg('SUA ULTIMA MARCAÇÃO FOI A MENOS' + #13 + 'DOIS MINUTOS',
            mtError, [mbOk], 0);
        end;
      1:
        begin
          frmMarcPonto.Color := clGreen;
        end;
      2:
        begin
          frmMarcPonto.Color := clMaroon;
        end;
      3:
        begin
          messagedlg('MUITAS MARCAÇÕES', mtError, [mbOk], 0);
        end;
    end;

    if (resultado <> 0) or (resultado <> 3) then
    begin
      with dmPonto do
      begin
        idsPesFuncionario.Close;
        idsPesFuncionario.ParamByName('IDFUNCIONARIO').AsInteger := idfunc;
        idsPesFuncionario.Open;
        lblNome.Caption := idsPesFuncionarioNOME.AsString;
        lblHoraMarcacao.Caption := Datetostr(vardatahora.Tdata) + '  ' +
          Timetostr(vardatahora.Thora);

      end;
      liberar.Enabled := true;
    end;
  end
  else if not parar then
    captFIR.Enabled := true;

end;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 9098
Localização: Sinop-MT

MensagemEnviada: Seg Ago 05, 2013 8:48 am    Assunto: Responder com Citação

consegui instalar o leitor (tava faltando o SDK), e to usando essa procedure pra fazer a leitura:

Código:
var nUserID: integer;
   szFir: wideString;
begin
   InicializaLeitor;
   nUserID := 0;
   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
      Memo1.Lines.Text := szFir;
      ShowMessage('Digital Capturada.');
   end
   else
      ShowMessage('Falha na extração da digital !');

   FechaLeitor;


esta funcao faz a leitura da digital e coloca no memo1, depois fiz outra igual q joga no memo2. ao comparar as 2 leituras, diz q nao sao iguais.

note q a linha abaixo com comentario.

//objIndexSearch.AddFIR(szFir, nUserID);

ela faz alguma diferenca? qtas digitais posso adicionar ao objIndexSearch?

outra coisa: qdo inicio a captura, é mostrada algumas janelas, e uma delas é para selecionar o dedo q sera lido:



tem como pular essas partes?

poderia colocar um passo a passo de como proceder pra fazer a leitura?

eu estou usando assim:

1. faz a leitura da digita (aquelas telas q quero pular)
2. grava o texto lido no BD (var szFir)
3. faz a leitura da digital novamente
4. compara com a digital q esta no BD

devo fazer uso do objeto objIndexSearch.AddFIR para funcionar?

Código:
      //objIndexSearch.IdentifyUser(szFir, 5); // identifica digital com o da memoria com nivel 5  de segurança

_________________
<b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 9098
Localização: Sinop-MT

MensagemEnviada: Seg Ago 05, 2013 5:53 pm    Assunto: Responder com Citação

agor aja ta funcionando.

so uma duvida: toda vez q eu abrir o sistema de biometria, devo alimentar o objeto com as biometrias lidas anteriormente? nao posso simplesmente ler do banco de direto? e qual o limite? se eu tiver 20.000 leituras, demora mto pra iniciar
_________________
<b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
julioaze
Novato
Novato


Registrado: Quarta-Feira, 14 de Janeiro de 2015
Mensagens: 2

MensagemEnviada: Qua Jan 14, 2015 4:59 pm    Assunto: Responder com Citação

Estou desenvolvendo a leitura do Nitgen em um sistema Delphi que já possui suporte para o ZK 7000 da ZK Software.
O BD está configurado para gravar 03 amostras de digital (do mesmo dedo) em campos do tipo binário.
Minha dúvida é como fazer isso para o Nitgen.
Vejo que normalmente o pessoal grava os dados em formato string e não achei nada a respeito de gravar como binário.
Se alguém puder ajudar, desde já agradeço.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
julioaze
Novato
Novato


Registrado: Quarta-Feira, 14 de Janeiro de 2015
Mensagens: 2

MensagemEnviada: Seg Jan 19, 2015 9:01 am    Assunto: Responder com Citação

joemil escreveu:
agor aja ta funcionando.

so uma duvida: toda vez q eu abrir o sistema de biometria, devo alimentar o objeto com as biometrias lidas anteriormente? nao posso simplesmente ler do banco de direto? e qual o limite? se eu tiver 20.000 leituras, demora mto pra iniciar


Ressuscitando o tópico: como você fez para pular as telas padrão do Nitgen?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
MarceloJR
Aprendiz
Aprendiz


Registrado: Domingo, 7 de Agosto de 2005
Mensagens: 163

MensagemEnviada: Qui Jul 09, 2015 1:02 am    Assunto: URL do sdk Responder com Citação

Biometria Fingkey Hamster - nitgen

http://www.nitgen.com.br/download/eNBSP_SDK_v4.84.zip
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 9098
Localização: Sinop-MT

MensagemEnviada: Seg Jul 27, 2015 4:04 pm    Assunto: Responder com Citação

ressuscitando o topico.
estou fazendo um novo sistema de biometria pra um cliente (o anterior nem usava mais hehehe)

a leitura ja ta funcionando normalmente, mas agora preciso q varios computadores facam a leitura, entao preciso criar algo do tipo Client/server. alg tem um link, exemplo, dica???

e tb vou precisar de algum equipamento q possa fazer a leitura biometrica de forma movel. alg conhec algum equipamento wi-fi com leitura?
_________________
<b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Ir à página 1, 2  Próximo
Página 1 de 2

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB