设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 5708|回复: 11
打印 上一主题 下一主题

[其它] 【Access小品】关于Controls(0)的许多废话

[复制链接]
跳转到指定楼层
1#
发表于 2012-11-16 16:41:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 todaynew 于 2012-11-17 07:16 编辑

  昨天在Access软件网,版友龙行天下问了一个问题:me.Controls(0)是什么意思。这个问题很简单,回答了他的问题后,我给他留了一个问题,叫做:Me.Controls(0).Controls(0)是个什么东东?留完这个问题后,我突然觉得这个问题好像不简单,于是我在Access中做了一些初步的测试,这个测试使我很惊讶,原来我曾经臆想到的结果并不对。于是我在两个论坛提出了这个问题,想看看大家的看法以及思考是否这也如此。

  晚上在QQ中和几个Access资深的同志交流了一下,问了他们对这个问题的想法。猛然提出这个问题后,基本上都没有回答的全面和正确。后来红尘如烟在论坛做了一个解答,算是比较正确和全面的。在论坛和QQ的交流中,还是看出了一些不同的归纳方式和思考问题的方向。总体上说,这是一个看起来简单不过的问题,却深藏着非常重要的内容。于是决定总结一下,以使初学者对这个问题,并由这个问题对控件、控件数组、对象等概念有一个全面的认识。

  要说清楚这个问题需要把简单问题复杂化,因此我想先说明me是什么?很长一段时间里,我一直以为me就是指的当前窗体,通常这样理解并不为错。只是接触VB.NET后,知道了类和对象这么两个概念后,才发现me实际上是当前窗体的一个类的实例化对象,这个概念比窗体本身的内涵要大。不过初学者倒不必纠结这个问题,反正你me了以后点出一些东西会使用就可以了。这里之所以要花费一些文字说这个问题,只是想说明很多看起来再简单不过的东西,可能你并非真的明白。

  me说完了,接下来是第一个Controls(0)。其实这个东西很简单,从形式上很快可以判断这是一个数组,比较特殊一些的在于它是一个对象类型的数组。红尘如烟解答时对这个问题说得很明白,对象数组通常参数类型有两种,一种是从零开始的整数(它是通常以对象建立的先后秩序为序号)返回对象本身,一种是以控件的名称(字符型)返回对象本身。我们在Access中常遇到的这类对象数组有Controls、Forms、AllForms、AllTables等等,基本都是如此情况。从编程的角度讲,Controls(0)本身并不常用,对Controls运用最为普遍的是两种情况,其一是Controls("控件名"),比如我们从主窗体调用子窗体控件,或者相反调用,或者调用其他窗体中的控件,我们通常这样干。另外一种常见的运用是遍历控件,遍历控件我们必须要用到Controls对象。不过遍历的方法倒是有两种,一种是我们用Controls的Count属性来控制遍历的过程,另外一种是用for each来控制遍历的过程。注意!这里对控件遍历是做了一个铺垫,对后面的阐述是有意义的。

  不知道你被绕晕乎没有,不管你有多着急,我还是打算在实际接触到问题本身前,再绕绕弯子。到了在接触问题后,me.Controls(0)已经不重要了,这只是为构成题目时形式上有趣罢了。所以观察me.Controls(0)和观察me.Controls(i),或者me.Controls("txt1")是完全一样的。重点是第二个Controls(0)是什么?

  大概两年前,t小宝版主问了一个问题,大体意思是如何得到一个控件所属的标签控件对象。谁回答的这个问题我已经记不清楚了,只是从那以后我知道可以用某个控件的Controls(0)得到其所属的标签对象,而且在以后的很多程序中用到了这个玩法。由于用的多了,便始终以为就是如此。实际上我在给版友龙行天下留问题时,也是想让他逐步的知道这个用法。昨天突然觉得这个看法不尽然!因为容器控件中应该也存在控件数组。

  容器控件这个概念是在去年年底我打算学习VB.NET时,咱家是猫版主告诉我的。当时我问他VB.NET与Access有些什么差异,他说容器控件应该算一个差别。初步接触了VB.NET和ASP.NET后发现容器控件确实有些趣味,比较了一下发现Access中有些控件实际上有容器控件的一些特点,比如选项卡控件、选项组控件、子窗体控件等。那么什么是容器控件呢?大体可以这样理解,可以装载其他控件的控件是容器控件。由于容器控件中装载了其他控件,也就意味着它的中间存在一个Controls对象。所以Controls(0)就应该是容器控件中的第一控件了。我最开始确实是如此判断的,而且我晚上问王站这个问题,他的第一反应也是如此。

  昨天下午在提出问题前,我就此做了一些测试,发现我的判断是不正确的。子窗体控件的Controls(0)倒是子窗体上的第一个控件,选项卡控件确不存在Controls数组,而选项组控件的Controls(0)不是其中的第一个选项控件,而是其所属的标签控件(今天海峰同志说明了选项组控件的Controls(1)倒是选项组控件中的第一个选项控件)。测试后,我就觉得这个问题有意思了,因为我想知道大家是否都会犯我一样的先入为主的错误,于是发了一个问题贴。

  其实这个问题还有l两个可以深入的地方,第一个是做为某个控件所属的标签控件我们虽然可以将其视为该控件的Controls(0),但它同时也是所在窗体中的某个Controls(i)。这是什么意思?这是说这类控件有两个父对象!当然这个问题不重要,为什么不重要呢?因为初学者通常是先知道控件从属于窗体,而后知道控件也可能从属于控件。所以在运用中不大可能出现障碍和混淆,如果知识的积累过程是相反的,一定会有很多初学者在处理问题是茫然不知所措。

  这个可能出现的茫然不知所措会发生在什么地方呢?还记得前面的一个关于遍历的铺垫吗?问题就是在这里!遍历控件我们通常是对遍历到的控件做一些操作,这些操作通常是针对非标签控件的。所以我们遍历的过程中会用ControlType来排除掉标签控件。如果我们仅知道Controls(0)是控件的子对象,而不知道它同时也是窗体的子对象的话,我们就不会用ControlType来排除它了。还好,对于初学者你几乎没有机会犯这个错误。

  第二个是对于子窗体控件来说,Controls(0)真的就是子窗体控件所包含的控件吗?我觉得不是!因为子窗体控件中的窗体的Controls应该是从属于窗体的,而不应该是从属于子窗体控件的。也就是说孙子不可能是爷爷的儿子,否则江湖乱套了!Access用给子窗体一个Controls属性,大体只是为了多一个简化引用的方法而已。这样一说,你就明白为什么对子窗体控件可以用me.子窗体.Controls("txt1")引用,也可以用me.子窗体.Form.Controls("txt1")引用了。第一种引用方法只是第二种引用方法的简写,并不代表子窗体控件真的存在一个控件数组。糊涂了没有?在这个问题上采取难得糊涂就行了,呵呵。

  长篇大论以后,你会觉得这篇文章实在无聊,好像与实际运用关系并不大。我要说你的判断是正确的。其实化些力气和时间写这篇文章,只是想告诉同志们,对问题养成思考的习惯可能比解决一两个问题更为重要。好了,揭晓问题的答案:

  1、Me.Controls(0).Controls(0)可能不是个东西,不信在窗体放第一个控件为按钮、选项卡、图片等。
  2、Me.Controls(0).Controls(0)可能是某个控件的标签,不信在窗体放第一个控件为文本框、组合框、列表框等。
  3、Me.Controls(0).Controls(0)可能是子窗体上的第一个控件,不信你在窗体放第一个控件为子窗体。

  最后留一个问题,Me.Controls(0).Controls(0)...Controls(0)最多有几个?亦或可能没有限制?

本帖被以下淘专辑推荐:

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖1 订阅订阅
2#
发表于 2012-11-16 17:05:34 | 只看该作者
老汉总能将问题通俗化说理,好。

点击这里给我发消息

3#
发表于 2012-11-16 18:56:42 | 只看该作者
呵呵~
4#
发表于 2012-11-16 19:32:48 | 只看该作者
第一个CONTROLS(0) 是对于窗体放置的第一个控件名称,
第二个CONTROLS(0)是相对于第一个控件来说的,当第一个控件具有容器功能时,Me.Controls(0).Controls(0) 才会成立,反之会出错,
一般来说创建控件时,自动生成一个LABLE的都具有容器功能,Me.Controls(0).Controls(0)就是指控件的标签,如:文本框,组合框,列表框,选项组,复选框,选项按扭。在子窗体上面放置一个文本框 Me.Controls(0).Controls(0) .Controls(0) 就是子窗体文本框的标签,按理来说只有上级具有容器功能,就可以按 Me.Controls(0).Controls(0).Controls(0).Controls(0)...一直写下去,大家不防在子窗体中再创建子窗体.
5#
发表于 2012-11-16 19:42:11 | 只看该作者
在窗体创建一个文本框 再执行下面代码

msgbox Me.Controls(0).name
msgbox Me.Controls(1).name
msgbox Me.Controls(0).Controls(0).name

大家发现了什么,Me.Controls(1).name 和 Me.Controls(0).Controls(0).name,结果一样的
标签除了是窗体的控件外,同样也属于文本框容器下面的子控件

点击这里给我发消息

6#
发表于 2012-11-17 11:59:28 | 只看该作者
我有点自己的看法

Controls是集合,而不是数组,因此,“1、Me.Controls(0).Controls(0)可能不是个东西”,因为集合中没有元素,当然,就没有 0,很可能还要引用出错。

点击这里给我发消息

7#
发表于 2012-11-17 15:14:57 | 只看该作者
谢谢分享..总是学习了..

点击这里给我发消息

8#
发表于 2012-11-17 15:16:07 | 只看该作者
文章通俗易懂..辛苦LZ了..
9#
发表于 2012-11-17 16:30:17 | 只看该作者
楼主很有心啊,这样的讨论多些,就会让很多人学到很多东西,事物越辩越明,我就受益匪浅。学习了!
10#
发表于 2012-11-18 13:26:18 | 只看该作者
好,顶
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-14 10:44 , Processed in 0.110372 second(s), 35 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表