这不起作用:
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/