数据库第十二章 窗口.docx
- 文档编号:13355756
- 上传时间:2023-06-13
- 格式:DOCX
- 页数:15
- 大小:29.95KB
数据库第十二章 窗口.docx
《数据库第十二章 窗口.docx》由会员分享,可在线阅读,更多相关《数据库第十二章 窗口.docx(15页珍藏版)》请在冰点文库上搜索。
数据库第十二章窗口
第十二章窗口
12.1窗口概述
窗口是应用程序图形界面的基础,它由属性、事件、函数、控件组成,用户通过窗口及窗口上的控件和菜单表达自己的操作意图。
在PowerBuilder中,窗口是个十分重要的对象,一般用窗口画笔来定义,我们将各种控件、菜单与窗口融合成一个整体作为应用程序与用户交互的界面。
窗口可以显示信息,向用户请求信息,并能响应用户的键盘或鼠标操作。
窗口由四部分组成:
1.属性:
定义窗口的外观及行为(例如,窗口是否有标题条,窗口的颜色、大小、显示位置、边框形状等)
2.事件:
发生在窗口上的事情,通过编写事件处理程序控制对用户操作如何响应
3.函数:
用于操作窗口
4.控件:
放置在窗口中的图形对象,用于请求、显示信息或操作
PowerBuilder提供了六种窗口类型,每种类型都有其特殊用途,下面简单地介绍各窗口类型。
一、主窗口(MainWindow)
主窗口是独立的窗口,它不依赖于其它任何窗口而独立存在,这种类型的窗口既能够覆盖其它窗口,也能够被其它窗口覆盖。
主窗口可以带有菜单,能够被最大化、最小化、或改变大小。
对功能单一的应用,通常选用主窗口作界面基础。
二、弹出式窗口(PopupWindow)
弹出式窗口通常由另一个窗口打开,该窗口一般情况下成为弹出式窗口的父窗口。
弹出式窗口显示在父窗口前面,它既可以移出父窗口,也能够覆盖父窗口,但不能被父窗口覆盖,当父窗口最小化时,弹出式窗口随之隐藏,父窗口被关闭时,弹出式窗口也随之关闭。
根据需要,也可以把弹出式窗口设计成带有菜单、能够被最大化、最小化、或可改变大小的形式。
弹出式窗口用途广泛,它可以显示文字信息,也可以作成图形化的进度提示窗口,还能够用于输入用户的选择。
三、子窗口(ChildWindow)
正如其名字所暗示的那样,子窗口从属于另一个窗口,它总是在主窗口或弹出式窗口中打开,该窗口成为子窗口的父窗口。
子窗口可以在父窗口内部移动,但不能移出父窗口。
当子窗口的一部分移出父窗口时,系统剪裁子窗口,使得只有父窗口内的部分可见。
移动父窗口时,子窗口随之移动,关闭父窗口时,子窗口也随之被关闭。
子窗口可以有标题条,可以被最大化、最小化及改变大小,但它没有菜单,也不能被当作活动窗口。
子窗口在最大化时,它充满父窗口的工作区;子窗口在最小化时,它缩小成图标显示在父窗口的底部。
一般情况下,子窗口应用不多,如果需要子窗口的功能,则应该选用MDI窗口类型,它能够自动完成许多窗口管理工作,避免了一切从头做起的麻烦。
四、响应窗口(ResponseWindow)
响应窗口向用户请求信息,它总是在另一个窗口(父窗口)中打开。
响应窗口被显示时,用户必须关闭了该窗口后才能操作同一个应用程序的其它窗口。
响应窗口不能被最大化、最小化,但可以带有控制菜单。
应用程序中经常使用的About(关于)窗口、MessageBox对话框都是响应窗口应用的具体实例。
五、MDI框架窗口(MDIFrame)和带微帮助的MDI框架窗口(MDIFrameWithMicrohelp)
MDI框架窗口及其子窗口构成了应用程序的多文档界面风格,它有两种形式:
普通的MDI框架窗口和带微帮助的MDI框架窗口,两者的区别在于,后一种框架窗口在底部多了个状态栏,用于显示应用程序简短的当前信息,我们将其称做微帮助(Microhelp)。
典型的MDI框架窗口由标题、菜单、工具栏、客户区、状态栏组成。
12.2窗口属性
窗口属性定义窗口的外观、行为和状态,比如,窗口是哪种类型的窗口、是否要标题、要标题时标题是什么、窗口是否要菜单、窗口的颜色、位置、大小等。
窗口对象的大部分属性均能修改,但也有部分属性系统不允许修改,例如Control[]数组。
下面首先介绍PowerBuilder开发环境中设置窗口属性的步骤,同时分类说明常用窗口属性的作用和用法。
一、在窗口画板上设置窗口属性
设置窗口属性窗口有三十多个属性,在窗口画板上我们可以设置大部分常用的窗口属性,其设置步骤为:
1.打开窗口
2.在窗口属性对话框上设置窗口属性
二、在程序中设置窗口的属性
1.Backcolorlong
设置窗口的背景色
w_1.backcolor=RGB(0,0,255)
2.Centerboolean
设置窗口是否居中显示
w_1.center=TRUE
3.titlestring
设置窗口的标题
w_1.title=”主窗口”
4.Visibleboolean
窗口是否可见
w_1.visible=FALSE
5.Enabledboolean
窗口是否可用
如果该属性是false则窗口变灰对任何操作均不响应
6.位置属性
xintegeryinteger
窗口左上角的坐标
heightintegerwidthinteger
窗口的高度和宽度
12.3窗口事件
什么是事件:
事件指可能发生在对象上的事情。
在Windows系统中,用户的所有操作都由系统自动转化为某个事件,比如,用户移动了鼠标,就会触发当前鼠标指针下对象的MouseMove事件;用户按下键盘上的某个按键,系统就会将这个操作转变成键盘事件。
另外,系统的某些行为也将转换成事件来表现,比如定时器事件。
为了简化应用程序的开发,大多数PowerBuilder对象都预先定义了一组事件。
如果我们想对某个事件作出反应,那么就需要编写该事件的事件处理程序,这样,当相应事件发生时,事件处理程序就会被执行。
如果没有对某个事件编写事件处理程序,那么当该事件发生时,应用程序什么也不做,就像没有发生这样的事件一样。
除了用户操作应用程序能够产生事件外,程序本身也能够主动地触发事件,其目的在于简化编程任务。
当我们对某个事件编写了事件处理程序后,比如编写了窗口的Clicked(单击)事件处理程序,当事件发生时(用户单击了窗口),事件处理程序就会执行,执行完毕后,窗口等待下一个事件的发生。
窗口事件窗口对象具备丰富的预定义事件,有二、三十个。
实际上,不需要对每个事件都编写事件处理程序,而只要对需要响应、需要处理的事件编写事件处理程序。
窗口对象中最常用的事件是Open、Close、CloseQuery、Drag事件、Resize,Timer其它事件普通编程使用不多。
一、open事件
当第一次打开窗口时,在窗口显示之前系统触发Open(打开)事件,在Open事件发生时,系统已经创建了窗口及窗口中的控件,因此,在这个事件的处理程序中,我们能够引用这些对象、修改它们的属性等,例如,在Open事件中可以将某个按钮暂时隐藏起来。
窗口被打开后,窗口类型(WindowType)属性不能再被更改,例如,主窗口类型的窗口只能作为主窗口使用,而不能在事件处理程序中将它更改为响应窗口或弹出窗口。
我们可以在open事件中为,窗口控件设置初值。
下述函数触发窗口的Open事件:
Open、OpenWithParm、OpenSheet、OpenSheetWithParm
二、closequery事件
在开始关闭窗口时,发生该事件,该事件返回一个0或1的返回值。
执行该事件的事件处理程序后,系统检查返回值,如果返回值为1,则窗口不被关闭,通常情况下紧随其后发生的Close事件不被产生;如果返回值为0,则窗口被关闭。
利用该事件的这种特性,程序能够根据当前状态提醒用户保存数据、询问用户是否真要关闭窗口。
例如在关闭窗口前询问是否关闭窗口。
Intret
Ret=messagebox(“请注意”,”是否关闭窗口?
”,question!
yesno!
2)
Ifret=1then
Return0
Else
Return1
Endif
三、close事件
窗口被关闭时发生。
触发该事件后,没有办法能够阻止窗口关闭操作。
一般在该事件中做一些清除工作,清除窗口创建的一些对象。
四、timer事件
在调用Timer函数启动定时器、设定时间后发生。
在应用timer事件编程时,首先要使用timer函数设定定时器,在定时器规定的时间间隔触发timer事件。
Timer(时间间隔)以秒为单位,timer(0)关闭定时器,创建定时器后要注意关闭定时器,因为定时器会消耗内存。
例如:
我们创建一个时钟窗口
在w_1的open事件中设置定时器
timer
(1)
在w_1的timer事件中显示当前时间
st_1.Text=String(Now(),"hh:
mm:
ss")
在w_1的close事件中关闭定时器
timer(0)
五、resize事件
入口参数:
ULongsizetype:
指明改变窗口大小的类型
例如:
0:
(SIZE_RESTORED)窗口不是由于最小化或最大化发生改变
1:
(SIZE_MINIMIZED)由于最小化
2:
(SIZE_MAXIMIZED)由于最大化
Integernewwidth:
窗口新的客户区宽度
Integernewheight:
窗口新的客户区高度
一般我们在这个事件中来改变窗口中控件的大小,使它们按窗口的比例进行改变。
改变窗口大小和位置的操作均会触发该事件
例如:
在窗口w_1的大小发生变化时修改多行编辑器mle_1的大小
1、声明实例变量
intold_width,old_height用于存放窗口的原大小
2、在w_1的open事件中:
old_width=this.width
old_height=this.height
3、在w_1的resize事件中:
intx_bl,y_bl
x_bl=this.width-old_width
y_bl=this.height-old_height
mle_1.width=mle_1.width+x_bl
mle_1.height=mle_1.height+y_bl
old_width=this.width
old_height=this.height
六、拖动事件
dragenter
dragwithin
dragleave
12.4窗口函数
powerbuilder系统为窗口对象提供了30多个函数,我们现在学习常用的几个函数。
一、打开窗口函数
1.格式一
open(窗口[,父窗口])
第一个参数是要打开的窗口名,可以是在窗口画板上定义的窗口,也可以是窗口实例。
第二个参数是该窗口父窗口。
什么是窗口实例?
在窗口画笔中设计好窗口后,在某个事件处理程序中通过Open()函数打开窗口,此后运行程序时窗口才出现在屏幕上。
建立应用时,有时我们希望显示几个结构相同但数值不同的窗口,例如,我们已经有了一个w_person窗口,它用于显示单个人员的信息,现在我们希望通过打开多个w_person窗口同时显示多个人员的信息。
一个通常会想到的办法是,多执行几次Open(w_person)函数,试一试就会发现,屏幕上只有一个w_person窗口.
例如:
1.在窗口画板上定义了窗口w_person,
open(w_person)
2.在窗口画板上定义了窗口w_person(child!
),w_main(main!
),将w_person作为w_main的子窗口打开。
Open(w_person,w_main)
3.打开两个w_person窗口
w_personw_1,w_2
open(w_1)
open(w_2)
2.格式二
动态打开窗口,前一种格式我们在编译程序时已经知道要打开窗口的类型,当我们在写程序时不知道要打开窗口的类型时可以用第二种格式打开窗口。
Open(窗口变量,窗口类型[,父窗口])
窗口变量与父窗口的含义与格式一相同,窗口类型是一个存放窗口类名的字符串(string)。
例如:
stringwindow_type
windoww_open1,w_open2
window_type=”w_person”
open(w_open1,window_type)
open(w_open2,window_type)
二、关闭窗口函数
打开的窗口不再使用时,应该及时将其关闭,以释放系统资源。
关闭窗口的工作由函数Close()实现,其语法格式为:
close(窗口)
使用窗口名:
close(w_main)
使用代词:
close(parent)
close(this)
三、得到窗口上当前鼠标的位置
PointX(),PointY(),得到鼠标当前窗口的坐标。
四、改变窗口位置的函数
1.Move(intx,inty)
将窗口移动到指定的位置。
实际上是修改窗口属性的x,y
2.显示隐藏窗口
show()显示窗口,实际上将窗口的visible属性设置为TRUE
hide()隐藏窗口,实际上将窗口的visible属性设置为FALSE
五、触发事件函数
TriggerEvent()和PostEvent()。
当我们为某个对象的某个事件编写了事件处理程序后,在其它地方(比如函数或其它事件处理程序)就可以调用该事件处理程序,完成这项工作的一个简便方法是使用对象函数TriggerEvent()或PostEvent()。
由于TriggerEvent()函数立即触发相应事件,故将其称为事件触发函数,而PostEvent()函数将事件放置到消息队列的尾部,等待系统来处理,故将其称为事件邮寄函数,下面分别介绍这两个函数。
1.事件触发函数TriggerEvent()
TriggerEvent()函数TriggerEvent()函数能够触发任何对象的事件,并立即执行该事件的事件处理程序,其语法格式为:
objectname.TriggerEvent(event{,word,long}
其中:
objectname是对象或控件名称,将触发该对象或控件的某个事件;
event是要触发的事件,其有效值既可以是标识PowerBuilder事件的TriggerEvent枚举类型值(比如Clicked!
、Modified!
、或DoubleClicked!
等,也可以是表示事件名称的字符串(例如自定义事件"cb_exit_request");
word和long是两个可选参数,触发事件后其值将分别保存到系统全局对象Message的WordParm和LongParm属性中。
例如:
语句:
cb_OK.TriggerEvent(Clicked!
)
触发命令按钮cb_OK的单击事件(Clicked),并立即执行该事件的事件处理程序。
语句:
Parent.TriggerEvent("cb_exit_request")
触发父窗口的自定义事件“cb_exit_request”,并立即执行该事件的事件处理程序。
TriggerEvent()很像函数调用,执行该函数时,程序进入被触发事件的事件处理程序中执行,执行完毕后返回到TriggerEvent()语句下面一行语句继续执行
2.邮寄函数PostEvent()
函数PostEvent()的语法格式为:
objectname.PostEvent(event{,word,long})
各参数的意义与TriggerEvent()函数相同。
虽然语法格式上PostEvent()与TriggerEvent()相同,但PostEvent()函数只是邮寄一个事件,要求PowerBuilder在以后的某个时间执行邮寄事件的事件处理程序,具体时间由PowerBuilder决定,之后当前程序继续执行。
TriggerEvent()通常用做同步调用,因为它等待被调用者执行完毕后才继续运行,而PostEvent()通常用做异步调用,它在发出请求执行信号后就继续运行自己的程序段了。
例子:
在双击窗口w_1时,触发按钮cb_ok的clicked事件
在w_1的doubleclicked事件中:
cb_ok.triggerevent(clicked!
)
或
cb_ok.postevent(clicked!
)
六、在两个窗口之间传递参数
在两个窗口之间传递参数是通过message对象作为媒介,来进行参数传递的。
1.带参数打开窗口
有些窗口应用程序要反复使用,每次使用时都向窗口提供不同的参数,此时,利用带参数打开窗口函数OpenWithParm()既方便又简单。
与Open()函数一样,OpenWithParm()函数也有两种语法格式:
第一种格式打开一个设计程序时就已经知道其类类型的窗口对象,第二种格式打开一个程序运行时才知道其类类型的窗口对象。
我们只介绍第一种。
第一种语法格式为:
OpenWithParm(windowvar,parameter{,parent})
其中,windowvar是你想显示的窗口的名称;parameter是希望传递的参数,该参数将被放置到系统缺省的全局对象Message中。
parameter的数据类型只能是下述三种类型之一:
(1).String,字符串
(2).Numeric,系统支持的所有数值数据类型,包括PowerBuilder的数值数据类型integer、long、decimal、real、double、UnsignedInteger以及当前数据库管理系统支持的数值数据类型。
(3).PowerObject,PowerBuilder系统对象的基类,实际上包括了PowerBuilder的所有对象。
parent是个可选参数,未省略时,由该参数指定父窗口的名称,此时,被打开窗口作为子窗口形式出现。
OpenWithParm()函数返回整型值1表示打开窗口成功,返回整型值-1表示打开失败。
打开窗口时,OpenWithParm()函数把参数parameter保存到系统缺省的全局对象Message中,根据数据类型的不同,在被打开窗口的事件处理程序中,通过检查Message对象的相应属性得到打开函数传递来的参数值,参数类型及Message对象相应属性的对应关系如表。
parameter数据类型及其使用的Message属性
parameter数据类型
使用的Message属性
Numeric
Message.DoubleParm
PowerObject(包括各种对象以及用户自定义结构)
Message.PowerObjectParm
String
Message.StringParm
在被打开窗口中,应该尽早地检查Message对象相应的属性,原因在于该对象是全局对象,其它程序完全可能为其它目的使用该对象。
下面的语句打开窗口w_employee,并用w_employee引用该窗口,打开窗口的同时向窗口传递一个字符串型参数“李方”:
OpenWithParm(w_employee,"李方")
在窗口w_employee的Open事件中,可以用下述语句把OpenWithParm()传递来的参数显示在单行编辑框st_empname中:
st_empname.Text=Message.StringParm
2.带参数关闭窗口
在响应窗口(ResponseWindow)中,我们可以使用CloseWithReturn()函数在关闭窗口的同时向打开该窗口的程序返回一个值。
与OpenWithParm()函数相似,CloseWithReturn()函数同样借用全局对象Message保存返回的值。
CloseWithReturn()函数的语法格式为:
CloseWithReturn(windowname,returnvalue)
其中,windowname是要关闭的窗口;
returnvalue是返回值,该值保存在消息对象Message的属性中。
returnvalue只能是下述三种数据类型之一:
String、Numeric、PowerObject,具体解释请参见OpenWithParm()函数。
下面的语句假设放在某个响应窗口上的某按钮的事件处理程序中,用户单击了该按钮后将关闭窗口,同时返回一个字符串“张三”:
CloseWithReturn(Parent,"张三")
打开响应窗口的程序可通过下述语句得到响应窗口的返回值:
ret_name=Message.StringParm
七、用户自定义窗口函数
自定义窗口函数的过程见书上45页。
窗口函数的使用有静态调用和动态调用两种。
1.静态调用:
是系统省缺的调用函数的方式,是系统在编译代码时就对函数进行彻底的编译,对返回值及入口参数进行检查和匹配,出现问题立即报告错误。
例如:
intvalue=w_1.addfunc()
2.动态调用
在程序执行时才会去查找和调用响应的函数,而在程序编译时可以没有该函数。
优点是程序的开发具有极大的灵活性,缺点降低了程序运行的速度。
Intvalue=w_1.dynamicaddfunc()
12.5窗口的继承
面向对象的特点之一是对象具有继承性,PB的窗口也有继承性。
一、为什么要使用继承
下面两种情况下我们要使用继承:
1.需要创建若干个窗口,这些窗口有一些共同之处。
2.有一个或多个窗口都是在某个窗口上添加一些控件和处理函数得到。
二、怎样建立继承窗口
选择file中的inherient
三、窗口继承后将会将祖先窗口中的控件、代码、事件完全继承下来,后代可以引用祖先的函数、事件以及结构,也可以添加新的函数、控件等。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库第十二章 窗口 数据库 第十二