动态加载引用后如何保存全局变量值?
Posted
技术标签:
【中文标题】动态加载引用后如何保存全局变量值?【英文标题】:How can I save a global variable value after dynamically loading a reference? 【发布时间】:2011-08-17 13:12:29 【问题描述】:我有一个 Access 2003 数据库,它将动态加载 MDB 数据库作为库引用。原因是该数据库是 60 多个应用程序数据库的菜单前端。菜单前端不会处理永久引用所有这些数据库,而是会在用户进行选择时动态引用所需的内容。我正在努力将此数据库移至 Access 2010 并创建自定义功能区。我开始使用here 中的技术在功能区加载时将功能区对象捕获到全局变量中。然后我遇到了一个问题,我可以验证代码正在运行并且全局变量被正确分配给功能区引用,但是在数据库运行它的启动例程之后,该全局变量将被重置为 Nothing。
为了验证发生了什么,我创建了一个简单的数据库进行测试。在这个数据库中,我有一个带有全局变量的模块:
Public obj as Object
然后我有一个这样的功能:
Public Function SetObj()
Set obj = Application
Debug.Print "IsNothing=" & (obj Is Nothing)
References.AddFromFile "Test.mdb"
Debug.Print "IsNothing=" & (obj Is Nothing)
End Function
显然,在我的代码中,“Test.mdb”指的是一个实际文件。如果我运行这段代码,Debug.Print 会给我两个实例的“IsNothing=False”,但是在函数完成后,如果我等待几秒钟,Debug.Print 会给我“IsNothing=True”。如果我注释掉 References.AddFromFile,无论我等待多长时间,Debug.Print 都会给我“IsNothing=False”。
这对我来说很有意义,因为 Access 必须在加载库后重新编译 VBA 代码,所以所有全局变量都被重置。我已经尝试将全局变量移动到一个类中,但是由于我需要一个全局变量来为这个类设置一个全局变量,然后这个类变量会被重置。我尝试在函数中使用局部变量来保存全局变量的值,但看起来 Access 在代码完成运行后等待几秒钟进行重新编译,所以这也不起作用。有没有人有任何其他想法来实现这一点?
【问题讨论】:
我相信它对用户更友好,并带来“无缝”体验。它还使在数据库之间共享信息变得更加容易。例如,我有一个报表表单,可以运行来自任何数据库的任何报表。如果数据库位于单独的实例中,则他们无法看到报告表单中的选择。我现在的目标是在 Access 2010 中处理自定义功能区。由于不再可以使用 CommandBars(感谢 Microsoft!)并且没有编程方式来获取功能区引用,因此我需要将功能区对象保存在全局变量中. 【参考方案1】:我真的不知道这是否会解决这种引用的问题,但一般来说,我不会为这种事情使用公共变量,而是在你的函数中使用一个 STATIC 变量。应该是这样的:
Public Function SetObj() As Object
Static obj As Object
If (obj Is Nothing) Then
Set obj = Application
End If
Set SetObj = obj
End Function
然后您只需使用 SetObj 作为对象来使用您的应用程序。在生产应用程序中,您也需要拆卸代码,但我在这里省略了。
我怀疑这是否有帮助,但您的代码让我觉得效率低下且不完整。
【讨论】:
我确实尝试过使用静态变量,但它也会被重置。另外,我确实将您的方法用于其他场景,但是对于保存功能区引用的最终目标,我只有一次机会捕获它,如果价值丢失,就无法重新捕获它。【参考方案2】:我找到了解决问题的方法,感谢@David-W-Fenton,因为您的回答给了我这个想法。我在库数据库中使用您的方法来缓存存储在表中但在初始启动后不会更改的经常访问的值。每次引用更改时,这些值都不会丢失,那是灯泡亮起的时候。
解决方案是将全局变量放在库数据库中。 Access 似乎只是在将引用加载到的数据库中重置全局变量——考虑到这一点,这是有道理的。因此,由于库数据库不是被重新编译的,它不会重置它的全局(或私有或静态)变量。
我最终做的是在现有图书馆数据库中创建一个新模块。它有一个私有变量和两种方法——一种设置变量,一种检索变量值。在我的菜单前端数据库中,当功能区加载并调用我的回调函数时,我没有将功能区对象保存在前端数据库中,而是将其传递给此模块进行保存。现在,无论何时将新数据库即时添加到库引用中,我都不会丢失该功能区引用。
【讨论】:
以上是关于动态加载引用后如何保存全局变量值?的主要内容,如果未能解决你的问题,请参考以下文章