Идентифицировать отправителя из события OnAttendance в zkemkeeper vb.net
Public axCZKEM1,axCZKEM2 As New zkemkeeper.CZKEM
AddHandler axCZKEM1.OnAttTransactionEx, AddressOf Ax_OnAttTransactionEx
AddHandler axCZKEM2.OnAttTransactionEx, AddressOf Ax_OnAttTransactionEx
Private Sub Ax_OnAttTransactionEx(ByVal sEnrollNumber As String, ByVal iIsInValid As Integer, ByVal iAttState As Integer, ByVal iVerifyMethod As Integer, _
ByVal iYear As Integer, ByVal iMonth As Integer, ByVal iDay As Integer)
lbRTShow.Items.Add("RTEvent OnAttTrasactionEx Has been Triggered,Verified OK")
lbRTShow.Items.Add("...UserID:" & sEnrollNumber)
lbRTShow.Items.Add("...isInvalid:" & iIsInValid.ToString())
lbRTShow.Items.Add("...attState:" & iAttState.ToString())
lbRTShow.Items.Add("...VerifyMethod:" & iVerifyMethod.ToString())
End Sub
этот код для запуска устройства сканирования отпечатков пальцев в реальном времени "
Первый вопрос
Как я узнаю, какое устройство вызвало это событие: это устройство 'axCZKEM1' или 'axCZKEM2'
когда я пытаюсь поставить 'Sender As Object' с параметром, выдает ошибку:
"не имеет подписи, совместимой с делегатом"
ДОПОЛНИТЕЛЬНЫЙ КОНЦЕРН
Я исследовал интернет на основе указателей, которые вы мне дали.
Первый: я уже успешно идентифицировал устройство отправителя с использованием класса Wrapper, и мой код показан ниже:
Imports zkemkeeper
Imports System
Imports System.Collections.Generic
Public Class myzkem
Public Property Name
Private WithEvents CZKEM As zkemkeeper.CZKEM
Public Event AttEventWrapper(SenderName As String, sEnrollNumber As String, iIsInValid As Integer, iAttState As Integer, iVerifyMethod As Integer, iYear As Integer, iMonth As Integer, iDay As Integer, iHour As Integer, iMinute As Integer, iSecond As Integer, iWorkcode As Integer)
Public Shared ListOfDevices As New Dictionary(Of String, zkemkeeper.CZKEM)
Public Sub New(WrapperName As String, CZKEMObject As zkemkeeper.CZKEM)
Me.Name = WrapperName
Me.CZKEM = CZKEMObject
End Sub
Private Sub HandleEvent(ByVal sEnrollNumber As String, ByVal iIsInValid As Integer, ByVal iAttState As Integer, ByVal iVerifyMethod As Integer, ByVal iYear As Integer, ByVal iMonth As Integer, ByVal iDay As Integer, ByVal iHour As Integer, ByVal iMinute As Integer, ByVal iSecond As Integer, ByVal iWorkCode As Integer) Handles CZKEM.OnAttTransactionEx
RaiseEvent AttEventWrapper(Me.Name, sEnrollNumber, iIsInValid, iAttState, iVerifyMethod, iYear, iMonth, iDay, iHour, iMinute, iSecond, iWorkCode)
End Sub
End Class
Примечание. Это класс, в который я вставил свой общий словарь [ListOfDevices].
ВТОРОЙ: я создал другой класс с функциями, содержащими мой объект CZKEM, добавлял и удалял коды обработчиков и коды соединений.
Imports zkemkeeper
Public Class ZKEMKEEPERClass
Public CZKEM2 As New zkemkeeper.CZKEM
Public NewKEM As myzkem
Public Function ZKEMAddHandler(iDevice As String, iIP As String, iPort As Integer) As Boolean
If CZKEM2.Connect_Net(iIP, 4370) Then
If CZKEM2.RegEvent(1, 65535) = True Then
NewKEM = New myzkem(iDevice, CZKEM2)
AddHandler NewKEM.AttEventWrapper, AddressOf LoginEvent_1
MsgBox(iDevice)
Return True
Else
Return False
End If
Else
Return False
End If
End Function
Public Function ZKEMRemoveHandler(iDevice As String, CZKEM As zkemkeeper.CZKEM)
NewKEM = New myzkem(iDevice, CZKEM)
RemoveHandler NewKEM.AttEventWrapper, AddressOf LoginEvent_1
MsgBox(iDevice)
End Function
Public Sub LoginEvent_1(ByVal SenderName As String, ByVal sEnrollNumber As String, ByVal iIsInValid As Integer, ByVal iAttState As Integer, ByVal iVerifyMethod As Integer, ByVal iYear As Integer, ByVal iMonth As Integer, ByVal iDay As Integer, ByVal iHour As Integer, ByVal iMinute As Integer, ByVal iSecond As Integer, ByVal iWorkCode As Integer)
MsgBox(SenderName)
End Sub
End Class
ТРЕТЬЕ: В моей основной программе я копирую [ZKEMKEEPERClass], чтобы создать несколько объектов, которые все активны одновременно.
Sub CONNECT()
Dim iIP As String
Dim iDevice As String
For x = 1 To 2
Select Case x
Case 1
iIP = "122.3.47.43"
iDevice = "Device 1"
Case 2
iIP = "192.168.10.201"
iDevice = "Device 2"
End Select
Dim NewConnect As New ZKEMKEEPERClass
If NewConnect.ZKEMAddHandler(iDevice, iIP, 4370) Then
MsgBox("success")
Else
MsgBox("failed")
End If
Next
End Sub
МОЯ НОВАЯ ПРОБЛЕМА: Я не могу удалить обработчик, так как не могу идентифицировать его из реплицируемых классов.
Дайте мне знать ваши идеи.
@AConfusedSimpleton
1 ответ
Я не знаком с этой конкретной библиотекой, но вот мои 2 цента:
Вы получаете несовместимую подпись, потому что событие, определенное в zkemkeeper.CZKEM, будет выглядеть примерно так:
Public event Ax_OnAttTransactionEx(sEnrollNumber As String, iIsInValid As Integer,_
iAttState As Integer, iVerifyMethod As Integer, iYear As Integer, iMonth As Integer,_
iDay As Integer)
Не определен аргумент "отправитель", и поэтому, если вы добавите его в свой обработчик, у вас будет несовместимая подпись.
Один из возможных способов узнать, какое устройство вызвало событие, - это определить ваш собственный класс-оболочку, который имеет свойство name (или как вы хотите его назвать) и определяет такое событие, как:
Public event MyWrapperEvent(SenderName As String, sEnrollNumber As String,_
iIsInValid As Integer, iAttState As Integer, iVerifyMethod As Integer,_
iYear As Integer, iMonth As Integer, iDay As Integer)
ваш класс-оболочка будет содержать ссылку на объект zkemkeeper.CZKEM
Private WithEvents MyCZKEMObject As zkemkeeper.CZKEM
и он будет обрабатывать это событие Ax_OnAttTransactionEx внутренне, просто вызывая его собственное событие, которое точно такое же, только с добавленным senderName. Тогда его обработчик будет выглядеть примерно так:
Private Sub HandleEvent(ByVal sEnrollNumber As String, ByVal iIsInValid As Integer,_
ByVal iAttState As Integer, ByVal iVerifyMethod As Integer, ByVal iYear As Integer,_
ByVal iMonth As Integer, ByVal iDay As Integer) handles MyCZKEMObject.OnAttTransactionEx
RaiseEvent MyWrapperEvent(Me.Name, sEnrollNumber, iIsInvalid, iAttState, iVerifyMethod, iYear, iMonth, iDay)
End Sub
Затем в основной программе вы можете создать объект своего класса-оболочки и обработать его событие MyWrapperEvent. Вы узнаете, какое устройство вызвало его, проверив свойство senderName. (Если, конечно, вы даете уникальное имя каждому устройству)
Обновить:
Ваша полная реализация класса-оболочки может выглядеть примерно так:
Public Class MyWrapperClass
Public Property Name
Private WithEvents MyCZKEMObject As zkemkeeper.CZKEM
Public Event MyWrapperEvent(SenderName As String, sEnrollNumber As String, iIsInValid As Integer, iAttState As Integer, iVerifyMethod As Integer, iYear As Integer, iMonth As Integer, iDay As Integer)
Public Sub New(WrapperName As String, CZKEMObject As Zkemkeeper.CZKEM)
Me.Name = WrapperName
Me.MyCZKEMObject = CZKEMObject
End Sub
Private Sub HandleEvent(ByVal sEnrollNumber As String, ByVal iIsInValid As Integer, ByVal iAttState As Integer, ByVal iVerifyMethod As Integer, ByVal iYear As Integer, ByVal iMonth As Integer, ByVal iDay As Integer) Handles MyCZKEMObject.OnAttTransactionEx
RaiseEvent MyWrapperEvent(Me.Name, sEnrollNumber, iIsInValid, iAttState, iVerifyMethod, iYear, iMonth, iDay)
End Sub
End Class
"Имя" - это просто свойство, объявленное в вашем классе-оболочке, которое вы используете для идентификации переданного ему объекта zkemkeeper.CZKEM. Когда ваш класс-оболочка обрабатывает событие Ax_OnAttTransactionEx этого объекта. Он просто вызывает собственное, очень похожее событие, но также передает его свойство Name, которое вы можете использовать для идентификации устройства.
Примечание. Передача "Name" вместо "Me.Name" работает отлично, это просто мое личное предпочтение использовать ключевое слово "я", поскольку я думаю, что это делает мой код более понятным.