System.Object и System.EventArgs
Я пытаюсь написать простой календарь для выбора дат. У меня есть массив кнопок, и сейчас я пытаюсь программно добавить обработчики событий.
Public Sub Initialize()
If EventID = 0 Then
GetEmployeeData
EventType = "Attendance"
Else
GetEventData
End If
Dim Days
Days = Array(Sunday0, Monday0, Tuesday0, Wednesday0, Thursday0, Friday0, Saturday0, _
Sunday1, Monday1, Tuesday1, Wednesday1, Thursday1, Friday1, Saturday1, _
Sunday2, Monday2, Tuesday2, Wednesday2, Thursday2, Friday2, Saturday2, _
Sunday3, Monday3, Tuesday3, Wednesday3, Thursday3, Friday3, Saturday3, _
Sunday4, Monday4, Tuesday4, Wednesday4, Thursday4, Friday4, Saturday4, _
Sunday5, Monday5, Tuesday5, Wednesday5, Thursday5, Friday5, Saturday5)
Dim j As Long
For j = 0 To 41
AddHandler Days(j).Click, AddressOf Calendar_Click
Next j
End Sub
Public Sub Calendar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim CalendarDay As Integer
CalendarDay = Convert.Int32(sender.Caption)
MsgBox (CalendarDay)
End Sub
Тем не менее, когда я пытаюсь запустить форму, я получаю сообщение об ошибке чтения
Ошибка компиляции: пользовательский тип не определен.
Обновить
Я изменил подпись обработчика событий на это:
Public Sub Calendar_Click(ByVal sender As Object)
но теперь я получаю следующую ошибку:
Ошибка компиляции: неверное использование оператора AddressOf
2 ответа
Конечно, вы можете использовать динамические обработчики событий в Access. Но каждый объект должен иметь свой собственный обработчик событий.
Вы можете использовать отдельный класс для каждой кнопки и класс для управления кнопками и событиями.
Вы можете использовать следующий код:
clsCalendar (класс, который создает обработчики событий и получает события обратно)
Dim collButtonHandlers As Collection
Public Sub Initialize()
Dim Days
Days = Array(Sunday0, Monday0, Tuesday0, Wednesday0, Thursday0, Friday0, Saturday0, _
Sunday1, Monday1, Tuesday1, Wednesday1, Thursday1, Friday1, Saturday1, _
Sunday2, Monday2, Tuesday2, Wednesday2, Thursday2, Friday2, Saturday2, _
Sunday3, Monday3, Tuesday3, Wednesday3, Thursday3, Friday3, Saturday3, _
Sunday4, Monday4, Tuesday4, Wednesday4, Thursday4, Friday4, Saturday4, _
Sunday5, Monday5, Tuesday5, Wednesday5, Thursday5, Friday5, Saturday5)
'I assume that array is now filled with command buttons
'Consider taking the array as input from a form
Dim j As Long
For j = 0 To 41
AddButtonHandler Days(j)
Next j
End Sub
Public Sub AddButtonHandler(btn As Access.CommandButton)
Dim ButtonHandler As New clsCalendarButtonHandler
ButtonHandler.Initialize btn, Me
collButtonHandlers.Add ButtonHandler
End Sub
Public Sub Calendar_Click(btn As Access.CommandButton)
Dim CalendarDay As Integer
CalendarDay = CLng(btn.Caption)
MsgBox (CalendarDay)
End Sub
clsCalendarButtonHandler (класс, который управляет одним событием кнопки и передает его обратно в управляющий класс):
Dim cCalendar As clsCalendar
Dim btn As Access.CommandButton
Public Sub Initialize(cmdBtn As Access.CommandButton, Calendar As clsCalendar)
Set cCalendar = Calendar
Set btn = cmdBtn
btn.OnClick = "[Event Procedure]"
End Sub
Private Sub btn_Click()
cCalendar.Calendar_Click(btn)
End Sub
Это невозможно в Access 2016. Обработчики существуют в VB.Net, но отсутствуют в Access VBA. Я могу думать только о чем-то подобном. Но если это имеет смысл, это другой вопрос:
Public Sub MyEventSelection(Day As String)
Select Case Day
Case "Sunday0"
Call Sunday0()
Case "Monday0"
Call Monday0()
'And so on...
End Select
End Sub
Public Sub Sunday0()
'Do Stuff
End Sub
Public Sub Monday0()
'Do Stuff
End Sub
Может быть, вы должны переосмыслить свой необходимый код.