идентифицировать отправителя из события OnAttendance в zkemkeeper vb.net - PullRequest
0 голосов
/ 24 апреля 2019
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 Ответ

0 голосов
/ 24 апреля 2019

Я не знаком с этой конкретной библиотекой, но вот мои 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

'Name' - это просто свойство, объявленное в вашем классе-обёртке, которое вы используете для идентификации объекта zkemkeeper.CZKEM, который вы ему передаете.Когда ваш класс-оболочка обрабатывает событие Ax_OnAttTransactionEx этого объекта.Он просто вызывает свое собственное, очень похожее событие, но также передает свое свойство Name, которое вы можете использовать для идентификации устройства.

Примечание: Передача «Name» вместо «Me.Name» работает отлично, я просто предпочитаю использовать ключевое слово «me», так как я думаю, что он сохраняет мой код болееясно

...