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

Может быть, вы должны переосмыслить свой необходимый код.

Другие вопросы по тегам