Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 动态创建控件的事件处理程序导致Access VBA崩溃_Ms Access_Vba - Fatal编程技术网

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

Ms access 动态创建控件的事件处理程序导致Access VBA崩溃,ms-access,vba,Ms Access,Vba,我有一个表单,在其中我创建了一些复选框。这些复选框是动态创建的,用户每次打开表单时,它们的编号可能不相同。尽管我的事件侦听器完全按照我想要的方式工作,但当我按下“X”按钮关闭表单时,MS Access崩溃。它没有挂起,它崩溃了。我尝试过反编译和重新编译,我也尝试过其他步骤,但都没有解决问题。当我注释负责事件处理程序的代码行时,崩溃停止 下面是我的班级模块的代码。类模块的名称为EventClass Option Compare Database Public WithEvents ct As Ac

我有一个表单,在其中我创建了一些复选框。这些复选框是动态创建的,用户每次打开表单时,它们的编号可能不相同。尽管我的事件侦听器完全按照我想要的方式工作,但当我按下“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
下面是生成复选框的代码(它属于另一个窗体,在创建控件之前,关闭,,导致问题的窗体显示):

碰撞信息:

问题签名:

问题事件名称:APPCRASH

应用程序名称:MSACCESS.EXE

应用程序版本:15.0.4665.1000

应用程序时间戳:54339a95

故障模块名称:MSACCESS.EXE

故障模块版本:15.0.4665.1000

故障模块时间戳:54339a95

异常代码:c0000005

异常偏移量:0000000000 3796F5

操作系统版本:6.1.7601.2.1.0.256.48

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

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

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


碰撞停止。

您有两种表格吗?一个是动态控件(test),另一个是添加监听器(其代码如上所示)?因为你只说表单,所以我不知道哪个表单的关闭导致了崩溃。如果有两种形式,请在问题中列出它们。如果这都是一个表单,请添加创建复选框的代码。第一段代码是类模块。第二段代码是导致崩溃的表单。@pteranodon我添加了生成复选框的代码。希望它能有所帮助。顺便说一句,谢谢您的时间。
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"
Private Sub CloseButton_Click()
    DoCmd.Close
End Sub