Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Interceptar Eventos Externos (https://www.clubdelphi.com/foros/showthread.php?t=93776)

oscarac 25-02-2019 05:54:07

Interceptar Eventos Externos
 
1 Archivos Adjunto(s)
buenas noches

estoy trabajando con una libreria externa "zkemkeeper_TLB"
que fue generada al registrar "zkemkeeper.dll"

la pregunta del millon es Como accedo a los eventos de esta libreria? como los "intercepto" en tiempo de ejecucion?

la idea principal es que cuando coloque la huella en el dispositivo (zkteco k40) dispare los aventos de esta libreria
no tengo la menor idea de como hacerlo
alguien me da una mano?

gracias

Neftali [Germán.Estévez] 25-02-2019 09:07:31

Parece que la librería te genera esta clase, para encapsular el comportamiento del dispositivo TCZKEM = class(TOleControl).
Crea una instancia/componente sea de forma visual o en ejecución.
A partir de ahí, ya tienes en esa clase disponibles los eventos necesarios (o eso parece para interactuar con el dispositivo):


Código Delphi [-]
....

    property OnAttTransaction: TCZKEMOnAttTransaction read FOnAttTransaction write FOnAttTransaction;
    property OnKeyPress: TCZKEMOnKeyPress read FOnKeyPress write FOnKeyPress;
    property OnEnrollFinger: TCZKEMOnEnrollFinger read FOnEnrollFinger write FOnEnrollFinger;
    property OnNewUser: TCZKEMOnNewUser read FOnNewUser write FOnNewUser;
    property OnEMData: TCZKEMOnEMData read FOnEMData write FOnEMData;
    property OnConnected: TNotifyEvent read FOnConnected write FOnConnected;
    property OnDisConnected: TNotifyEvent read FOnDisConnected write FOnDisConnected;
    property OnFinger: TNotifyEvent read FOnFinger write FOnFinger;
    property OnVerify: TCZKEMOnVerify read FOnVerify write FOnVerify;
    property OnFingerFeature: TCZKEMOnFingerFeature read FOnFingerFeature write FOnFingerFeature;
    property OnHIDNum: TCZKEMOnHIDNum read FOnHIDNum write FOnHIDNum;
    property OnDoor: TCZKEMOnDoor read FOnDoor write FOnDoor;
    property OnAlarm: TCZKEMOnAlarm read FOnAlarm write FOnAlarm;
    property OnWriteCard: TCZKEMOnWriteCard read FOnWriteCard write FOnWriteCard;
    property OnEmptyCard: TCZKEMOnEmptyCard read FOnEmptyCard write FOnEmptyCard;
    property OnDeleteTemplate: TCZKEMOnDeleteTemplate read FOnDeleteTemplate write FOnDeleteTemplate;
    property OnAttTransactionEx: TCZKEMOnAttTransactionEx read FOnAttTransactionEx write FOnAttTransactionEx;
    property OnEnrollFingerEx: TCZKEMOnEnrollFingerEx read FOnEnrollFingerEx write FOnEnrollFingerEx;
    property OnGeneralEvent: TCZKEMOnGeneralEvent read FOnGeneralEvent write FOnGeneralEvent;


Si la nomenclatura no es mala, yo apostaría a que los eventos OnEnrollFinger, OnFinger, OnFingerFeature, OnEnrollFingerEx tienen que ver con la detección de un dedo en el lector.
Si has usado un componente los eventos se programan como en el resto.
Si lo has creado en ejecución puedes buscar en los foros sobre "crear componentes en ejecución" y encontrarás muchos ejemplos de cómo crearlos e interceptar los eventos.

Manejo de Componentes en Tiempo de ejecución
Asignar un evento a un componente creado en tiempo de ejecucion
Asignar a tbitbtn evento en tiempo de ejecucion

oscarac 25-02-2019 14:58:44

mis conocimientos en delphi son limitados
podrias darme un ejemplo por favor?

Neftali [Germán.Estévez] 25-02-2019 15:43:05

Para generar el nuevo componente haz lo siguiente:


1) File / New /Other y selecciona Package
2) Te creará un nuevo package vacío, que es lo que necesitamos para instalar el componente.




3) Sobre el package click derecho y añade la unit que te ha generado.





4) Compila, guarda e instala el package. Te saldrán algunos avisos, aceptalos.
5) Si todo ha ido bien, te saldrá un mensaje similar a este:





6) Si ahora vas a un formulario, deberías ver el nuevo componente registrado, TCZKEM.
Puedes arrastrarlo sobre el formulario y trabajar con él como otro normal.




Neftali [Germán.Estévez] 25-02-2019 15:46:32

Si no necesitas crear el componente y quieres utilizarlo por código, basta con que pruebes con un código como este:


Código Delphi [-]
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    // Procedimiento para capturar el evento (del mismo tipo que el evento)

    procedure VerifyProc (ASender: TObject; UserID: Integer);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  zkemkeeper_TLB;      // Añadir la USES del componente

procedure TForm1.VerifyProc(ASender: TObject; UserID: Integer);
begin
  // Procedimiento de verificación
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  comp:TCZKEM;
begin
  // Crear el componente
  comp := TCZKEM.Create(nil);
  // Capturar el evento y asignarle un procedimiento

  comp.OnVerify := VerifyProc;
  // Llamar al método PowerOnAllDevice
  comp.PowerOnAllDevice;
  ...

end;

Aquí ves cómo se crear el componente, como se captura un evento y cómo se llama a un método.
Si revisas la documentación que tengas de él, debería estar explicado para qué sirve cada cosa.

oscarac 25-02-2019 16:34:14

Ya estoy entendiendo, corrigeme si es que me equivoco
Código Delphi [-]
procedure VerifyProc (ASender: TObject; UserID: Integer);

VerifyProc es el procedimiento que se ejecutara cuando se active el metodo que yo desee ejecutar (ya sea OnFinger, OnAttTransactionx, etc etc)

la pregunta ahora es...

Como hacer para "interceptar" ese metodo, es decir, en que momento se ejecutara "verifyProc"

Neftali [Germán.Estévez] 25-02-2019 17:29:05

El orden para entenderlo y generarlo es el siguiente (lo hacemos con otro evento, por ejemplo, OnFinger):

1) El componente tiene un evento OnFinger, que queremos capturar.
2) En la unit generada buscamos la definición del evento:

Código Delphi [-]
  property OnFinger: TNotifyEvent read FOnFinger write FOnFinger;

3) Vemos que el evento es del tipo TNotifyEvent y buscamos este tipo. Este tipo es estandard de Delphi, pero podría estar definido es la misma unit, como el caso anterior de TCZKEMOnVerify.

El caso TCZKEMOnVerify está definido en la misma uniot como:

Código Delphi [-]
  TCZKEMOnVerify = procedure(ASender: TObject; UserID: Integer) of object;

El TNotifyEvent es estandard de Delphi, como te he comentado y si lo buscas en el código o en la ayuda es del tipo:

Código Delphi [-]
  TNotifyEvent = procedure(Sender: TObject) of object;

4) Creamos un procedimiento para asifgnarlo al evento del mismo tipo (con los mismos parámetros):

Código Delphi [-]
  procedure FingerProc(Sender: TObject);

5) Asignamos el procedimiento creado al evento del componente...
Código Delphi [-]
var   
  comp:TCZKEM; 
begin   
  // Crear el componente   
  comp := TCZKEM.Create(nil);   
  // Capturar el evento y asignarle un procedimiento   
  comp.OnVerify := VerifyProc;
  // Capturar el evento OnFinger
  comp.OnFinger := FingerProc;          <<=================

Y con eso conseguimos que cada vez que en el componente "salte" el evento OnFinger, se ejecute nuestro procedimiento FingerProc.

Neftali [Germán.Estévez] 25-02-2019 17:39:35

Cita:

Empezado por oscarac (Mensaje 530843)
Como hacer para "interceptar" ese metodo, es decir, en que momento se ejecutara "verifyProc"


Visualmente es cuando programas en evento, si lo haces como en el código anterior es con esta l´ñinea:


Código Delphi [-]
  comp.OnVerify := VerifyProc;


Le estás diciendo que cuando "salte" ele evento OnVerify, ejecute el procedimiento VerifyProc.

oscarac 25-02-2019 17:44:29

Entendido
lo voy a probar mas tarde

pero sigo con la duda de como sabe el programa que el usuario puso el dedo en el huellero, se que los eventos que se van a disparar estan en la libreria, pero como dije... como sabe que puse el dedo en el lector????

oscarac 25-02-2019 23:04:13

Estuve avanzando un poco mas de acuerdo a lo que me enseñaste

Código Delphi [-]
unit FrmMain_f;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Grids, Vcl.DBGrids, zkemkeeper_TLB, dateutils;

type
  TForm1 = class(TForm)
    edtIp: TEdit;
    edtPort: TEdit;
    btnDispositivoLoad: TButton;
    dbgrd1: TDBGrid;
    mmoLOG: TMemo;
    lbl1: TLabel;
    procedure btnDispositivoLoadClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    Procedure LeerHuella;

    { Private declarations }
  public
      ZK1 : TCZKEM;
      procedure Log(aMsj : string);
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnDispositivoLoadClick(Sender: TObject);
begin
  if not(ZK1.Connect_Net(EdtIP.Text, StrToInt(EdtPort.Text))) then
    begin
      lbl1.Caption := 'Error. No se pudo conectar';
      exit;
    end;
    if not ZK1.RegEvent(1, 65535) then  //65535
      lbl1.Caption := 'Error RegEvent';

end;

procedure TForm1.FormCreate(Sender: TObject);
Var Huella : TCZKEM;
begin
  Huella := TCZKEM.Create(nil);  // creo el componente
  Huella.OnFinger := LeerHuella;
end;

procedure TForm1.LeerHuella;
begin
 //
end;

procedure TForm1.Log(aMsj: string);
begin
  MmoLOG.Lines.Add(aMsj);
end;

end.

pero al compilar me aparece un error

[dcc32 Error] FrmMain_f.pas(143): E2009 Incompatible types: 'Parameter lists differ'

si voy al archivo zkemkeeper_TLB y busco OnFinger, su declaracion esta asi

Código Delphi [-]
    procedure OnFinger; dispid 8;

entonces no entiendo el porque del mensaje de error con parametros

oscarac 25-02-2019 23:14:51

le agregue

Código Delphi [-]
Procedure LeerHuella (Sender: TObject);

y ya compila bien

oscarac 26-02-2019 01:48:59

Logre hacer que cuando se coloca el dedo en el huellero se dispare un evento

Código Delphi [-]
procedure TForm1.LeerHuella(Sender: TObject);
begin
      Log('Entro a Leer huella');  .//. agrega una linea a un memo, solo para mostrar las veces que entra
end;

el tema es que entra 2 veces al evento

alguien sabe porque?

Neftali [Germán.Estévez] 26-02-2019 08:40:25

Cita:

Empezado por oscarac (Mensaje 530856)
...
si voy al archivo zkemkeeper_TLB y busco OnFinger, su declaracion esta asiCódigo Delphi [-] procedure OnFinger; dispid 8;

entonces no entiendo el porque del mensaje de error con parametros


El OnFinger, aparece más de una vez, pero siempre tienes que ir a lo que hay definido dentro de la clase:
Código Delphi [-]
  TCZKEM = class(TOleControl)
  ...
En ese caso es:

Código Delphi [-]
  property OnFinger: TNotifyEvent read FOnFinger write FOnFinger;

Por eso el procedimiento:
Código Delphi [-]
Procedure LeerHuella (Sender: TObject);
Ya si tiene la cabecera correcta.

Neftali [Germán.Estévez] 26-02-2019 08:47:52

Cita:

Empezado por oscarac (Mensaje 530864)
Logre hacer que cuando se coloca el dedo en el huellero se dispare un evento

^\||/^\||/^\||/

Cita:

Empezado por oscarac (Mensaje 530864)
el tema es que entra 2 veces al evento
alguien sabe porque?

En esto ya tendrás que ver la documentación del componente.
Ahí te debería explicar para qué es cada método, cuando se lanzan y porqué.

Yo lo que haría es este caso, es primero capturar varios eventos (los que te parezcan más significativos) y realizar un Log en pantalla para ver cómo se van disparando. De esa forma te harás una idea de cómo van saliendo.
Por ejemplo optaría por: OnConnected, OnDisConnected, OnFinger, OnVerify, OnGeneralEvent.
Un log de cada uno de ellos y de los parámetros.

También buscaría información de la propiedad PullMode, que por el nombre, puede ser que afecte à la forma de leer las huellas (tal vez).
Pero como te digo, todo esto debería estar en la documentación/ejemplos suministrados por el fabricante.

oscarac 26-02-2019 15:53:33

hay un evento el cual me interesa
Se llama OnAttTransatacion
uno de sus parametros me devuelve "el codigo" asignado a la huella digital (previamwnte grabada en el huellero)

no tengo idea de como acceder a ese metodo

me das una mano?

Neftali [Germán.Estévez] 26-02-2019 16:24:20

Cita:

Empezado por oscarac (Mensaje 530868)
no tengo idea de como acceder a ese metodo
me das una mano?


¿Has definido el método para capturar el evento??
¿Has hecho el Log de los parámetros? A ver qué valores llegan en el evento.

oscarac 26-02-2019 16:42:13

si he definido el metodo para capturar el evento
pero no se como llamarlo (invocarlo)

sigo el mismo procedimiento que el ejemplo que pusiste en ese post pero me suelta muchos errores
no se por donde empezar

oscarac 26-02-2019 17:01:20

Código Delphi [-]
unit FrmMain_f;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Grids, Vcl.DBGrids, zkemkeeper_TLB, dateutils,
  Vcl.OleCtrls;

type
  TForm1 = class(TForm)
    edtIp: TEdit;
    edtPort: TEdit;
    btnDispositivoLoad: TButton;
    dbgrd1: TDBGrid;
    mmoLOG: TMemo;
    lbl1: TLabel;
    procedure btnDispositivoLoadClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
//    Procedure LeerHuella (sender: tobject; EnrollNumber, IsInValid, AttState,
//      VerifyMethod, Year, Month, Day, Hour, Minute, Second: integer);

    Procedure CapturaCodigo (sender: tobject; EnrollNumber : String; IsInvalid, AttState, VerifyMethod, year, Month, Day, hour, Minute, Second : Integer);
  private

    { Private declarations }
  public
      ZK1 : TCZKEM;
      Connected : Boolean;
      procedure OnConnect(Sender : TObject);
      procedure OnDisconnect(Sender : TObject);
      function CapturaRegistros : Boolean;
      procedure Log(aMsj : string);
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnDispositivoLoadClick(Sender: TObject);
begin

  if not(ZK1.Connect_Net(EdtIP.Text, StrToInt(EdtPort.Text))) then
    begin
      lbl1.Caption := 'Error. No se pudo conectar';
      exit;
    end;
    if not ZK1.RegEvent(1, 65535) then  //65535
      lbl1.Caption := 'Error RegEvent';

    ZK1.PullMode := 1;

      Log('Conectado...');


end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ZK1 := TCZKEM.Create(nil);
  ZK1.OnConnected := OnConnect;
  ZK1.OnAttTransaction := CapturaCodigo;
//  aqui me sale error
[dcc32 Error] FrmMain_f.pas(68): E2010 Incompatible types: 'Integer' and 'string'
end;

procedure TForm1.OnConnect(Sender: TObject);
begin
  Connected := True;
end;

procedure TForm1.OnDisconnect(Sender: TObject);
begin
  Connected := False;
end;


Procedure TForm1.CapturaCodigo (sender: tobject; EnrollNumber : String; IsInvalid, AttState, VerifyMethod, year, Month, Day, hour, Minute, Second : Integer);
Var _Resultado : Integer;   //EnrollNumber, IsInvalid, AttState, VerifyMethod, year, Month, Day, hour, Minute, Second : Integer;
begin
      Log('Entro a Leer huella');
    _Resultado := ZK1.OnAttTransactionEx (sender, EnrollNumber, IsInvalid, AttState, VerifyMethod, year, Month, Day, hour, Minute, Second);
// aqui debo jalar el codigo que se almacena en la variable EnrollNumber
end;

procedure TForm1.Log(aMsj: string);
begin
  MmoLOG.Lines.Add(aMsj);
end;

end.

oscarac 26-02-2019 21:55:04

vayamos por partes a ver si estoy entendiendo bien
Código Delphi [-]
unit FrmMain_f;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Grids, Vcl.DBGrids, zkemkeeper_TLB, dateutils,
  Vcl.OleCtrls;

type
  TForm1 = class(TForm)
    edtIp: TEdit;
    edtPort: TEdit;
    btnDispositivoLoad: TButton;
    dbgrd1: TDBGrid;
    mmoLOG: TMemo;
    lbl1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure LeerHuella(Sender: Tobject);
  private

    { Private declarations }
  public
      ZK1 : TCZKEM;
      Connected : Boolean;
      procedure OnConnect(Sender : TObject);
      procedure OnDisconnect(Sender : TObject);
      procedure Log(aMsj : string);
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  ZK1 := TCZKEM.Create(nil);
  ZK1.OnConnected := OnConnect;
  ZK1.OnFinger := LeerHuella;
  if not(ZK1.Connect_Net(EdtIP.Text, StrToInt(EdtPort.Text))) then
    begin
      lbl1.Caption := 'Error. No se pudo conectar';
      exit;
    end;
    if not ZK1.RegEvent(1, 65535) then  //65535
      lbl1.Caption := 'Error RegEvent';

    ZK1.PullMode := 1;
    Log('Conectado...');
end;

procedure TForm1.OnConnect(Sender: TObject);
begin
  Connected := True;
end;

procedure TForm1.OnDisconnect(Sender: TObject);
begin
  Connected := False;
end;


procedure TForm1.LeerHuella(sender: tobject);
  Var _Resultado : Integer;
_Sender : TObject;
EnrollNumber : Integer;
IsInValid, AttState, VerifyMethod, Year, Month, Day, Hour, Minute, Second : Integer;
begin
  Log ('Huella Detectada');
end;

procedure TForm1.Log(aMsj: string);
begin
  MmoLOG.Lines.Add(aMsj);
end;

end.

Código Delphi [-]
    procedure LeerHuella(Sender: Tobject);

es el procedimiento que se ejecutara cuando ponga el dedo en el huellero
Código Delphi [-]
  ZK1 := TCZKEM.Create(nil);
  ZK1.OnConnected := OnConnect;
  ZK1.OnFinger := LeerHuella;

cargo el "componente", lo conecto y le digo cuando se dispare el evento Onfinger (que es colocar el dedo en el huellero) ejecuta el procedimiento Leer huella

hasta ahi estamos bien si?

Neftali [Germán.Estévez] 27-02-2019 08:41:34

Cita:

Empezado por oscarac (Mensaje 530875)
...cargo el "componente", lo conecto y le digo cuando se dispare el evento Onfinger (que es colocar el dedo en el huellero) ejecuta el procedimiento Leer huella

hasta ahi estamos bien si?


Yo hasta aquí lo veo bien.
Crear el componente, le assignas los eventos OnFinger y OnConnect (el OnDisconnect no).
Y luego haces el Connect_Net.


A partir de ahí si llegas al punto en que está conectado (suponiendo que no haya que llamar algún método más para inicializar) deberían empezar a llegarte eventos cuando pongas el dedo.
Cada vez que se ejecute el evento en el dispositivo (OnFinger), a tu programa llegará el control al procedimniento LeerHuella.



¿Es correcto?

Neftali [Germán.Estévez] 27-02-2019 08:43:57

Algunas consideraciones...


1) Los procedimientos definidos, colócalos dentro de la parte privada.
Código Delphi [-]
   ...

    dbgrd1: TDBGrid;
    mmoLOG: TMemo;
    lbl1: TLabel;
  private

    procedure FormCreate(Sender: TObject);
    procedure LeerHuella(Sender: Tobject);

    procedure AttTransactionProc(ASender: TObject; EnrollNumber: Integer; IsInValid: Integer;
                                 AttState: Integer; VerifyMethod: Integer;
                                 Year: Integer; Month: Integer; Day: Integer;
                                 Hour: Integer; Minute: Integer;
                                 Second: Integer);
    procedure GeneralEventProc(ASender: TObject; const DataStr: WideString);
  public


2) Define un par más para ver otros eventos:
Código Delphi [-]
    procedure AttTransactionProc(ASender: TObject; EnrollNumber: Integer; IsInValid: Integer;
                                 AttState: Integer; VerifyMethod: Integer;
                                 Year: Integer; Month: Integer; Day: Integer;
                                 Hour: Integer; Minute: Integer;
                                 Second: Integer);
    procedure GeneralEventProc(ASender: TObject; const DataStr: WideString);


3) Añade la implementación con el Log.
Código Delphi [-]
procedure TForm1.GeneralEventProc(ASender: TObject; const DataStr: WideString);
begin
  Log('TForm1.GeneralEventProc');
  Log('  - DataString: ' + DataStr);
end;

procedure TForm1.AttTransactionProc(ASender: TObject; EnrollNumber, IsInValid,
  AttState, VerifyMethod, Year, Month, Day, Hour, Minute, Second: Integer);
begin
  Log('TForm1.AttTransactionProc');
  Log('  - EnrollNumber: ' + IntToStr(EnrollNumber));
  Log('  - IsInValid: ' + IntToStr(IsInValid));
  Log('  - AttState: ' + IntToStr(AttState));
  Log('  - VerifyMethod: ' + IntToStr(VerifyMethod));
  Log('  - Year: ' + IntToStr(Year));
  Log('  - Month: ' + IntToStr(Month));
  Log('  - Day: ' + IntToStr(Day));
  Log('  - Hour: ' + IntToStr(Hour));
  Log('  - Minute: ' + IntToStr(Minute));
  Log('  - Second: ' + IntToStr(Second));
end;


4) Y asignalos todos en la creación del componente:
Código Delphi [-]
...

  ZK1 := TCZKEM.Create(nil);
  ZK1.OnConnected := OnConnect;
  ZK1.OnFinger := LeerHuella;
  ZK1.OnDisConnected := OnDisconnect;
  ZK1.OnAttTransaction := AttTransactionProc;
  ZK1.OnGeneralEvent := GeneralEventProc;


Por último, estaría bien que nos pusieras la salida del Log, cuando ejecutas y cuando pones el dedo en el lector.

oscarac 27-02-2019 15:12:39

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 530876)
Yo hasta aquí lo veo bien.
Crear el componente, le assignas los eventos OnFinger y OnConnect (el OnDisconnect no).
Y luego haces el Connect_Net.


A partir de ahí si llegas al punto en que está conectado (suponiendo que no haya que llamar algún método más para inicializar) deberían empezar a llegarte eventos cuando pongas el dedo.
Cada vez que se ejecute el evento en el dispositivo (OnFinger), a tu programa llegará el control al procedimniento LeerHuella.



¿Es correcto?

Correcto, hasta aqui funciona
voy a probar lo que has mencionado posteriormente y les aviso

oscarac 27-02-2019 15:17:00

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 530877)
Algunas consideraciones...


1) Los procedimientos definidos, colócalos dentro de la parte privada.
Código Delphi [-]
   ...

    dbgrd1: TDBGrid;
    mmoLOG: TMemo;
    lbl1: TLabel;
  private

    procedure FormCreate(Sender: TObject);
    procedure LeerHuella(Sender: Tobject);

    procedure AttTransactionProc(ASender: TObject; EnrollNumber: Integer; IsInValid: Integer;
                                 AttState: Integer; VerifyMethod: Integer;
                                 Year: Integer; Month: Integer; Day: Integer;
                                 Hour: Integer; Minute: Integer;
                                 Second: Integer);
    procedure GeneralEventProc(ASender: TObject; const DataStr: WideString);
  public


2) Define un par más para ver otros eventos:
Código Delphi [-]
    procedure AttTransactionProc(ASender: TObject; EnrollNumber: Integer; IsInValid: Integer;
                                 AttState: Integer; VerifyMethod: Integer;
                                 Year: Integer; Month: Integer; Day: Integer;
                                 Hour: Integer; Minute: Integer;
                                 Second: Integer);
    procedure GeneralEventProc(ASender: TObject; const DataStr: WideString);


3) Añade la implementación con el Log.
Código Delphi [-]
procedure TForm1.GeneralEventProc(ASender: TObject; const DataStr: WideString);
begin
  Log('TForm1.GeneralEventProc');
  Log('  - DataString: ' + DataStr);
end;

procedure TForm1.AttTransactionProc(ASender: TObject; EnrollNumber, IsInValid,
  AttState, VerifyMethod, Year, Month, Day, Hour, Minute, Second: Integer);
begin
  Log('TForm1.AttTransactionProc');
  Log('  - EnrollNumber: ' + IntToStr(EnrollNumber));
  Log('  - IsInValid: ' + IntToStr(IsInValid));
  Log('  - AttState: ' + IntToStr(AttState));
  Log('  - VerifyMethod: ' + IntToStr(VerifyMethod));
  Log('  - Year: ' + IntToStr(Year));
  Log('  - Month: ' + IntToStr(Month));
  Log('  - Day: ' + IntToStr(Day));
  Log('  - Hour: ' + IntToStr(Hour));
  Log('  - Minute: ' + IntToStr(Minute));
  Log('  - Second: ' + IntToStr(Second));
end;


4) Y asignalos todos en la creación del componente:
Código Delphi [-]
...

  ZK1 := TCZKEM.Create(nil);
  ZK1.OnConnected := OnConnect;
  ZK1.OnFinger := LeerHuella;
  ZK1.OnDisConnected := OnDisconnect;
  ZK1.OnAttTransaction := AttTransactionProc;
  ZK1.OnGeneralEvent := GeneralEventProc;


Por último, estaría bien que nos pusieras la salida del Log, cuando ejecutas y cuando pones el dedo en el lector.

la idea es que yo declaro un procedimiento para cuando se dispare un evento, eso lo tengo clarisimo, pero me esta saliendo un error cuando defino el procedimiento

Código Delphi [-]
[dcc32 Error] FrmMain_f.pas(22): E2065 Unsatisfied forward or external declaration: 'TForm1.AttTransactionProc'

oscarac 27-02-2019 15:29:27

el error fue mi culpa, no estaba definiendo el procedimiento dentro del form

cuando coloco la huella, solo se activa el evento leerhuella, los demas no

tengo entendido, segun lo que vi en el manual que en la instruccion

Código Delphi [-]
    if not ZK1.RegEvent(1, 65535) then  //65535   2 = Solo OnFinger

se van a disparar todos los eventos relacionados con el lector


pero el evento OnttTransaction no se dispara

oscarac 27-02-2019 15:46:09

otro tema estoy usando el Evento OnAttTransactionEx porque dentro de sus parametros devuelve el codigo del usuario en string

Código Delphi [-]
    procedure AttTransactionExProc(ASender: TObject; EnrollNumber: WideString; IsInValid: Integer;
                                 AttState: Integer; VerifyMethod: Integer;
                                 Year: Integer; Month: Integer; Day: Integer;
                                 Hour: Integer; Minute: Integer;
                                 Second: Integer; WorkCode: Integer);

y al momento de compilar me sale este mensaje

Código Delphi [-]
[dcc32 Error] FrmMain_f.pas(55): E2009 Incompatible types: 'Parameter lists differ'

la unica diferencia con el OnAttTransaction es que el parametro EnrollNumber es string y tiene un campo adicional al final WorkCode Long (Integer)

no entiendo

oscarac 27-02-2019 16:32:28

Esto lo estoy tratando de documentar y dar la mejor explicacion en caso alguien mas tenga ese problema

Era mi error

fui a la libreria zkemkeeper_TLB

esta es su definicion

Código Delphi [-]
    procedure OnAttTransactionEx(const EnrollNumber: WideString; IsInValid: Integer; 
                                 AttState: Integer; VerifyMethod: Integer; Year: Integer; 
                                 Month: Integer; Day: Integer; Hour: Integer; Minute: Integer; 
                                 Second: Integer; WorkCode: Integer); dispid 17;

al momento de yo declarar el procedimiento no le coloque la palabra CONST

entonces la definicion de los procedimientos debe ser exactamente igual a como esta en la libreria

con esto ya funciona

colooco el dedo y funciona EUREKA

pero no todo es felicidad, por algun motivo los eventos se disparan 2 veces
y me sale este mensaje (displayados en el log)

Cita:

6.2.5.50
Conectado...
Huella Detectada
Huella Detectada
TForm1.AttTransactionExProc
- EnrollNumber:
ð*º
ð*º
ð*º
ð*º
ð*º
ð*º
- IsInValid: -1
- AttState: 0
- VerifyMethod: 13
- Year: 1917
- Month: -70
- Day: 13
- Hour: -16
- Minute: -83
- Second: -70
TForm1.AttTransactionExProc
- EnrollNumber: 123
- IsInValid: 0
- AttState: 0
- VerifyMethod: 0
- Year: 2019
- Month: 2
- Day: 27
- Hour: 10
- Minute: 26
- Second: 10

si se dan cuenta en el primer grupo de mensaje los valores salen distorcionados, no corresponde la informacion a lo que se supone debe salir (como aparece en el segundo bloque)


coloque zk1.Pullmode := 1

y cuando hago eso no pasa por el evento LeerHuella

antes de concluir y de solicitar mas ayuda quiero agradecer a todos los que me han dado una mano en este tema, de verdad que lo hacen desinteresadamente, mas personas como uds. en el mundo

Neftali [Germán.Estévez] 27-02-2019 17:09:22

Cita:

Empezado por oscarac (Mensaje 530885)
con esto ya funciona
colooco el dedo y funciona EUREKA

^\||/^\||/^\||/

Cita:

Empezado por oscarac (Mensaje 530885)

si se dan cuenta en el primer grupo de mensaje los valores salen distorcionados, no corresponde la informacion a lo que se supone debe salir (como aparece en el segundo bloque)

Es posible que te devuelva diferentes lecturas. Me llama la atención el parámetro IsInvlid.

Es posible que devuelva lecturas hasta que hay una correcta o que realice un número fijo (como si fueran reintentos) hasta un número fijo o una lectura correcta.
Haz diferentes pruebas y verás en patrón. De todas formas en la documentación debe explicar el funcionamiento.

oscarac 02-03-2019 19:23:30

Esta pasando algo raro
en la computadora donde hice las pruebas funciona perfectamente, pero cuando instalo el programa en otra computadora (registrando el zkemkeeper.dll)
colocando la misma ip, no logra conectar el lector

he instalado el xe7 para depurar y no logro conectar el lector, he instalado como package el dll compila bien pero no conecta

aparece en los mensajes de event Log

Module Unload: wshtcpip.dll. Process Reloj
Module Unload: Nlaapi.dll
Module Unload Napinsp.dll
...
...

asi sucesivamente


me faltara instalar algo?

Neftali [Germán.Estévez] 04-03-2019 09:57:50

¿No hay ningun log de lo que está pasando?
Revisa que las librerías sean las correctas. Revisa 32/64 bits de las librerías.


La franja horaria es GMT +2. Ahora son las 10:19:00.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi