#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.