Office中国论坛/Access中国论坛

标题: 模块与事件的问题 [打印本页]

作者: williamwangc    时间: 2013-3-9 18:50
标题: 模块与事件的问题
在学习事件模块之间的关系和应用。在学习中有些问题。
我写了一段测试的代码。
Private Sub Command0_Click()
Me.Command1.OnClick = "= ctlRed ('" & Me.Name & "',True)"
End Sub

模块中写了一段FUNCTION
Public Function ctlRed(strFormName As String, blRed As Boolean)
Dim ctl As Control
'Dim ctls As Controls
'Set ctls = CurrentProject.AllForms(strFormName).Controls
For Each ctl In Forms(strFormName)
    If ctl.ControlType = acCommandButton Then
        If blRed = True Then
        ctl.ForeColor = RGB(255, 0, 0)
        Else
        ctl.ForeColor = RGB(0, 255, 0)
        End If
    End If
Next ctl
End Function
但是测试了之后按钮没反应,但是如果写在按钮本身的事件中没有问题。奇怪。
不知道哪里写错了。
作者: williamwangc    时间: 2013-3-9 18:56
本帖最后由 williamwangc 于 2013-3-9 18:59 编辑

另外,我想问下。
1、我猜没错的话,Me.Command1.OnClick = "= ctlRed ('" & Me.Name & "',True)"这是表达式生成器是么?
2、如果我在按钮的click事件写入任意代码,在运行以上的表达式的话会发生什么冲突么?
3、还有我在上一段代码中使用'Set ctls = CurrentProject.AllForms(strFormName).Controls时发现有错误,这应该怎么写呢?
作者: roych    时间: 2013-3-9 22:27
点多几次就有反应了。{:soso_e128:}
1、一般把这类型事件放在窗体的加载事件中效果会更好些。请参考【源码开放】季度奖管理系统中主界面的图标菜单。如果需要调用的情况不多的话,写好模块后,直接在单击事件中输入:=函数(参数)即可。
2、肯定会有冲突的。具体是哪个优先,我没测试过。
3、应该怎样写:Set ctls = Forms(strFormName).Controls  AllForms木有Controls子集。
作者: williamwangc    时间: 2013-3-9 23:01
请版主再测试一下。
我是为设定权限的功能函数做准备。在设定权限放在Load事件好还是Open事件好。是不是就是这样引用表达式的思路初始化权限。?

作者: roych    时间: 2013-3-10 09:53
williamwangc 发表于 2013-3-9 23:01
请版主再测试一下。
我是为设定权限的功能函数做准备。在设定权限放在Load事件好还是Open事件好。是不是就 ...

你给的例子我测试过了。点第一次是没反应,点击第二次以后就有反应了。^_^
从顺序上来讲,先是Load事件然后是Open事件。初始化嘛,自然是Load事件会好些的。
权限问题,我觉得最好还是在表中设置。Todaynew写过《权限麻雀》和《菜单权限》等例子,你不妨搜索来参考下。
作者: williamwangc    时间: 2013-3-10 11:07
ACCESS的参考书中说OPEN事件优先于LOAD事件嘛。
作者: ycxchen    时间: 2013-3-10 12:03
代码有意思,楼主最好将例子上传。
作者: ycxchen    时间: 2013-3-10 14:49
Me.Command1.OnClick = "= ctlRed ('" & Me.Name & "',True)"改成
Me.Command1.Click = "= ctlRed ('" & Me.Name & "',True)"行不行?

作者: todaynew    时间: 2013-3-10 16:22
不应该用AllForms,而应该用Forms。
AllForms是所有窗体(包含打开和未打开的),Forms是所有打开的窗体。
要设置窗体上的控件,前提是窗体需要处于打开状态。
作者: ycxchen    时间: 2013-3-11 09:54
本帖最后由 ycxchen 于 2013-3-11 09:56 编辑
roych 发表于 2013-3-9 22:27
点多几次就有反应了。
1、一般把这类型事件放在窗体的加载事件中效果会更好些。请参考【源码 ...


请问版主,键入currentproject.后在列表框可看到AllForms对象,但无论键入AllForms.还是lForms.在出现的列表框均没有controls子集,这是什么一回事呀?
按我理解,Me.Command1.OnClick = "= ctlRed ('" & Me.Name & "',True)"应改成如下的才对,对否?
Me.Command1.Click = "= ctlRed ('" & Me.Name & "',True)"
作者: roych    时间: 2013-3-11 12:23
williamwangc 发表于 2013-3-10 11:07
ACCESS的参考书中说OPEN事件优先于LOAD事件嘛。

从顺序上是先Load然后再Open的。
作者: roych    时间: 2013-3-11 12:43
ycxchen 发表于 2013-3-11 09:54
请问版主,键入currentproject.后在列表框可看到AllForms对象,但无论键入AllForms.还是lForms.在出现的 ...

1、用Forms的确无法弹出Controls子对象,但是你像下面这样输入就知道了。
[attach]51424[/attach]
2、OnClick跟Click是不同的。前者是一个事件,后者是一个方法。Click表示点击这个动作,但不会执行任何代码。而OnClick则表示点击完并执行点击后的代码。打个不太恰当的比喻,例如取钱,把ATM吐钞槽的钱取出来只是一个动作,但是取钱是包括一连贯的动作在里面的,例如把卡插入ATM机,输入密码等等。

这些东西是需要个人在实践中慢慢理解,不是不想说,而是不容易说清楚,真的有点“只可意会不可言传”的这种感觉。

作者: ycxchen    时间: 2013-3-11 14:56
roych版主水平真高,谢谢指教!
作者: ly    时间: 2013-3-11 18:23
roych 发表于 2013-3-11 12:43
1、用Forms的确无法弹出Controls子对象,但是你像下面这样输入就知道了。

2、OnClick跟Click是不同的。 ...

我的理解是:
click是事件,当在一个对象上按下并释放鼠标左键时,发生 Click 事件。
onclick是属性,该属性有助于以编程方式更改事件触发时所采取的行动。
例如,窗体上有一个按钮对象的Click()事件,我可以用onclick属性去触发该事件。
作者: roych    时间: 2013-3-12 01:02
ly 发表于 2013-3-11 18:23
我的理解是:
click是事件,当在一个对象上按下并释放鼠标左键时,发生 Click 事件。
onclick是属性,该 ...

看来我理解有误了。对于理论的东西,我较少刻意去钻研,大多是在使用过程中,凭着对代码的感觉去理解的。或许这样说会更准确点,不知你是否认同:
Click是一个方法,是一个事件过程【Sub过程】,这是毫无疑问的了。
而OnClick是事件属性,也就是说通过这个Onclick属性去指定执行Click这个过程。
作者: ycxchen    时间: 2013-3-12 09:36
昨晚看了些资料,觉得14楼的理解较吻合教材的解释。
作者: williamwangc    时间: 2013-3-17 20:21
roych 发表于 2013-3-12 01:02
看来我理解有误了。对于理论的东西,我较少刻意去钻研,大多是在使用过程中,凭着对代码的感觉去理解的 ...

没想到我的这个问题引发了这么多讨论。感谢版主以及各位的观点。感觉受益匪浅。
作者: williamwangc    时间: 2013-3-17 20:25
最近在看VISUAL BASIC 2008的参考书。我在有几个想法。
1、VISUAL STUDIO这么多好用的控件,能否嫁接到ACCESS中为我所用呢?
2、究竟是ACCESS升级到VISUAL STUDIO作为一个单独程序或是WEB还是反过来如问题1好呢。




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