设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

[模块/函数] 张无忌学太极剑——浅谈通过表达式来加载事件过程

[复制链接]
跳转到指定楼层
1#
发表于 2016-3-18 17:10:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 roych 于 2016-3-18 17:21 编辑

昨晚,白菜在QQ里私信给我,问及如何批量重命名标签名称时,顺便提及了一个比较通用的问题,如何批量使用事件。我想大多数版友可能都会有这个疑问吧。
事实上,我之前上传的一些例子里已经使用到了【例如汽车进销存系统--Beta版的主界面】。只是可能大多数版友下载也就下载了,对于里面的模块,要么没留意,要么就是看过即忘,完全一副张无忌学太极剑的样子。

在《倚天屠龙记》里,张三丰对徒孙张无忌评价是,“不坏,不坏,忘得真快。”然而我却没有这份幽默。
因为张无忌忘记的是招式,而不是剑法的精髓。忘记招式,就是从形式上忘记这套剑法,而不是从根本上忘记这套剑法中的轻灵飘逸,否则他也不至于成为一代武林宗师了。


我还是继续说一下好了,大家能记住就记住吧,记不住也就罢了。

我们可以先写一个带参数的自定义函数,以便针对某些或者某类控件来设置事件。例如,新建一个模块,然后键入以下内容:
  1. Public Function MsgLabel(ByVal lbl As Label)
  2.     MsgBox "你点击了:" & lbl.Caption
  3. End Function
复制代码
定义好函数后,我们仍然需要一个触发事件。简单点说,在什么情况下使用它。例如,我们可以在标签的单击事件上使用它:
  1. Private Sub Label0_Click()
  2.     Call MsgLabel(Me.Label0)
  3. End Sub
复制代码
这样call当然没问题的。一旦标签比较多的时候,逐个写call大概也不是是一件很愉快的事情。所以这时候就应该尽可能在加载窗体的时候,把函数加载到事件过程中。当窗体加载完毕之后,标签的事件也就加载完成了,这时候随意调用即可。



事件过程可以执行三种命令:表达式、宏和函数【注:这里把sub和function统称为函数】。

宏和函数,例如,点击宏生成器,然后选择“宏”(如果不存在的话,会弹出创建宏的界面);函数嘛,则弹出VBE界面,输入代码即可;而表达式,则应该是预先写好,然后再选择,与查询中的表达式生成器极为相似。

不过,每个都这么写表达式的话,跟我们直接call函数又有什么区别呢?所以这里我们用代码来完成这一部分工作:
我们知道,VBA里,对于大部分控件来说,都有一个以“on”+“动作(例如,click)”的属性。这个就是控件的事件过程属性,可以用来指定控件的事件过程。例如:
  1. Label0.onClick=MsgLabel([Label0])
复制代码
至此,我们就可以把前面的联系起来了:
  1. Private Sub Form_Load()
  2.     Dim ctr As Control
  3.     For Each ctr In Me.Controls
  4.         If ctr.ControlType = acLabel Then
  5.             ctr.OnClick = "=MsgLabel([" & ctr.Name & "])"
  6.         End If
  7.     Next
  8. End Sub
复制代码
值得注意的是,使用控件时,应该加上方括号,否则将视为字符串来处理。

都懂了吗?不懂的请不要回帖……我已经放弃你了【开玩笑啦】


本帖子中包含更多资源

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

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享 分享淘帖 订阅订阅
2#
发表于 2016-3-19 20:21:34 | 只看该作者
不错不错,我把MsgLabel移回到窗体中,也可以正常运行的。事件处理交回本类中处理更方便!

点评

作用域不一样。一般来说,模块级别的函数(除非使用了private关键字)可以被所有窗体所调用,所以你将这个函数移动到窗体上当然是没问题的。  发表于 2016-3-21 01:30
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-1 12:23 , Processed in 0.092515 second(s), 27 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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