Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

[5分]Controls().controls(0)提问

韩志  发表于:2009-09-25 18:21:10  
复制

窗体1中有一个文本框text2,和它关联的标签是label1

 

Private Sub Text2_Click()
Dim strfrmname As String
Dim strctlname As String
strfrmname = "窗体1"
strctlname = "text2"

Debug.Print Forms(strfrmname).Controls(strctlname).Controls(0).Name

Debug.Print Forms(strfrmname).Controls(strctlname).Name
End Sub

得到的结果是:

label1

text2

 

这个结果是经测试出来的,但始终看不明白。

1.forms("窗体1").controls("text2")是一个控件集合吗?

  如果是控件集合为什么其name="text2"呢

2.如果forms("窗体1").controls("text2")不是一个集合,那么又怎么会出现forms("窗体1").controls("text2").controls(0)呢,而且这个表示与它相关联的标签,很纳闷。

请老师给予指教。

 

Top
韩志 发表于:2009-09-25 18:22:50

补充:debug.print forms("窗体1").controls("text2").controls(1).name 出现错误

 



andymark 发表于:2009-09-25 20:30:23

首先窗体的集合包括了窗体的各控件

列举窗体上的所有控件,可用下面的方法

dim ctl as control

for each ctl in me.controls

  debug.print ctl.name

next

 

ACCESS中的文本框的标签和文本框是关联的(其他控件也是一样),标签包含在文本框当中...

dim ctl as control

 

for each ctl in me.controls("text2").controls

 

  debug.pring ctl.name

next

 

得到的结果只是label1,当你的参数为controls(1).name 时,没有对象当然会出错

 

同样,当把文本框的标签删除,这时的文本框就不再是个容器

 

Debug.Print Forms(strfrmname).Controls(strctlname).Controls(0).Name

 

执行上面的代码也会出错



a1727 发表于:2009-09-26 11:57:09

Debug.Print Forms(strfrmname).Controls(strctlname).Controls(0).Name

分析一下:

”Debug.Print“ 这是调试输出命令。

Debug是一个对象

print是对象的方法,可以理解为过程或函数。因为这里不需要返回值,所以理解为过程较好。

 

注:很多对象都有print方法的,这里写成“Debug.Print”,意思使用Debug的print

 

Forms(strfrmname).Controls(strctlname).Controls(0).Name 整体看成是一个参数。

但是这个有点复杂,慢慢来理解吧

forms是一个access的全局对象,代表所有的窗体(看到她后面多一个s没有,),写成这样”Forms(strfrmname)“的时候,

就指定一个唯一窗体,谁呢? 就是strfrmname, strfrmname是什么呢?你已经告诉程序了strfrmname = "窗体1"。

根据你这段代码的意思,可以把Forms(strfrmname)改写为me是一样的,me代表本窗体。

 

Controls:

Controls代表控件集对象,代表窗体上所有的控件,比如文本框,按钮,标签等等,以及一些看不到的(运行时看不到)。

写成这样Controls(strctlname),指定了唯一控件了,也就是strctlname(text2)。

 

Controls(0):

控件可以通过名字来指定,也可以通过索引来指定,这里写成Controls(0),是通过索引来指定。至于里面包含多少个,就只有你自己知道了。

 

最后就是name了,就是你给定的!

 

总结:

 

  我们在设计阶段,可以拖动的东西都是对象。在编写的代码一般都是对这些对象操作!

要操作这些对象,你必须明确告诉程序,你要操作那个对象。

由于对象是分层次存放的。比如forms是access的4大对象之一(好像是4个,具体是不是自己去看看)。

我们指定一个对象,可以从这几大对象开始往下写。想你这样的写法就是了。

Me代表本窗体,可以直接用来引用本窗体的控件。

 

 

 

 

 

 



trynew 发表于:2009-09-27 09:49:26

1.forms("窗体1").controls("text2")是一个控件,就是窗体上控件集合中的一个,就是text2文本框控件,其name="text2"。

2.forms("窗体1").controls("text2").controls才是一个控件集合,是text2包含的所有子控件的总和,很多控件都可以包含子控件,比如页面控件等,文本框只是其中一种。

3.forms("窗体1").controls("text2").controls(0)是一个控件引用,text2包含的所有子控件的总和中的第一个(也是唯一一个)。

这个的理解跟数组是一样的,不指明下标时代表数组,是很多个值的集合,但不指明具体值,带下标的数组就是一个变量了,有具体的值,可以进行读写。楼主的疑问大概就是把控件集合和控件集合中的一个具体控件的混了起来。控件集合只有添加、清空、删除元素几种操作或进行遍历,指明索引号或名称的,就是具体控件引用,controls("text2")和Me.text2是一样的。

另外,forms("窗体1").controls("text2").controls(0)由于不需要知道关联标签的具体名称就可使用,在数据表格式窗体(子窗体)中动态改变列标题是很有用的,列标题显示的就是关联标签的Label。



trynew 发表于:2009-09-27 10:00:21

forms("窗体1").controls("text2").controls(0)的具体含义可以理解为:

当前所有打开窗体的集合中的“窗体1”上所包含的所有窗体控件中的“text2”文本框包含的附属控件中的第一个控件。

 

For each ctl in me.controls的含义:

在当前窗体的控件集合中的每一个控件进行循环。

 

注意controls("text2")和me.controls的不同用法。



韩志 发表于:2009-09-29 16:28:29

既然forms("窗体1").controls("text2").controls是一个控件集合,那么为什么这个容器只装了一个控件呢(标签),我理解起码要包含两个吧,一个是标签,一个是文本框。

forms("窗体1").controls("text2").controls(0)是指标签控件

为什么forms("窗体1").controls("text2").controls(1)就是错误的呢。



andymark 发表于:2009-09-30 08:32:51

楼主理解错误啦

 

容器有点像父子关系

 

窗体是父,窗体上的控件是子

 

为了说明,我们在窗体上随意放几个控件,Command0,Text1,Text3

 

Dim ctl As Control

For Each ctl In Me.Controls

 Debug.Print ctl.Name

Next

 

输出结果:

Command0
Text1
Label2
Text3
Label4

 

上面的结果也可以直接用索引来引用

Debug.Print Me.Controls(0).Name
Debug.Print Me.Controls(1).Name
Debug.Print Me.Controls(2).Name
Debug.Print Me.Controls(3).Name
Debug.Print Me.Controls(4).Name

 

分别代表

Command0
Text1
Label2
Text3
Label4

 

这里的ME是指窗体,是父关系

 

同理

forms("窗体1").controls("text2").controls(0)  

forms("窗体1").controls("text2") 这里对于标签来说是父关系

 

 

dim ctl as control

 

for each ctl in me.controls("text1").controls

 

  debug.pring ctl.name

next

 

输出结果为Label2



总记录:7篇  页次:1/1 9 1 :