Идентифицировать отправителя из события 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" работает отлично, это просто мое личное предпочтение использовать ключевое слово "я", поскольку я думаю, что это делает мой код более понятным.

Другие вопросы по тегам