【发布时间】:2017-09-20 17:59:54
【问题描述】:
我正在开发一个在 MS Access VBA 中跟踪执行路径的应用程序。但是,我遇到了一个问题。似乎您可以在 VBA 中动态分配处理程序来控制 OnClick 和其他此类事件,但我看不到从这些控件中读取事件的方法。例如:
With Forms("Order Entry").Controls("OK")
If .OnClick = "" Then
.OnClick = "fnProcessOrder"
End If
End With
这会将函数“fnProcessOrder”动态分配给“确定”按钮。但是,如果您尝试获取该按钮的值,则会得到:
With Forms("Order Entry").Controls("OK")
Debug.Print "My Handler -->" + .OnClick
EndWith
结果:
--> [Event Procedure]
没有进一步的细节。这似乎是微软在此处所述的行为: https://msdn.microsoft.com/en-us/vba/access-vba/articles/commandbutton-onclick-property-access
但我想知道是否还有比这更进一步的方法。
我原以为这些信息会出现在 MSysObjects 和 MSysQueries 表中,但我在那里看不到它。我尝试使用 Database Documenter 提取我的测试数据库,并且我也从生成的文档中获得了该值。
有没有办法找到分配给控件的 VBA 函数?
【问题讨论】:
-
任何工具都会有限制。考虑
"fnProcessOrder"字符串文字将从部分连接起来的情况,例如.OnClick = "fnProcess" & itemType。 FWIW 我很好奇你在执行路径上的工作,以及你是怎么做的。 Rubberduck 可以在这里使用您的专业知识,因为即将实施的最大挑战之一将是实施我们打算实施的 20 多个“代码路径分析”代码检查。你是在没有符号表和抽象语法树的情况下这样做的吗? -
好吧,我打算做一些基本的处理,或者使用 pyparsing、lex 或者其他一些手动的东西。所以,肯定会有一个符号树,我已经开始构建它了。无法读取 .OnClick 属性会导致其他所有问题。我希望我不必编写任何东西来解析二进制文件...
-
实际分配的值可能不可读或不可逆(例如指向函数的内存指针或内部句柄)。在 OK 按钮旁边添加一个不可见的文本控件,并且每当您动态更改 OnClick 时,也要更新该控件。或者有一个固定的 OnClick 函数,然后读取该文本字段并相应地重定向。
-
我已经在 Rubberduck 上工作了 3 年的大部分时间,我们的解析器/解析器已经看到了 5 个主要贡献者,我可以向您保证,任何手动操作都注定要失败(对不起!) .行继续,行号/标签,预编译器指令,特殊语法,从函数调用告诉数组访问 - 任何“基本”的东西都将是一个天真的解决方案,除了琐碎的代码和测试用例之外,它会无可救药地崩溃。我保证,你所从事的工作绝非易事。也就是说,我确信有一种方法可以获得按钮的实际
OnClick值(Rubberduck 需要它!) -
我认为我们的一位贡献者一直在努力解决这个问题 - 我会联系他。很确定它确实涉及解析二进制文件。你是用 VBA 写的吗?