ID #18013

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
本站部分文章来源于互联网,版权归原作者所有。

延伸阅读:

PB动态创建菜单的核心算法描述

请问怎么向动态菜单中加入程序

PB如何取服务器的时间

PB公用错误捕获模块的开发

深入了解PB数据窗口数据录入的处理机制