идентифицировать отправителя по событию OnAttendance в zkemkeeper vb.net

#vb.net #zkemkeeper

#vb.net #zkemkeeper

Вопрос:

 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:" amp; sEnrollNumber)
    lbRTShow.Items.Add("...isInvalid:" amp; iIsInValid.ToString())
    lbRTShow.Items.Add("...attState:" amp; iAttState.ToString())
    lbRTShow.Items.Add("...VerifyMethod:" amp; iVerifyMethod.ToString())

End Sub
  

этот код для запуска устройства отпечатков пальцев в режиме реального времени’

Первый вопрос

Как я узнаю, какое устройство вызвало это событие: это устройство ‘axCZKEM1’ или ‘axCZKEM2’

когда я пытаюсь указать ‘отправитель как объект’ с параметром, выдает ошибку :

«не имеет подписи, совместимой с делегатом»

ДОПОЛНИТЕЛЬНАЯ ПРОБЛЕМА

Я исследовал Интернет, основываясь на указателях, которые вы мне дали.

ВО-первых: я уже успешно идентифицирую устройство-отправитель с использованием класса-оболочки, и мой код выглядит так, как показано ниже:

 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)
  

Аргумент ‘sender’ не определен, и поэтому, если вы добавите его в свой обработчик, у вас будет несовместимая подпись.

Одним из возможных способов узнать, какое устройство вызвало событие, было бы определить свой собственный класс-оболочку, который имеет свойство ‘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», поскольку я думаю, что это делает мой код более понятным

Комментарии:

1. Я определенно собираюсь изучить эти вещи, которые вы мне дали. Я скоро дам вам отзыв. Большое вам спасибо @AConfusedSimpleton:D

2. Я просто не знаю, где я должен получить Me.Name : ‘Вызвать событие MyWrapperEvent(Me.Name , sEnrollNumber, iIsInvalid, iAttState, iVerifyMethod, iYear, iMonth, iDay)’ Можете ли вы помочь мне с этим? @AConfusedSimpleton

3. Можете ли вы привести мне пример того, как использовать класс-оболочку (MyWrapperEvent)? Я здесь немного невежественен: D

4. Я только что понял, насколько я новичок, когда увидел, как вы создали класс-оболочку Lols. Я искал логику, стоящую за этим, и понял, что это очень полезно в других моих проектах. Теперь мне просто нужно, как использовать этот класс в моей основной программе. Можете ли вы показать мне пример по отношению к приведенному выше коду? Большое вам спасибо @AConfusedSimpleton.

5. Я думаю, я понял, как использовать класс-оболочку. Теперь моя проблема в том, как я могу создать несколько zkemkeeper. CZKEM общедоступные объекты в цикле Lol. Ты действительно ангел для меня @AConfusedSimpleton.