Office中国论坛/Access中国论坛

标题: 众里寻他千百度——遍历其它窗体上的控件 [打印本页]

作者: roych    时间: 2019-7-31 10:12
标题: 众里寻他千百度——遍历其它窗体上的控件
一直很好奇,为什么有人想要遍历窗体上所有控件。一般情况下,个人觉得这是一个伪需求。例如,做权限设计的话,根本没必要遍历控件,毕竟窗体上实现权限控制粒度细分无非若干个按钮,在录入界面上,文本框、标签的个数往往是远远超过按钮数。就那么几个按钮,手动建表输入不行吗?
再如,刚刚发现论坛里有人提及,动态引用窗体控件以赋值。当然,这个版友大概是忘记打开窗体了,结果报错。
其实早前有人在群里问及这个事情,便写了一个模块发到群里了。不过,既然再次有版友提及,那么倒不如做个示例,供大家参考吧。正如诗云:“众里寻他千百度,蓦然回首,那人却在程序报错处”。
按惯例先上代码:
  1. Private Sub Command0_Click()
  2.     Dim frm As Form
  3.     Dim strData As String
  4.     Dim accObj As AccessObject
  5.     Dim ctl As Control
  6.    
  7.     For Each accObj In CurrentProject.AllForms
  8.         DoCmd.OpenForm accObj.Name
  9.         Set frm = CurrentProject.AllForms.Application.Forms(accObj.Name)
  10.         If frm.Name <> Me.Name Then
  11.             frm.Visible = False
  12.             For Each ctl In frm.Controls
  13.                 strData = ctl.Name & "," & strData
  14.             Next
  15.             Me.txtTest.Value = Me.txtTest.Value & frm.Name & ":" & Left(strData, Len(strData) - 1) & vbCrLf
  16.             strData = ""
  17.             DoCmd.Close acForm, frm.Name
  18.         End If
  19.     Next
  20. End Sub
复制代码
代码很简单,所以就不再注释了。大体是先定义好AcceObject控件(这也是一个很奇怪的东西,allforms返回的竟然不是forms集合,而是AcceObject),然后将AcceObject传递给form对象,最后打开form,遍历里面的控件,读取控件名,赋值给当前文本框并输出。

需要注意的是,一定要加上If frm.Name <> Me.Name Then这部分。这是因为打开窗体时,Me应该是当前激活的窗体,如果没有这一句,那么在当前激活的窗体里找不到Me.txtTest控件,必然会报错。其他则不再赘述。有问题的地方请回复本帖。
[attach]63419[/attach]

作者: admin    时间: 2019-7-31 10:57
赞!!
作者: tmtony    时间: 2019-7-31 21:56
好示例,赞!
作者: ynjxw    时间: 2019-8-1 09:10
附件已损坏?麻烦重新上传一下,谢谢!
作者: roych    时间: 2019-8-6 09:58
ynjxw 发表于 2019-8-1 09:10
附件已损坏?麻烦重新上传一下,谢谢!

没毛病啊。可能是你的系统问题。
[attach]63422[/attach]

作者: access新新新手    时间: 2019-8-28 08:55
allforms返回的竟然不是forms集合,而是AcceObject)问题就在这里




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3