动态创建控件的事件处理程序会导致Access VBA崩溃

时间:2014-12-31 13:49:06

标签: access-vba

我有一个表格,我在其中创建了一些复选框。这些复选框是动态创建的,每次用户打开表单时,它们的编号可能不同。虽然我的事件监听器完全按照我想要的方式工作,但当我按“X”按钮关闭表单时,MS Access崩溃了。它没有挂起,它崩溃了。我已经尝试过反编译和重新编译,我也尝试了其他步骤,但没有解决问题。当我评论负责事件处理程序的代码行时,崩溃停止。

以下是我的课程模块的代码。类模块的名称是EventClass。

Option Compare Database
Public WithEvents ct As Access.CheckBox

Public Sub ct_Click()
    MsgBox ct.Name & "pressed"
End Sub

以下是表格的代码:

Option Compare Database
Private listenerCollection As New Collection

Private Sub Form_Load()
    DoCmd.SetWarnings False
    Dim listener As EventClass
    For Each ctrl In Forms("test").TestTab.Pages(0).Controls
      If (TypeName(ctrl) = "CheckBox") Then
         'the created checkboxes should not be checked by default
         ctrl.Value = 0

         Set listener = New EventClass
         Set listener.ct = ctrl
         listener.ct.OnClick = "[Event Procedure]"
         listenerCollection.Add listener
      End If
   Next

End Sub

以下是制作复选框的代码(它属于另一种形式,在制作控件之前关闭并且导致问题的表单出现):

DoCmd.Close

DoCmd.OpenForm "test", acDesign, , , acFormEdit, acHidden

'delete the previously created controls
again:

For Each ctrl In Forms("test").TestTab.Pages(0).Controls
    DeleteControl "test", ctrl.Name
Next

'ensure that all the controls have been deleted
If (Forms("test").TestTab.Pages(0).Controls.Count > 0) Then GoTo again

Dim q As CheckBox
Dim usr As Label
Dim db As Database
Dim rs As Recordset
Top_ = 500
Left_ = 1000

'create new controls
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT USERNAME FROM T_USERS", dbOpenSnapshot)
With rs
    Do While Not .EOF
        Set usr = CreateControl("test", acLabel, acDetail, "Page1", , 0, Top_, 1100, 1000)
        usr.Caption = rs.Fields("USERNAME")
        Set q = CreateControl("test", acCheckBox, acDetail, "Page1", , 1500, Top_, 200, 200)

        Top_ = Top_ + 500
        Set q = Nothing
        Set usr = Nothing
        .MoveNext
    Loop
    .Close
End With
Set rs = Nothing
Set db = Nothing

'and here,the form which causes the problem shows up
DoCmd.OpenForm "test"

崩溃信息:

问题签名:

问题事件名称:APPCRASH

应用程序名称:MSACCESS.EXE

应用版本:15.0.4665.1000

申请时间戳:54339a95

故障模块名称:MSACCESS.EXE

故障模块版本:15.0.4665.1000

故障模块时间戳:54339a95

例外代码:c0000005

异常偏移:00000000003796f5

操作系统版本:6.1.7601.2.1.0.256.48

有时,应用程序事件名称显示为BEX64

这个问题已经开始让我非常沮丧,因为在我搜索的任何地方都没有适当的解决方案。 代码反编译不起作用,DEP关闭不起作用,vba编辑器中的引用是可以的。 我真的不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

我实际上没有设法解决问题,但似乎它与表单的“X”按钮有关。 所以我做了以下。我禁用了X按钮并在表单中插入了一个自定义按钮。 下面你可以看到它的“_Click”子。

Private Sub CloseButton_Click()
    DoCmd.Close
End Sub

崩溃停止了。