【问题标题】:identify sender from OnAttendance event in zkemkeeper vb.net从 zkemkeeper vb.net 中的 OnAttendance 事件中识别发件人
【发布时间】:2019-04-24 03:11:19
【问题描述】:
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”

当我尝试将“发送者作为对象”与参数一起输入时,会出现错误:

"没有与委托兼容的签名"

其他问题

我根据你给我的建议研究了互联网。

第一: 我已经使用 Wrapper Class 成功识别了 Sender Device,我的代码如下所示:

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

【问题讨论】:

    标签: vb.net zkemkeeper


    【解决方案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',因此如果你将它添加到你的处理程序,你将有一个不兼容的签名。

    了解哪个设备引发事件的一种可能方法是定义您自己的包装类,该类具有属性“名称”(或您想调用的任何名称)并定义如下事件:

    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' 而不是 'Me.Name' 效果很好,使用关键字 'me' 只是我个人的偏好,因为我认为它可以让我的代码更清晰

    【讨论】:

    • 我一定会研究你给我的这些东西。我会尽快给你反馈。非常感谢@AConfusedSimpleton:D
    • 我只是不知道应该从哪里获得 Me.Name:'RaiseEvent MyWrapperEvent(Me.Name, sEnrollNumber, iIsInvalid, iAttState, iVerifyMethod, iYear, iMonth, iDay)'你能帮我吗? @AConfusedSimpleton
    • 你能给我一个如何使用包装类(MyWrapperEvent)的例子吗?我在这里有点无能为力:D
    • 当我看到你如何创建包装类 Lols 时,我才意识到我是多么的菜鸟。我搜索了它背后的逻辑,发现在我的其他项目中非常有用。现在,我只需要如何在我的主程序中使用这个类。你能给我看一个与上面代码相​​关的例子吗?非常感谢@AConfusedSimpleton。
    • 我想我知道如何使用包装类。现在我的问题是如何在循环中创建多个 zkemkeeper.CZKEM 公共对象大声笑。你真的是我的天使@AConfusedSimpleton。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    • 2021-06-25
    相关资源
    最近更新 更多