能否在VBA编辑器的本地窗口、监视窗口中隐藏自定义类对象的指定属性?
VBA自定义类私有属性调试窗口隐藏方案
VBA编辑器原生没有提供隐藏类成员属性的设置项,本地窗口、监视窗口默认会展示类实例的所有成员变量(包括Private修饰的私有属性),没有直接的标记可以让指定属性不被展示,但可以通过以下两个实用技巧实现同类效果:
- 技巧1:将内部辅助属性迁移到独立标准模块存储
原理是标准模块内的私有变量不会出现在类实例的调试视图中,你可以通过类实例的唯一指针值关联对应辅助属性,实现逻辑:- 类初始化时调用
ObjPtr(Me)生成当前实例的唯一ID,保存在类的私有变量中 - 在单独的标准模块中用嵌套的
Scripting.Dictionary存储所有类实例的辅助属性,外层键为实例ID,内层键为辅助属性名 - 类内部需要读写辅助属性时,调用标准模块暴露的读写方法,传入当前实例ID和属性名操作即可
- 类销毁时调用标准模块的清理方法删除对应实例的所有辅助属性,避免内存泄漏
代码示例:
类模块(示例名为MyCustomClass)代码:
配套标准模块代码:Private m_InstanceId As Long ' 仅保留需要在调试时查看的属性在类内部定义 Private m_UsefulBizProp As String Private Sub Class_Initialize() m_InstanceId = ObjPtr(Me) ' 初始化辅助属性 SetInternalProp m_InstanceId, "tempCalcCounter", 0 SetInternalProp m_InstanceId, "cachedTempValue", Empty End Sub Private Sub Class_Terminate() ClearInstanceInternalProps m_InstanceId End Sub ' 业务属性正常定义 Public Property Get UsefulBizProp() As String UsefulBizProp = m_UsefulBizProp End PropertyPrivate m_InternalPropStore As Object Private Sub InitStore() If m_InternalPropStore Is Nothing Then Set m_InternalPropStore = CreateObject("Scripting.Dictionary") End If End Sub Public Sub SetInternalProp(instanceId As Long, propName As String, propValue As Variant) InitStore If Not m_InternalPropStore.Exists(instanceId) Then Set m_InternalPropStore(instanceId) = CreateObject("Scripting.Dictionary") End If m_InternalPropStore(instanceId)(propName) = propValue End Sub Public Function GetInternalProp(instanceId As Long, propName As String) As Variant InitStore If m_InternalPropStore.Exists(instanceId) And m_InternalPropStore(instanceId).Exists(propName) Then GetInternalProp = m_InternalPropStore(instanceId)(propName) End If End Function Public Sub ClearInstanceInternalProps(instanceId As Long) InitStore If m_InternalPropStore.Exists(instanceId) Then m_InternalPropStore.Remove instanceId End If End Sub - 类初始化时调用
- 技巧2:自定义调试信息输出方法
给类新增一个公开的调试信息输出方法,仅拼接你需要查看的属性值,调试时不需要展开类实例,直接调用该方法获取信息即可,不会被冗余属性干扰。
示例代码(加在自定义类内部):
使用时在立即窗口输入Public Function GetDebugInfo() As String GetDebugInfo = "核心业务属性:" & m_UsefulBizProp & vbCrLf & _ "临时计数器值:" & GetInternalProp(m_InstanceId, "tempCalcCounter") End Function? yourClassInstance.GetDebugInfo即可直接查看所需的所有调试信息。
内容的提问来源于stack exchange,提问作者JDCAce
相关产品推荐
相关产品推荐

