访问卸载的MS-Access表单的Tag属性

时间:2016-11-10 17:47:19

标签: vba ms-access

我对MS-Access& amp; VBA编程。我在MS-Access 2016和VBA中开发了一个多用户应用程序并转换为accdb。

我需要获取存储在我创建的每个表单的Tag属性中的值。表单未加载,但我需要从模块中获取值,其中应用程序的超级用户可以授予/删除用户对任何特定表单的访问权限。现在我正在使用表单的名称,但是表单的名称没有提供我可以存储在Tag属性中的相同级别的详细信息。

有没有办法可以访问/获取卸载表单的Tag属性值?

1 个答案:

答案 0 :(得分:2)

  

免责声明:我根本不熟悉MS-Access。

表单本质上是一个类模块,类模块只是对象的“蓝图” - 它是类型

当您与表单进行交互时,您实际上正在与该表单的实例进行交互 - 对象。即使您不自己创建实例(使用New关键字)也是如此,因为表单具有特殊属性(如果导出模块并在您喜欢的文本编辑器中查看它,则可以看到), VB_PredeclaredId,设置为True - 这使得VBA为您创建一个全局/默认实例,一个以类型命名的对象

因此,当您分配MyAwesomeForm.Tag时,您正在使用默认实例 - 对象,而不是类型。这可能令人困惑,因为VBA将对象命名为与类型完全相同。

因为实例是全局的,并且由VBA管理,所以你可以这样做:

MyAwesomeForm.Tag = "ABC"
Unload MyAwesomeForm
Debug.Print MyAwesomeForm.Tag 'should print nothing, but won't crash either

仅仅访问已卸载的全局实例的Tag属性将加载该对象!

这就把我们问到了你的问题:

  

有没有办法可以访问/获取已卸载表单的Tag属性值?

绝对不是。因为您只需访问Tag属性即可加载表单实例。它将为空,因为您之前设置的任何值都设置在同一类型另一个对象上。

Tag实例属性:它属于实例,而不属于类型。这意味着你可以拥有:

MyAwesomeForm.Tag = "123"

Dim form1 As MyAwesomeForm
Set form1 = New MyAwesomeForm
form1.Tag = "ABC"

Dim form2 As MyAwesomeForm
Set form2 = New MyAwesomeForm
form2.Tag = "XYZ"

Debug.Print MyAwesomeForm.Tag 'prints 123
Debug.Print form1.Tag 'prints ABC
Debug.Print form2.Tag 'prints XYZ

当一个对象“在内存中”时,它被“加载”。不在内存中的对象甚至不存在;所以不,你不能读取或写一个属性值到“卸载”的形式。

表单很可能已加载但不会显示。如果这就是你的意思,那么答案就是“是的,绝对!”。