设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 3607|回复: 5
打印 上一主题 下一主题

[窗体] 【Access小品】是非难辨 -- 子窗体打开概述

[复制链接]
跳转到指定楼层
1#
发表于 2015-7-23 13:27:05 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 todaynew 于 2015-7-23 13:45 编辑

  有版友打开了一个主子窗体,于是乎用“Forms!子窗体名称!控件名称”来读写数据,结果跳错。这个情况涉及到窗体打开的概念,便决定说道说道。窗体是否处于打开状态原本是一个直观而简单的问题,看得见窗体界面了,窗体就应该说是打开了。这个看似再简单不过的问题,其实远比想象中要复杂。复杂的原因在于Access中存在双重标准,标准不同是否打开的结论相异,处理的方法和手段也就大相径庭。

  在Access中有两个集合与窗体有关,其一是AllFroms集合对象,该集合的元素由所有窗体组成,与其是否打开的状态无关。另外一个就是Forms集合对象,这个集合是所有用Docmd.OpenForm命令打开的窗体对象所组成。由此,这里就出现了第一个关于窗体是否打开的判断标准,也就是存在于Forms中的窗体为已打开窗体。便也就可以从Forms("窗体名称")或Forms!窗体名称出发,找到窗体上的控件,并对控件的某些属性进行操作。

  天下本无事,问题却出在主子窗体的打开上。Docmd.OpenForm命令打开主窗体时,它只将主窗体Add到Forms集合中,而没有理会子窗体,于是我们在Forms中看不到子窗体这个窗体元素。那么子窗体到底打开了没有呢?当然是打开了!不打开你怎么看得见窗体所呈现的内容。你可能说这不对,Forms中没有怎么能算打开呢?不能说你不对,因为你用的判断标准确实存在。可是你是否想到,可能还存在另外的一个判断标准?这个标准就是看窗体的打开事件是否执行了。如果打开事件执行了,窗体就已经被打开了。你可以试试,子窗体的打开事件这个时候是被执行了的,所以我们也可以说子窗体被打开了。

  实际上,无论窗体是否存在于Forms中,只要它呈现在你的眼前,便一定会触发窗体打开事件。所以,用窗体的打开事件是否被触发,来作为窗体是否打开的判断标准更具有普适性(即存在于Forms中是窗体打开状态的特例)。不过这个普适性并不能指导你来针对不同情况处理窗体上的控件。能指导你分别情况处理问题的判断标准,还只能依据窗体是否存在于Forms中。也就是说Forms中存在的窗体,可以用Forms("窗体名称")查找其控件,并进行处理;Forms中不存在的窗体,但它作为子窗体已经打开了,则只能通过主窗体中的子窗体控件来逐级找到子窗体中的控件,并进行处理。

  你可能觉得论述得太搅合了,看不明白说的是什么。其实论述复杂只是为了炫耀一番,与实际处理问题没什么太大关系。由此,你便不至于被唬住。你只需要记住主子窗体中不要用Forms("窗体名称")或Forms!窗体名称这样的写法去找子窗体控件就行了。至于这种情况下怎么去找,是个简单问题,在此不赘述。

示例:

视图:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

本帖被以下淘专辑推荐:

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖1 订阅订阅
6#
发表于 2016-8-20 11:05:20 | 只看该作者
已经下载学习
5#
发表于 2016-8-14 17:31:57 | 只看该作者
outlook有没有录制宏之类的功能呢
4#
发表于 2016-8-14 17:31:37 | 只看该作者
outlook有没有录制宏之类的功能呢

点击这里给我发消息

3#
发表于 2015-7-23 16:06:52 | 只看该作者
高产啊。老汉
2#
发表于 2015-7-23 14:03:45 | 只看该作者
谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-1 17:56 , Processed in 0.102521 second(s), 33 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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