access的类模块?

thllv 2010-04-12 04:02:42
在vba里定义了一个类模块,初始化及调用都正常
最后 “Set m_窗体 = Nothing ” ‘m_窗体 是类的实例

Private Sub Class_terminate() 这个销毁函数并没有被调用?什么原因啊?
...全文
194 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ewang11 2010-04-13
  • 打赏
  • 举报
回复
没完整代码很难判断那里还有问题


Private Sub Class_Terminate()
set dc_1=nothing
End Sub

Set m_窗体 = Nothing

执行上面代码按理能销毁dc_1
thllv 2010-04-12
  • 打赏
  • 举报
回复
我分析可能是类本身生成的对象没有释放造成的

在我的类模块中:
定义有类的公共变量的“dc_1”,作为类实例和外部交换数据用
(没有采用Public Property Set 的定义方式)

Public dc_1 As Object
在“Private Sub Class_initialize()”里
Set dc_1 = CreateObject("Scripting.Dictionary")
...

在另外一个窗体中实例化:Private m_窗体 As New 类_窗体
在窗体关闭时“Set m_窗体 = Nothing”
这时“dc_1”并没有显式释放

我想要的是:
1.当“Set m_窗体 = Nothing”时vb去自动销毁类本身生成的对象
2.或者我在Private Sub Class_Terminate()中手动销毁
(我运行的情况是:如果dc_1没有销毁,类的销毁函数就不调用),有点郁闷,可能还要自己加一个专门销毁类生成的对象函数。

vba的内存管理有时觉得很奇怪,昨天就有一个错误,一个对象没有销毁(不是OLE),程序运行都正常但access自己的进程退出不了,加一句Set obj = Nothing 就好了。

有些情况不加Set obj = Nothing 也没有如何问题。

有点疑惑:set object=nothing 这样的语句在什么情况下是必须的?

ACMAIN_CHM 2010-04-12
  • 打赏
  • 举报
回复
你的类是如何定义的?
ewang11 2010-04-12
  • 打赏
  • 举报
回复
可以调用

类模块:
'类名称为: clsTest
Private strUserName As String

Public Property Let UserName(ByVal UserName As String)
strUserName = UserName
End Property
Public Property Get UserName() As String
UserName = strUserName
End Property

Private Sub Class_Initialize()
strUserName = "ewang11"

End Sub

Private Sub Class_Terminate()
MsgBox "类已被Terminate"
End Sub


窗体代码

Dim a As New clsTest

Private Sub Command0_Click()
MsgBox a.UserName
End Sub


Private Sub Command1_Click()
Set a = Nothing '销毁类,会触发Terminate事件
End Sub

7,713

社区成员

发帖
与我相关
我的任务
社区描述
Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点。
社区管理员
  • Access
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧