0

我正在尝试编写一个简单的日历来选择日期。我有一个 PushButtons 数组,现在我正在尝试以编程方式添加事件处理程序。

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 运算符的使用无效

4

2 回答 2

1

您当然可以在 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
于 2018-08-17T11:51:18.787 回答
-1

这在 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

也许你应该重新考虑你需要的代码。

于 2018-08-17T04:38:04.743 回答