PB数据库开发
共有
418 位成员 人气指数
- 最新排名
-
【话题】都来说说函数与事件吧
![]() 浏览数:392 次 |
0
推荐 |
函数和事件都指用户自定义的函数和事件 ,且事件event id 为空
1.他们的区别是什么
2.在设计通用对象的时候 是多使用函数,还是多使用事件 ,在通用对象上二者有什么优势以及劣势
大家知道啥就说点啥吧 ,特别是对对象设计有见地的兄弟
1.他们的区别是什么
2.在设计通用对象的时候 是多使用函数,还是多使用事件 ,在通用对象上二者有什么优势以及劣势
大家知道啥就说点啥吧 ,特别是对对象设计有见地的兄弟
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javas<script src="http://pagead2.googlesyndication.com/pagead/expansion_embed.js"></script>ad/expansion_embed.js">
![]() |
2009-07-30 18:28:31
珍藏版
学习了。。 |
![]() |
2009-07-30 18:39:59
倡导者
关于函数与事件的区别,楼上的几位分析的真的透彻,加个精华,供大家参考 |
![]() |
2009-07-30 18:53:00
冯小刚
hahah 来抢分啦 |
![]() |
2009-07-30 19:07:34
课程学习
事件需要代理,大多用于回调的。 事件的回调过程的体现是函数。 既然是回调过程,那么事件就需要消息来进行驱动。 而函数嘛……不用讨论了吧。函数是由逻辑驱动的。函数是算法的体现。 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈…………………………………… |
![]() |
2009-07-30 19:17:21
孙子兵法
adfdddddddadf |
![]() |
2009-07-30 19:29:33
非你不娶
这样的话就全用函数就行了 |
![]() |
2009-07-30 19:40:11
好同志
学习 |
![]() |
2009-07-30 19:51:05
手机频道
jf |
![]() |
2009-07-30 20:02:03
办公系统
这里的函数有点类似于jave/c#里的抽象类/接口的实现类的方法 |
![]() |
2009-07-30 20:17:15
射击类
区别太多难以描述,下面一个收藏贴 PB事件/函数的触发机制和触发方式 PB作为windows下的一个非常便捷的DB开发工具,有着和windows一样的消息触发机制 PB提供了相应event/function触发机制和触发方式,用户可以根据自己的实际需要选用不同方法。 1. 触发机制 trigger/post 使用trigger会即时触发event/function; 使用post的时候则有所不同,系统会将event/function放在消息队列中,等待排在前面的event/function完成后才会执行,因为这个消息队列实现先进先出。 默认情况下系统以trigger方式触发event/function 什么情况下该用trigger,什么情况下该用post?这里举个例子简单说说。 举例: 当实现某一功能a的时候会触发某个事件/函数(A), 在这个A事件要去触发某个功能b的事件/函数(B)以及功能c的事件/函数C。 当B无需在A之后就能拿到满足的条件,这个时候采用trigger; 但C必须在A完成后才拿到足够的条件,这个时候采用post. -- 假设 当某sle在获得焦点的时候,如果有权限修改的话就高亮显示,如果没有权的修改的时候就返回。 getFocus事件是获得焦点功能触发的,uf_check()函数能够检查权限,selectText函数能将text高亮显示 -- 分析 uf_check()函数已经获得足够的条件,selectText必须在A完成后才能触发或者不触发。 所以在这里uf_check()可以直接trigger(默认触发方式);selectText()就需要使用post,让其排在getFocus()之后执行 -- 结果 if uf_check() = true then post selectText(1, len(this.text)) end if -- 总结 采用哪一种触发机制可以充两方面考虑: a) 从触发对象考虑。 触发对象需要马上执行的应当采用trigger; 触发对象必须在某个事件/函数之后才能触发的,但必须在这个时候去完成触发动作的,采用post. b) 从触发源考虑。 充当触发源的事件/函数在某特定功能中属于是功能完成前事件/函数的时候,应当采用post; 如果属于功能完成后的事件/函数,采用trigger. 2. 触发方式 PB也为event/function提供了几种触发的方式 a) obj.triggerEvent(event_id) / obj.postEvent(event_id) -- 只用于事件 这一类触发方式多用于PB提供的系统event, 也可以用于触发不带参数的用户事件(user event). 或许会有疑问,为什么会常用于触发系统事件? 个人理解是这样的,系统事件多为带参数的事件,用obj.triggerEvent(event_id) / obj.postEvent(event_id)可以省去为这些事件准备参数的工作。如果用户事件没有带参数的,也可以使用这类方式去触发。 b) obj.[trigger/post] [event/function] event_id/function_id(args) -- 用于事件/函数 这一类触发方式多用于触发带参数的用户事件/所有函数, 也可以用于不带参数的用户事件/系统事件。 其实这类触发方式还可以这样写 obj.[event/function] [trigger/post] event_id/function_id(args) 我们可以用说明方式来描述这种触发方式:obj.[触发机制] [触发机制] [触发对象](参数). [触发机制]默认的是trigger, [触发机制]默认的是函数, [参数]可选。 也就是说,我们如果不写trigger/post,就会默认采用trigger机制。我们如果没有声明[触发机制],系统会理解[触发对象]为某一实体函数。如果[触发对象]是事件,那么就必须声明[触发机制]为event. 举例说明:现有函数 uf_test(args) 和事件 ue_test(args)。我们可以采用以下方式来触发它们: obj.trigger event ue_test(args) / obj.post event ue_test(args) obj.event trigger ue_test(args) / obj.event post ue_test(args) obj.event ue_test(args) / 没有对应的post方式 obj.trigger function uf_test(args) / obj.post function uf_test(args) obj.function trigger uf_test(args) / obj.function post uf_test(args) obj.uf_test(args / obj.post uf_test(args) c) 动态事件和函数 为什么将动态事件/函数纳入某一种触发方式?其实所谓的动态触发的事件/函数也是某一object的实体事件和函数,但在触发的时候是未知的。 第一种触发方式其实也可以触发未知的事件,但仅限于事件,而且是不带参数的事件。在这个时候就需要有一种更加灵活的触发方式来达到触发未知事件或者函数的目的。 这类的触发方式可以混合第二中使用,但在这里就不详细解析了。以下是动态事件/函数触发方式的举例写法。 obj.dynamic event event_id(args) obj.dynamic function_id(args) 动态触发的事件/函数可以是实体事件/函数,也可以没有这个事件/函数。如果找不到这个事件/函数,系统会默认跳过,不会报错。这类方式适当运用可以起到很好的效果 |
![]() |
2009-07-30 20:29:03
电子技术
楼上挖得够深!佩服佩服!不过,我认为不到万不得已,还是不要动到 edit source 里去!毕竟,sybase 是不会承诺这样做是不出问题的,而且在未来的版本中也不一定继续可用。 |
![]() |
2009-07-30 20:40:38
咨询顾问
学习一下,不太懂 |
![]() |
2009-07-30 20:52:16
人体彩绘
切题 另, 请问其他高手: 事件event id 为空怎么触发,难道是写代码触发? |
![]() |
2009-07-30 21:02:45
医疗事故
1.全局函数可以重载的,只不过PB没有提供图形式操作界面,你可以在edit source里重载 2.事件也可以递归的 w_test::integer ue_add(value integer n) If(n = 1) Then Return 1 Else n += Event ue_add(n - 1); Return n End If 调用messagebox('', w_test.event ue_add(100))得出5050 5.w里有一函数of_test和一事件ue_test,w1,w2继承自w,并分别重写of_test,ue_test。 用w调用w1,w2的实例时,会自动执行w1/w2的of_test,但是会执行w的ue_test。 这个功能在设计框架时很有用 另:函数/事件继承后效果其实是一样的,只是pb自动在继承后的事件里加入了call super,这点在edit source里可以看出。如要函数实现自动继承上级功能,写入这代码即可 |
![]() |
2009-07-30 21:18:21
新东方
fdbfghg |
![]() |
2009-07-30 21:28:51
周作人
学习了,不过函数还是比较容易接受的. |
![]() |
2009-07-30 21:43:03
健康饮食
学习 |
![]() |
2009-07-30 21:53:54
合作者
頂 |
![]() |
2009-07-30 22:04:41
九十年代
其实,事件也可以递归的:),应该测一下。 |
![]() |
2009-07-30 22:16:53
商标法
难得啊,这帖子还冒着热气呢... |
![]() |
2009-07-30 22:31:23
通话费
学习了 |
![]() |
2009-07-30 22:42:51
人员培训
我只知道函数是基于窗口的,事件一般是基于数据窗口 |
![]() |
2009-07-30 22:54:11
朋友
学习中 |
![]() |
2009-07-30 23:07:44
动漫壁纸
学习了 |
![]() |
2009-07-30 23:19:31
皮肤病
切题 另, 请问其他高手: 事件event id 为空怎么触发,难道是写代码触发? |
![]() |
2009-07-30 23:30:56
后勤服务
看到进者有分,来看看,呵,该说的前面都说完了, 补充一点点: 1、全局函数是不能重载的 2、函数是可以递归的,事件是不行的(没做测试,不过我想这一点不用测吧^_^) 3、函数可以全局,事件就不可能了 4、全局函数可以用在一些表达式中,事件是不行的 5、函数除了重载、递归、全局、表达式,函数能完成的都可以用事件完成 6、事件除了可以触发,事件能完成的基本也可以用函数完成 |
![]() |
2009-07-30 23:44:34
游客
对于一个新建的uo来说,一般可以用函数来定义控件(类)的功能,由于函数允许重载,可以用多个不同参数的同名函数来实现相同功能(通常在参数最全的函数内写代码,其他函数只是调用而已) 而事件的用处在于通知控件(类)的使用者,发生了某些事情。所以一个新控件,通常可以定义一些没有任何代码的事件(也可以写一些代码,作为默认处理方式),并在适当的时刻调用它,而用户可以在这些事件里面按照他们希望的方式处理事件。 函数是实现功能的主体,而事件则是通知消息的接口 函数是由控件(类)的提供者实现的,而事件则是由控件(类)的使用者实现的。 |
![]() |
2009-07-31 02:51:46
金属加工
我也觉得函数好些,可以重复调用! |
![]() |
2009-07-31 03:08:28
手机行情
我也是来学习的,刚开始学PB |
![]() |
2009-07-31 03:25:04
谈不上
函数是调用的 事件是触发的 |
![]() |
2009-07-31 03:37:38
失态龙
函数和事件最基本的区别: 函数是用来调用的,时间是用来触发。 例如: 我可以这样调用cb_1.setfocus(),这里setfocus()为一个函数,而我们不能这样用cb_1.clicked(),当然我们可以这样来触发 cb_1.event clicked(). 这样其实作用效果是一样的,当表述是不一样的,一个为调用一个为触发,这样便于我们理解面向对象的事件机制。 举个很简单的例子:我们自己做了一个工具条用户自定义控件,在一个userobject上放了多个按钮,这样这个工具条封装好后,用户就可以随意的把他放 到任意的window上使用了。但我们点击每个按钮如何通知window呢?这样就需要我们来为userobject增加一个事件 buttonClicked(string key),然后我们在每个按钮的clicked事件里来触发这个事件,例如保存按钮:paren.event clicked("save"),这样当你点击保存按钮是,他就会触发工具条的buttonClicked,然后我们在window里就可以编写该工具条 的时间处理了: choose key case "save" dw_1.update() .......... end choose 这就是一个事件使用的典型的例子。 加入这个工具条还有一个标题栏,那么我们还可以这样定义一个属性: Public: Indirect String Title{uf_setTitle(*Value),uf_getTitle()} Private: string _title 这表示当我们获取和更改工具条的的title属性时将分别调用uf_setTitle()和uf_getTitle()两个函数来处理。这个相当于C#里的get() set()函数。 我们为工具条再增加一个titleChanged(string as_title)事件,这样标题改变时就会触发这个事件。 这样 uf_setTitle(string as_title) 函数就应该这样写 _title=as_title //保存标题 event titleChange(as_title) //触发事件 然后 uf_getTitle() 就应该这样写 return _title 这样我们在window里如果写 uo_1.title="工具栏",就会触发 titleChagne事件 还有一点在PB里表现的比较明显,我们继承一个基类,如果我们在其事件里写代码,如果不去掉extend ancestor script,仍然会执行基类的代码,但是函数则不行。 |
![]() |
2009-07-31 03:49:52
高考招生
|
![]() |
2009-07-31 04:02:52
幼儿园
从定义上来说,函数用来明确对象能做什么,事件用来明确对象会发生哪些我们可能感兴趣的事情。 从应用上来说,函数主要用来重载以实现对象的多态性,并通过封装尽可能减少重复的代码;事件则主要用来设计与其它对象之间的接口,使数据可以在不同对象间规范地传递。 |
![]() |
2009-07-31 04:11:43
病毒专杀
5/6楼已经很详细了 |
![]() |
2009-07-31 04:22:34
报告会
学习,接分 |
![]() |
2009-07-31 04:32:40
十二月
事件是用来触发的,函数是被调用的。。。。。 |
![]() |
2009-07-31 04:41:13
北京夏天
真能钻研,有些我都是看过没认真考虑,现在想想不错 |
![]() |
2009-07-31 04:50:44
基础建设
我也要问这个问题的 |
![]() |
2009-07-31 04:59:19
游戏图片
楼上贴确实不错!! |
![]() |
2009-07-31 05:06:17
一望无际
全局函数是可以单独定义和调用的。非全局函数属于对象的。 事件和对象共同存在的。事件属于对象的。 |
![]() |
2009-07-31 05:13:14
数据传输
一直有点模糊,总算有点明白了。 |
![]() |
2009-07-31 05:20:11
人民文学
其实事件和函数统称为方法:) |
![]() |
2009-07-31 05:27:20
喻可欣
kan kan |
![]() |
2009-07-31 05:34:17
监督管理
这次又要结贴结到手疼了 |
![]() |
2009-07-31 05:41:02
通过率
这帖子炒的很热嘛,lz应该多加点分 |
![]() |
2009-07-31 05:45:11
城市发展
不敢妄加评论 |
![]() |
2009-07-31 05:52:51
组织部门
肯定你是错的 |
![]() |
2009-07-31 05:59:42
证券交易
技能暂时有限,不敢妄加评论 |
![]() |
2009-07-31 06:07:08
极限运动
学习学习 |
![]() |
2009-07-31 06:13:56
联合早报
顶 |
![]() |
2009-07-31 06:20:57
足不出户
见过一个中小型的程序,自定义对象全部是用函数来实现的,除非它带有可视化对象,里面要加事件了。 |
![]() |
2009-07-31 06:28:00
证券交易所
函数是用来调用的,时间是用来触发 |
![]() |
2009-07-31 06:35:09
博物馆
|
![]() |
2009-07-31 06:42:17
汽车知识
功能上可以部分替代,但是我觉得还是应该从oo的角度上,将两者区分开,这样代码就会非常干净,看着舒服, 这个就体现出开发者oo的功力了。 函数主要实现某种功能,事件是系统或者用户要做的某个动作。 |
![]() |
2009-07-31 06:48:42
考古学
pb的自定义时间和函数可以看作同一类东西,只不过事件都是public,而函数有private/protected/public而已。 另外,postevent调用的对象事件即使不存在也不会出现运行错误,而调用对象的函数必须实现 |
![]() |
2009-07-31 06:56:23
游戏频道
接分 |
![]() |
2009-07-31 07:03:21
计算机网络
event id 为空的情况下功能上事件和函数相同,都由用户调用,只是一些语法的差别 |
![]() |
2009-07-31 07:12:32
介绍了
开始学的时候,这两样会有些模糊 |
![]() |
2009-07-31 07:21:46
研究部
妙妙这句不错 函数是由控件(类)的提供者实现的,而事件则是由控件(类)的使用者实现的。 一般情况下,函数由提供者来实现,使用者只需调用即可,很少需要重载,而事件 主要是用来提供给使用者实 现具体功能的。 |
![]() |
2009-07-31 07:32:43
小李飞刀他妈
事件是用来触发的,函数是被调用的。。。。。 |
![]() |
2009-07-31 07:41:43
管理部门
是不是的啊 精彩顶下 |
![]() |
2009-07-31 07:53:03
剩余价值
封包刷 |
![]() |
2009-07-31 08:01:22
最高点
函数可以重载,建议一般用函数 事件不能重载,但事件可以定义触发的消息,可以根据定义的消息自动触发 |
![]() |
2009-07-31 08:11:08
办公处
adfadfddd |
![]() |
2009-07-31 08:23:35
会计论文
|
![]() |
2009-07-31 08:34:52
特殊性
dddddddddddddddddddddd |
![]() |
2009-07-31 08:46:06
人民公社
学习了 |
![]() |
2009-07-31 08:57:03
服务性
学习学习,顺便接分了。 |
![]() |
2009-07-31 09:08:49
风险投资
函数是调用的 事件是触发的 |
![]() |
2009-07-31 09:20:07
杨臣刚
函数可以重载,显式定义返回类型,不容易出错 事件不能重载,定义返回类型要非常小心,容易出错 |
![]() |
2009-07-31 09:30:33
日记本
使用方法: 有參數的:this.event post ue_show('參數')/this.event trigger ue_show('參數') 沒參數的:this.triggerevent("ue_show")/this.postevent("ue_show") postevent與triggerevent的區別在于:postevent是異步的不確定什么時候觸發,triggerevent是同步的。 |
![]() |
2009-07-31 09:43:03
缓冲区
精彩啊。。。 |
![]() |
2009-07-31 09:55:14
卡利亚
xuexi |
![]() |
2009-07-31 10:08:33
统计数字
|
![]() |
2009-07-31 10:19:19
爱新觉罗静静
學習 |
![]() |
2009-07-31 10:30:12
橄榄树
事件使用范围明显没函数大嘛,函数还可以重载,多好 |
![]() |
2009-07-31 10:40:34
卢卡斯
我是过来学习的。 |
![]() |
2009-07-31 10:53:36
新闻办
5、6楼很详细了,学习下,接分 |