通过类访问控件/表单对象会导致重新初始化

时间:2012-02-29 16:17:12

标签: ms-access ms-access-2007

我有一个带有寄存器和几个子表单的主表单。我正在使用类模块,并在其中保存表单的名称,以便轻松访问它们。访问类的相应变量保存在模块中,并以表单(clsMod)设置(新)on_load。在第一次访问之前,我的主窗体调用一个函数来“初始化”类模块(initial_form)中的值,以使它们可访问。到目前为止,这就像一个魅力。

但是当我现在尝试访问该值时,f.e。使用clsMod.detailsControl或clsMod.detailsControl!fieldXy我的类模块再次初始化,从而丢失所有绑定的对象。我想我不允许这样使用控件/表格?没有错误,当然除了'对象变量,或者没有设置块变量',之后会发生。

Private m_ctldetailsControl As control

Public Sub initial_form()
  Set detailsControl = Forms!mainForm_ufoMainForm
End Sub

Public Property Get detailsControl() As control
  Set detailsControl = m_ctldetailsControl
End Property

Public Property Set detailsControl(ctlDetailsControl As control)
  Set m_ctldetailsControl = ctlDetailsControl
End Property

我把它缩小到这样一个事实,即当我从'outside'访问控制对象时,类模块再次被初始化(我在Class_Initialize()中放了一个时间戳,并且可以看到何时有新的初始化),我只是不知道为什么。当我使用Form-Objects而不是Control-Objects时也会发生同样的情况。

我可以消除我的代码重置类模块,因为它只在加载过程中设置一次(设置clsMod = new clsModification)。该类中的其他所有内容都可以正常工作,我可以从类内部访问该属性,而无需重新初始化。

任何有关此主题的想法或进一步阅读都将非常感激,因为任何其他细节只是问!

一些补充:

  • 类变量位于模块中的“public clsMod As clsModuleXy”
  • 它在我的表单的onLoad事件中设置(设置clsMod = new clsModuleXy)
  • set-property工作正常(如上所述)
  • get property在class-module中正常工作(如上所述)
  • 当我在类模块之外使用get属性时,会发生一个新的实例化(如果我将一个本地控件/表单设置为该属性或想要访问一个字段)

1 个答案:

答案 0 :(得分:2)

我猜测罪魁祸首就是你声明了这个类模块As New的一个实例。我显然不知道你的代码的其余部分是什么样的,但我想整个过程都是这样的:

  1. 此对象的实例声明为As New(即Dim clsMod As New initial_form)。
  2. 在创建新实例(clsMod)时运行Class_Initialize()过程。
  3. 某些东西导致该对象的此实例(clsMod)超出范围。
  4. VBA垃圾收集器清理不再使用的此对象实例(clsMod)。
  5. 清除实例(clsMod)时运行Class_Terminate()过程。
  6. 您尝试访问clsMod。该变量是Nothing因为GC清理了它。但是,您声明了As New,因此创建了initial_form的全新实例并将其分配给对象变量clsMod
  7. Class_Initialize()过程再次为此全新实例运行。
  8. 没有看到你的其余代码,我不能肯定这是问题所在。但根据你发布的症状,这可以解释这种行为。