- I'm VC 首页
- Visual C++
- C++
- C语言
- Visual C#
- DotNet
- VB.Net
- Java
- Android
- Visual Basic
- Delphi
- 汇编
- F#
- 软件架构
- 数据结构/算法
- 软件工程
- Web开发
- |ASP.Net
- |PHP
- |JSP
- |ASP
- |JavaScript
- |AJAX
- |Silverlight
- |Flex
- |JQuery
- |prototype
- |MooTools
- |ExtJS
- |dojo
- 数据库
- |Oracle
- |MSSQL
- |MySQL
- |DB2
- |Sybase
- |PowerBuilder
- |Access
- |其他数据库
- |存储技术
- |数据库基础/原理
PB中的指代词
作者:达通兴电脑科技公司(www.study01job.com) 郭宝利
PowerBuilder提供了4个指代词,它们是This,Parent,ParentWindow,Super,可以代替对象名称来引用对象,从而增强程序的可移植性。例如,假设在窗口w_main中,按键“退出”的Clicked事件上有语句Close(w_main),可以关闭窗口w_main,当窗口名称改变时,必须修改该语句才能正确执行;使用指代词就不同了,Close(parent)可以在窗口名称发生变化时仍然能够正确执行,并且该控件拷贝到其他窗口中不加修改仍然可以正确使用。
指代词根据脚本所在对象周围环境的不同而指代不同的对象。比如,在窗口上的按键,它的Clicked事件中,脚本的Parent就是指代按键所在的窗口;可视用户对象内,按键Clicked事件中,脚本的Parent就是指代按键所在的用户对象。表5-3列出了各个指代词可以在哪些对象中使用以及所指代的对象。
表5-3 指代词
指 代 词使 用 位 置含 义
Parent窗口中的控件父窗口
可视用户对象中的控件用户对象
菜单上一级菜单
This窗口、定制用户对象、应用对象、控件对象或控件自身
ParentWindow菜单运行时菜单所在的窗口
Super子对象或控件父对象或控件
子窗口或用户对象直系祖先
子窗口或用户对象中的控件用户对象的直系祖先
下面再对这些指代词做详细介绍。
1.This
指代词用于引用当前对象。This指代词代表脚本所在的对象,虽然和直接使用该对象的名称作用相同,但是对象更名或者将脚本拷贝到其他对象的事件中时,This具有更好的通用性,使用This指代词可以类属地引用为其编写脚本的对象,这样,开发人员不必将脚本指向一个特定的对象名称来编写代码。例如,在按键中编写脚本时使用This,可以理解成是为按键这个类编写脚本,而不仅仅是为当前按键编写脚本。这有利于开发人员开发更通用的脚本。
在对象或控件的脚本中,开发人员可以不加指代词This或本身的对象名来引用对象或者控件的属性,但是,良好的编程风格应该提倡使用指代词This,使脚本更清晰易读。例如,下面是一个按键Clicked事件下的语句,省略了指代词This仍能够完成this.x=this.x+50所完成的任务:
x=x+50
但是,如果上面的语句所在脚本中定义了变量x,脚本的执行就不能完成预期的功能了。PowerBuilder在变量处理时,认为x是变量而不是按键的X坐标了。当有同名的全局变量和实例变量时,PowerBuilder将会首先找到全局变量,需要引用本地变量,就必须使用指代词,因为实例变量是属于窗口或用户对象的,指代词应该指代窗口或者用户对象。所以,在窗口或用户对象中编程则使用指代词This,在窗口中的控件或用户对象中的控件上编程则指代词是parent。例如,某窗口中有一个和全局变量test_str同名的实例变量,在该窗口中引用该实例变量的语句是this.test_str,在该窗口的控件上引用该实例变量的语句是parent.test_str,当然,全局变量可以直接使用。
在函数的参数中也可以使用this,用来传递调用函数的对象。例如:
wf_SetPosition(this)
2.Parent
指代词Parent用于引用包含当前对象的对象。在窗口或用户对象的控件中,Parent指代窗口或者用户对象;在菜单中,Parent指代包含当前菜单项的上一级菜单。例如,在窗口的“改变标题”按键上编写如下脚本:
If parent.title="实验窗口" Then
parent.title = "hello!"
Else
parent.title = "实验窗口"
End If
用户点击该键会看到窗口的标题在“实验窗口”和“hello!”两个之间来回切换。在窗口w_main的“退出”按键上使用close(parent)和close(w_main)语句是相同的,前面的更通用些,即使窗口的名称改变了,程序仍然能够正常运行。
在定制的用户对象内,使用Parent的任何控件都是引用用户对象本身,而不是引用放置用户对象的窗口;需要访问用户对象的父对象时不能使用Parent了,只能使用GetParent()函数。在标准用户对象中,Parent仍然指代用户对象放置的对象。例如,某可视用户对象中有一个“关闭”按键用来关闭该用户对象所在的窗口,就应该在该按键的Clicked事件上编写如下脚本:
Close(GetParent(parent))
3.ParentWindow
该指代词只用于菜单中,用来指代在运行时和菜单所联系的窗口。例如,在菜单项“关闭”的Clicked事件中可以编写下面脚本,用来关闭和该菜单关联的窗口:
Close(ParentWindow)
当然也可以使用窗口名称。比如窗口w_main上的菜单项Clicked事件中,Close(ParentWindow)和Close(w_main)功能是相同的。当编写MDI类型的应用软件时,可能多个名称不同的窗口使用同一个菜单,使用语句Close(w_main)就不行了。
除了使用ParentWindow的通用性比直接使用窗口名的通用性要强外,它们之间实际上还有其他的区别。假设窗口w_main中包含静态文本控件st_1,下面两个语句虽然在逻辑上是完全相同的,但是下面的语句就是错误的:
ParentWindow.st_1.text = "测试"//该语句是错误的,编译不能通过
而下面语句就是正确的:
w_main.st_1.text = "测试"//能够正确运行。
所以,这些语句要慢慢体会,尤其这些逻辑上相同但实际却不同的语句。写出上面的语句,无非想构造比较通用的程序。在一个对象中直接修改其他对象中的内容,这种设计是不合理的,导致了环境耦合。好的方法是在菜单项中触发父窗口的某个事件,通过窗口的事件脚本让窗口自己来修改自己的内容,这样一个菜单挂到几个窗口上都可以使用相同的脚本,只要窗口中自定义事件不同就可以了。可以如下修改:
在菜单项中编写:parentWindow.TriggerEvent('ue_menupost')
在窗口的ue_menupost事件中编写: st_1.text = '测试'
4.Super
该指代词只有在处理继承时才使用,用来引用后代对象的祖先。使用祖先名称也可以引用,但是更为通用的是Super。例如,想调用父对象的Clicked事件处理程序时,子对象中可以这样写:
CALL Super::Clicked
当调用在子类中被重载的父对象的函数时,也可以使用super来指代父对象,例如,子对象重载了父对象的函数f_func(),在子对象中调用父对象的f_func()函数的语句可以这样编写:
Super::f_func()
2011-07-02 14:47
阅读: 次
I'm VC , Just U know Y
本站部分文章来源于互联网,版权归原作者所有。
延伸阅读: