Access 内置对象中所有的集合,就像一个数组的强化版:像数组的,我们以下标获得某一个元素;强化的是我们的下标是可以用数字(在集合里面的位置),或文本名字,来参考出某一个元素。
大家非常熟识的集合会有
Forms
Reports
而我们参考某个表单就会用 Forms!录入表单,这是 Forms("录入表单") 的简化版,意思是 以 “录入表单” 作为下标在集合里面找出元素,这是容易理解的。
往下一层了: Forms!录入表单!用户名 呢? 近年比较少人用这种表达式了
其实这是名称为 “录入表单” 的表单中,名称为 “用户名” 控件。
根据Access设计原则,这代表着表单对象下 一个默认集合里的一个元素的简写,全写应该是
Forms!录入表单.Controls("用户名") ----- 这原来就是 Forms!录入表单!用户名。
Access VBA 的 Form 类设计,就设置了一个默认集合 -> Controls,所以对所有 Form 对象用上 ! 就是默认从 Controls 属性这个集合中索引一个对象出来。
Access Objects 的架构中相同的 默认属性类有
DAO.Recordset
DAO.Relation
References
.....
DAO.Recordset :
Set rs = currentdb().open("学生")
a = rs!学号 ' 就会完全等同 rs.fields("学号") ,也是同样的道理
近年,让我们有所混淆的就是 表单的空间可以用 点号来引用(这是VB开发人员跟 Access 开发团队申辩过后才提供的功能)
Me!学号 用 Me.学号 同样通用!
Form 对象在 好像 2003 还是 2007 做了这个扩展,我们在 Form 对象(注意不是 Forms) 添加的控件
Forms!学生.Controls 集合里 添加了 Name 为 "学生" 的控件后,
VBE 同时在 Forms!学生 对象扩展了 一个 类属性 学生,同时指向 .Controls("学生") 元素,(至少指针所耗内存不多)
所以我们在 VBE 编写代码的时候,就可以 Me.学生 引用该个控件了,方便了大家编写代码了!
如果,”学号” 控件是拖放在表单的主体内的话,在内存里 Forms!学生.Controls("学号") 这个对象同时被
Forms!学生.Controls("学号")
Forms!学生.学号
Forms!学生!学号
Forms!学生.Controls("学号")
Forms!学生.Section(0).Controls("学号")
Forms!学生.Section("主体").Controls("学号")
那么多解析同时指向同一个控件。
不过注意,以下这些是不存在的:
Forms!学生.Section(0).学号
Forms!学生.Section("主体").学号
原因是Access 并没有对 Section 对象 建立类属性的快捷键!
那么复杂的代码,每人会用的,只是我们需要了解
1. Me!学号 与 Me.学号 虽然指向一样,但是是两个意思
如果表单里面没有 “学号” 这个控件
Me!学号 是不会报错的,因为这是运行时的代码;而
Me.学号 是 设计时 的解析,当表单上没有这个控件,基本上已经报错了!
所以,Me.学号 运行起来一定会快速一点!因为编译能通过的话,代码编译后对象的参考位址已经固话到代码里了。
2. Me!学号 如果在不考虑运行速度的损耗的话,代码的观赏性会高很多。
3. Me("学号") 基本上会与 Me!学号 运行速度一致的,都是在编译的时候,把字符串固话到编译后代码,在运行时在集合里用文字来查找;但是一般我们用 Me( string) 的情况是,我们会用变量,就是连运行的时候,我们都不确定 用户选择了哪个控件的情况下使用;又或者在一些根据数据创建控件的应用里,才会用到最低效率的 Me(n) 表达式。