Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > Access数据库-模块/函数/VBA

Form 控件的多种引用区别

时 间:2015-04-02 01:02:18
作 者:何保辛   ID:22003  城市:深圳
摘 要:Me!学号 与 Me.学号 与 Me("学号") 到底有多大的差别?
正 文:

今年Access VBA 的 引擎强化了,反而让开发人员搞乱了 窗体和控件 对象引用符号了!


很久远以前,Access 内置对象有所谓的 集合 Collection 对象,Access VBA 自2.0版本开始就有个 感叹号符号,方便大家引用集合里面的某一个元素。


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("学号") ,也是同样的道理


如果你看对象浏览器的话,你会看到

Property Fields As Fields

    只读
    DAO.Recordset 的缺省成员  <---- 缺省成员就是这个意思了!


Property Value As Variant
    Access.TextBox 的缺省成员  <---- 这个就代表  如果你有一个 TextBox 对象是 tb 的话,tb="123“ 等价于 tb.value="123"



近年,让我们有所混淆的就是 表单的空间可以用 点号来引用(这是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 对象 建立类属性的 快捷键!


说了那么多,如果你已经看懂了话,你就理解这一句代码有什么事情在发生了!

a = Forms!城市!美食.form!餐厅.form!评论.form!赞同会员.form!会员靠谱指数


那么复杂的代码,每人会用的,只是我们需要了解

1.  Me!学号 Me.学号 虽然指向一样,但是是两个意思

    如果表单里面没有 “学号” 这个控件

    Me!学号 是不会报错的,因为这是运行时的代码;而

    Me.学号 是 设计时 的解析,当表单上没有这个控件,基本上已经报错了!

    所以,Me.学号 运行起来一定会快速一点!因为编译能通过的话,代码编译后对象的参考位址已经固话到代码里了。


2.  Me!学号 如果在不考虑运行速度的损耗的话,代码的观赏性会高很多。


3. Me("学号") 基本上会与 Me!学号 运行速度一致的,都是在编译的时候,把字符串固话到编译后代码,在运行时在集合里用文字来查找;但是一般我们用 Me( string) 的情况是,我们会用变量,就是连运行的时候,我们都不确定 用户选择了哪个控件的情况下使用;又或者在一些根据数据创建控件的应用里,才会用到最低效率的 Me(n) 表达式。



Access软件网官方交流QQ群 (群号:54525238)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助