【问题标题】:How to store object references that are kept after an unhandled error如何存储未处理错误后保留的对象引用
【发布时间】:2022-12-20 17:45:59
【问题描述】:

我正在尝试创建一个自定义类来处理所有组合框的事件,但我也希望组合框运行它们自己的事件处理程序。为此,我创建了一个新的自定义类,将所需的事件处理程序添加到自定义类中,并将我所有的组合框初始化到这个自定义类中。然后我将所有这些新的自定义对象存储在一个集合中。这很好用。每当组合框更新时,它都会运行自己的 OnUpdate 事件处理程序,然后是自定义类 OnUpdate 事件处理程序。

问题是一旦发生未处理的错误,集合就会被删除,这也意味着每个组合框不再是自定义类的成员。这意味着任何时候发生未处理的错误并且用户继续使用该应用程序时,只有组合框的处理程序运行。

即使在发生未处理的错误后,是否有办法存储这些对象引用?据我了解,我不能使用 tempvars,因为它只存储值而不是对象引用。

我的自定义类中的代码:

Option Compare Database
Private WithEvents mCmbo As ComboBox

Public Property Get Combo() As ComboBox
Set Combo = mCmbo
End Property

Public Property Set Combo(ByVal TheCombo As ComboBox)
Set mCmbo = TheCombo
End Property

Public Sub Initialize(TheCombo As ComboBox)
Set Me.Combo = TheCombo
Me.Combo.OnEnter = "[Event Procedure]"
Me.Combo.BeforeUpdate = "[Event Procedure]"
Me.Combo.AfterUpdate = "[Event Procedure]"
End Sub


'------------------------------------------------------ Trap Events --------------------------------------
Private Sub mCmbo_BeforeUpdate(Cancel As Integer)
MsgBox "Before update Trapped in custom class "
End Sub

Private Sub mCmbo_AfterUpdate()
MsgBox "After update Trapped in custom class."
End Sub

用于将我的组合框初始化到这个自定义类中的代码:

Private Sub Form_Load()
Dim ctrl As Control
'Assigning the custom class to the combo box
For Each ctrl In Forms!Form1.Controls
    If ctrl.ControlType = acComboBox Then
        Debug.Print ctrl.Name
        Set CC = New TestClass
        CC.Initialize ctrl
        ccCollection.Add CC
    End If
Next ctrl
End Sub

Private Sub Combo4_AfterUpdate()
MsgBox "Combo update event"
End Sub

Private Sub Combo4_BeforeUpdate(Cancel As Integer)
MsgBox "Combo BeforeUpdate event"
End Sub

我研究过 tempvars、数据库属性和隐藏形式,但我相信这些都不能存储对象变量。

【问题讨论】:

    标签: vba event-handling ms-access-2007


    【解决方案1】:

    没有。

    未处理的错误意味着出了问题,而程序员没有预料到会出错(否则他们应该添加错误处理程序),因此不应信任整个应用程序。 VBA 很奇怪,它允许用户继续未处理的错误,但未处理的错误真的不应在分发给用户的应用程序中发生,如果发生这种情况,应用程序最好关闭或重新启动(这确实发生在运行时版本的 Access 或已编译的数据库中)。

    当然,您应该做的是处理这些错误。如果您没有预料到错误,最常见的正确处理部分是记录错误,然后关闭应用程序。

    不幸的是,VBA 的一个限制是我们无法使用全局错误处理程序来处理任何其他未处理的异常,因此您必须将错误处理程序添加到直接从应用程序调用的每个函数中。仅由其他函数调用的函数可以在外部函数中处理它们的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-20
      • 2014-12-19
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      • 2013-08-29
      • 2018-02-20
      • 1970-01-01
      相关资源
      最近更新 更多