vba - VBA 对象实例如何判断它是否是默认实例?

标签 vba

这不起作用:

clsTestDefaultInstance

Dim HowAmIInitialised As Integer

Private Sub Class_Initialize()
HowAmIInitialised = 99
End Sub
Public Sub CallMe()
  Debug.Print "HowAmIInitialised=" & HowAmIInitialised
End Sub

clsTestDefaultInstance.CallMe()输出 HowAmIInitialised=99因为 Class_Initialize()甚至为默认实例调用。
VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = "clsTestDefaultInstance"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Compare Database
Option Explicit

' test how class instance can tell if it is default
'clsTestDefaultInstance

Dim HowAmIInitialised As Integer

Private Sub Class_Initialize()
  HowAmIInitialised = HowAmIInitialised + 1
End Sub

Public Sub CallMe()
  Debug.Print "HowAmIInitialised=" & HowAmIInitialised
End Sub

最佳答案

这真的非常简单……只需将实例的对象指针与默认实例的对象指针进行比较:

'TestClass.cls (VB_PredeclaredId = True)
Option Explicit

Public Property Get IsDefaultInstance() As Boolean
    IsDefaultInstance = ObjPtr(TestClass) = ObjPtr(Me)
End Property

测试代码表明它工作得很好:
Private Sub TestDefaultInstance()
    Dim foo(9) As TestClass

    Dim idx As Long
    For idx = LBound(foo) To UBound(foo)
        If idx = 5 Then
            Set foo(idx) = TestClass
        Else
            Set foo(idx) = New TestClass
        End If
    Next

    For idx = LBound(foo) To UBound(foo)
        Debug.Print idx & foo(idx).IsDefaultInstance
    Next
End Sub

话虽如此,请注意这有几个警告:
  • 如果您检查是否有任何实例是默认实例,它几乎可以保证默认实例将被重新实例化,因为您可能知道,如果它尚未实例化,只需引用默认实例即可将其备份。
  • 默认实例可以改如果您 Unload它(用于 UserForm 的)或将其设置为 Nothing然后使其再次自动实例化。最好想想VB_PredeclaredId就像契约(Contract)一样,如果您直接使用类名,您将始终获得一个实例。那个契约(Contract)保证它永远是同一个。在TestDefaultInstance底部添加以下代码上述程序将证明:
    'This doesn't effect anything that stored a reference to it.
    Set TestClass = Nothing
    'Make a call on the default to force it to reinstantiate.
    Debug.Print TestClass.IsDefaultInstance
    'This will now be false.
    Debug.Print foo(5).IsDefaultInstance
    
  • 关于vba - VBA 对象实例如何判断它是否是默认实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52909408/

    相关文章:

    sql - 使用 ADODB Recordset 更新记录

    excel - EXCEL 的自定义 VBA 函数中的用户定义警告

    vba - 无法滚动网页的分屏

    vba - 在VB中连接字符串和整数

    vba - 如何停止在VBA中使用ShellExecute命令创建的正在运行的任务

    vba - 当我单步执行时,我的 vba 循环会拉回所有正确的数据,但当我运行宏时,它不会

    excel - VBA 数据类型 "Byte"在什么情况下有用?

    VBA Excel 编译错误 : Expected: end of statement caused by "("

    vba - 我可以在哪里保存用户输入的设置?

    excel - 无法将项目添加到vba excel中的组合框(表单控件)