




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第9章 用户自定义事件用户自定义事件实质上就是除了PowerBuilder已给出事件外任何用户自己定义的事件,它包括两层含义,一是Windows本身是产生这个事件的,只是PowerBuilder没有具体列出来,可以自己根据需求来选用设置。比如说对Picture控件来说,它是存在鼠标移动事件的,但在事件列表中没有mousemove事件,得用户自己设定一下该事件的ID号。二是编程人员为了避免写重复代码而将这段代码加入到用户自定义事件中,在其他事件中可直接调用该自定义事件即可。9.1 定义用户事件事件是从属于某个对象的,因此定义用户事件,首先双击对象进入脚本窗口,如图9-1所示选择(New Even
2、t),进入用户自定义事件窗口,如图9-2所示。选择对象选择New Event图9-1 定义用户事件图9-2 用户自定义事件窗口图9-2中,Event Name(用户事件名)和Event ID(用户事件号)是必须要输入的,其它则由用户决定。为了和系统预定义的事件区分,用户事件名通常以ue_开头。Event ID是以pbm_为前缀的事件标识,分为两种。一种是Windows所提供的事件编号,但PowerBuilder没有直接给出该事件,需要针对该Event ID作自定义事件的,在应用程序中该事件发生时会自动执行该用户自定义事件的脚本。另一种是用户自己定义的Event ID,PowerBuilder给
3、出从pbm_custom01到pbm_custom75共75个Event ID供使用。选择一个Event ID后,参数名、类型、个数会自动显示,用户不能修改。若想定义带参数的用户事件,则Event ID必须选None。9.2 用户事件号为某一对象定义用户事件时,选择的Event ID应与所在的对象相吻合,否则该用户事件不起作用。表9-1列出常见的Event ID含义。表9-1 常见的Event ID含义事件号含义单选或多选按钮消息(前缀:pbm_bm)pbm_bmgetcheck单选按钮或多选按钮是否被选pbm_bmgetstate按钮是否加亮pbm_bmsetcheck无线按钮或确认将框的选
4、中状态改为未选中状态,反之亦然pbm_bmsetstate加亮或不加亮按钮pbm_bmchange改变按钮的风格,例如,改为单选按钮或组合框单选或多选按钮通知消息(前缀:pbm_bn)pbm_bnclicked按钮控件被点中pbm_bndisable使按钮控件无效pbm_bndoubleclicked按钮控件被双点pbm_bndragdrop一个对象被放到按钮控件pbm_bndragenter一个对象被拖到按钮控件pbm_bndragleave一个对象被拖离按钮控件pbm_bndragover一个对象被拖经按钮控件pbm_bnhilite按钮控件被加亮pbm_bnpaint按钮控件被绘制pbm
5、_bnsetfocus按钮控件获得聚焦pbm_bnunhilite按钮控件不被加亮通用对话框消息(前缀:pbm_cb)pbm_cbaddstring将字符串加到通用对话框pbm_cbdeletestring从通用对话框删除一个字符串pbm_cbdir加一个目录列表到通用对话框pbm_cbfindstring搜索以一组字符开头的字符串pbm_cbfindstringexact搜索与所提供的字符完全匹配的字符串pbm_cbgetcount列表框中的项数pbm_cbgetcursel当前被选项的数目pbm_cbgetdroppedcontrolset列表框在屏幕上的坐标位置pbm_cbgetedit
6、sel编辑器控件中被选字符的范围pbm_cbgetextendedui缺省或扩展的用户界面pbm_cbgetitemdata重画的列表框中的4字节(32位)项pbm_cbgetitemheight列表框中某一项的高度pbm_cbgetlbtext列表框中的文本pbm_cbgetlbtextlen列表框中文本的长度pbm_cbinsertstring向列表框中增加新的字符串或4字节项pbm_cblimittext限制能被输入到列表框中的字符数pbm_cbresetcontent删除列表框中所有元素pbm_cbselectstring搜索匹配的字符串并显示pbm_cbsetcursel在列表框中选
7、择并显示一项pbm_cbseteditsel在列表框的编辑区域中选择一块文本pbm_cbsetextendedui设置缺省或扩展的用户界面pbm_cbsetitemdata在列表框中设定4字节(32位)项pbm_cbsetitemheight设置列表框中项的高度pbm_cbshowdropdown转换(显示或隐藏)列表框中拖放区域通用对话框通知消息(前缀:pbm_cbn)pbm_cbndblclk用户在列表中某一项上双点pbm_cbndragdrop一个对象被放到通用对话框控件上pbm_cbndragenter一个对象被拖到通用对话框控件上pbm_cbndragleave一个对象被拖离通用对话
8、框控件pbm_cbndragover一个对象被拖经通用对话框控件pbm_cbndropdown列表框的下放区域即将被显示pbm_cbneditchange编辑器控件中的文本发生变化pbm_cbneditupdate列表框编辑器控件中的文本即将被改变pbm_cbnerrspace列表框满,不能再向其中加入项pbm_cbnkillfocus通用列表框失去聚焦pbm_cbnselchange列表框中被选文本被改变pbm_cbnselendcancel用户按下了"取消"按钮pbm_cbnselendok用户按下了"确认"按钮pbm_cbnsetfocus通用对话
9、控件拥有聚焦数据窗口消息(前缀:pbm_dw)pbm_dwclosedropdown关闭下拉式数据窗口pbm_dwscrollend在数据窗口中卷滚到最后一行pbm_dwscrollhome在数据窗口中卷滚到第一行pbm_dwscrolllineend卷滚到当前行的行尾(水平方向)pbm_dwscrolllinehome卷滚到当前行的行首(水平方向)数据窗口通知消息(前缀:pbm_dwn)pbm_dwnbacktabout即将通过Shift+Tab组合键离开该控件pbm_dwnchanging控件即将被改变pbm_dwndropdown下拉式列表框的下拉部分即将可见pbm_dwngraphcr
10、eate即将创建图形pbm_dwnitemchangefocus数据窗口控件中当前项的聚焦改变pbm_dwnitemvalidationerror对当前项的修改引起了一个合法性检查错误pbm_dwnkey有键被按下。使用KeyDown()处理键盘值pbm_dwnlbuttondown鼠标左键被按下pbm_dwnlbuttonup鼠标左键被松开pbm_dwnmbuttonclk鼠标中键点击pbm_dwnmbuttondbclk鼠标中键双击pbm_dwnmousemove鼠标移动pbm_dwnprintmarginchange打印边界被改变pbm_dwnprocessenter回车键被按下pbm_
11、dwnrowchange数据窗口中聚焦从一行转向另一行pbm_dwntabdownout用户在数据窗口最后一行按了下箭头键pbm_dwntabout用户在数据窗口的最后一行/列中按了tab键pbm_dwntabupout用户在数据窗口第一行中按了上箭头键动态数据交换(DDE)消息(前缀:pbm_dde)pbm_ddeddeack收到一个DDE消息pbm_ddeddeinitiate开始一个DDE会话pbm_ddeddeterminate终止一个DDE会话编辑器控件消息(前缀:pbm_em)pbm_emcanundo编辑器控件是否能撤消上一次修改pbm_ememptyundobuffer清空由W
12、indows管理的取消操作的缓冲区pbm_emfmtlines在多行编辑器控件的行尾增加或删除回车换行pbm_emgetfirstvisibleline返回编辑器控件中可见的第一行的行号pbm_emgethandle获得编辑器控件使用的内存句柄pbm_emgetline从编辑器控件中复制一行到内存中的一个缓冲区pbm_emgetlinecount返回多行编辑器控件的行数pbm_emgetmodify文本是否被用户修改pbm_emgetrect返回控件的长方形域pbm_emgetsel返回被选文本的起始位置pbm_emlimittext限制用户键入的文本长度pbm_emlinefromchar返
13、回被选文本的行号pbm_emlineindex返回编辑器控件中被选行第一个字符在编辑串中的位置pbm_emlinelength返回编辑器控件中被选行中的字符数pbm_emlinescroll水平或垂直卷滚编辑器控件pbm_emreplacesel从剪贴板或从键盘上用新文本替换被选文本pbm_emsethandle设置编辑器控件的句柄指向内存中的一个缓冲区pbm_emsetmodify设置编辑器控件的modified标志pbm_emsetpasswordchar设置用户输入任何文本时显示的字符,在输入密码时的显示pbm_emsetrect设置/重置编辑器控件所在的长方形区域,编辑器控件中的文本被
14、重画pbm_emsetrectnp除了不重画文本,大致与setrect相同pbm_emsetsel选择字符pbm_emsettabstops在多行编辑器控件中设置tabstopspbm_emsetwordbreak设置新的词拆分函数pbm_emsetwordbreakproc设置新的词拆分过程pbm_emundo撤消最近的编辑操作编辑控件通知消息(前缀:pbm_en)pbm_enchange编辑器控件中的文本发生改变pbm_enerrspace编辑器控件内存缓冲区溢出pbm_enhscroll用户点中上水平卷滚条pbm_enmaxtext用户试图输入比允许更多的文本pbm_enupdate编辑
15、器控件即将显示用户的修改pbm_envscroll用户点中了垂直卷滚条列表框消息(前缀:pbm_lb)pbm_lbaddstring向列表框控件中增加一项或一个字符串pbm_lbdeletestring从列表框中删除一项或一个字符串pbm_lbdir用目录列表填充列表框pbm_lbfindstring在列表框中搜索与所给字符串部分匹配的第一项pbm_lbfindstringexact在列表框中搜索与所给字符串精确匹配的第一项pbm_lbgetcaretindex在列表框中搜索拥有聚焦的项pbm_lbgetcount确定列表框中的项数pbm_lbgetcursel确定所选项是第几项pbm_lbg
16、ethorizontalextent获得列表框的宽度、计算水平卷滚pbm_lbgetitemheight确定列表框控件中项的高度pbm_lbgetitemrect确定列表框的尺寸pbm_lbgetsel获得列表框中当前所选的项pbm_lbgetselcount在多选列表框中获得所选项的数目pbm_lbgetselitems用列表框中表框各自的项号填充一个给定的整数数组pbm_lbgettext获得列表框中当前所选项的文本pbm_lbgettextlen获得列表框中当前所选项的文本中的字符数pbm_lbgettopindex确定列表框中可见的最上面一项的项号pbm_lbinsertstring向
17、列表框中加入一个新字符串pbm_lbresetcontent重置(消除)列表框中的内容pbm_lbselectstring搜索并加亮与所给字符匹配的字符串pbm_lbselitemrange选择/取消列表框中某一范围中的项pbm_lbsetcaretindex设置列表框中的某一项拥有聚焦pbm_lbsetcolumnwidth设置列表框中列的宽度pbm_lbsetcursel在列表框中选择并加亮一项;如果需要,卷滚到列表框pbm_lbsethorizontaltext设置列表框中被水平卷滚的单元数pbm_lbsetitemdata设置与列表框相关的32位/4字节值pbm_lbsetitemhe
18、ight设置列表框中项的高度pbm_lbsetsel在列表框中选择一个字符串pbm_lbsettabstops设置列表框控件中tabstops的位置pbm_lbsettopindex卷滚列表框使特定的项成为可见的最上面一项列表框通知消息(前缀:pbm_en)pbm_endblclk用户在列表框控件中的某一项上双击pbm_enerrspace用户试图超越可在列表框中输入字符的最大限制pbm_enselcancel当前选取文本被取消pbm_enselchange用户在列表框中选择或取消了一项窗口消息(前缀:pbm_)pbm_activateapp被激活的窗口属于另外一个应用pbm_askcbfor
19、matname要求剪贴板中的内容被复制到一个使用自定义格式的文本缓冲区中pbm_char传送键盘上按下的键pbm_chartoitem通过转换键盘来的字符,帮助列表框定位其中的项pbm_childactivate一个子窗口被移动或激活pbm_clear用户要删除当前编辑器控件中的内容pbm_command用户选择了一个菜单项、控件,或使用了加速键pbm_compacting系统内存资源不足;当Windows占用了多于1/8的CPU时间紧缩内存时,产生这条消息pbm_compareitem当新的一项被加入列表框或组合框时产生此消息,Window用这条消息进行项之间的比较pbm_ctlcolor一
20、个控件即将被画出,可在此时改变控件的颜色pbm_deadchar用户选择了一种非英语字符集或其它特殊字符集,这将改变下面将要输入的字符pbm_deleteitem从列表框或通用对话框中移去一项pbm_destroyclipboard剪贴板内容被清除pbm_devmodechangedpbm_drawclipboard剪贴板内容发生改变pbm_drawitem列表框或通用对话框的一项内容被改变pbm_dropfiles当鼠标左键在一个注册为拖放文件接受器的应用上释放时,发出该消息pbm_erasebkgnd窗口的客户区需要重画pbm_fontchange应用可用的字体数改变pbm_getdlgc
21、ode通知消息,说明当前使用哪种类型的键盘pbm_getfont获取当前激活的字体pbm_getminmaxintoWindows正在检查最小化或最大化窗口的尺寸pbm_gettext从一个控件(如按钮或编辑器控件)中复制文本到一个内存缓冲区pbm_gettextlength用来确定一个控件中的字符数pbm_hscrollclipboard剪贴板的水平卷滚条被使用pbm_iconerasebkgnd一个最小化窗口需要重化背景pbm_initdialog一个对话框即将被显示pbm_initmenu一个菜单即将被显示pbm_initmenupopup一个弹出式窗口即将被显示pbm_keydown键
22、盘上的一个键被按下pbm_keyup键盘上的一个键被释放pbm_mdiactive一个MDI子窗口(表单)被激活pbm_mdicascade以重叠的形式重排所有的表单pbm_menuchar用户使用了一个快捷键,但系统不支持该快捷键pbm_menuselect用户选择了一个菜单项pbm_mouseactivate用户在一个非活动窗口中点击了鼠标pbm_mousemove用户移动了鼠标pbm_ncactivate窗口的非客户区即将被激活pbm_nccalcsize窗口的尺寸需要重新计算pbm_nccreate窗口即将创建它的非客户区pbm_ncdestroy窗口的非共享区被析构pbm_nchit
23、test每次非客户区被移动时都发送该消息pbm_nclbuttondblclk用户在非客户区双点了鼠标左键pbm_ncpaint非客户需要画出pbm_nextdlgctl在对话框中将聚焦转给另一个控件pbm_paint窗口的客户区需要被画出pbm_paintclipboard剪贴板应用有剪贴操作,剪贴板查看器需重画pbm_palettechanged系统调色板被改变pbm_paletteischanging系统调色板即将被改变pbm_parentnotify通知父窗口一个子窗口即将被创建pbm_querydragicon用户要拖一个最小化窗口pbm_queryendsession通知消息,说明
24、窗口即将被关闭pbm_querynewpalette应用即将收到输入聚焦,应该执行必要的颜色调整pbm_queryopen一个最小化窗口即将被恢复pbm_quit应用处理的最后一个消息pbm_renderallformats通知一个剪贴板格式的拥有者,应用将失去所有的格式pbm_renderformats通知消息,说明放在剪贴板中的数据应该用一种特殊格式传送pbm_setcursor通知消息,说明鼠标指针在一个窗口中移动pbm_setfont用来在对话框中改变字体pbm_setredraw在加一个新项之前发送给列表框或通用对话框pbm_settext用来改变窗口的标题或文本pbm_sizecl
25、ipboard剪贴板查看器应用改变尺寸pbm_spoolerstatus一个打印管理器任务被添加或删除pbm_syschar<ALT>键和其它某键同时被按下pbm_syscolorchange一种或多种系统颜色被改变pbm_syscommand用户选择了一个系统菜单命令pbm_sysdeadchar通知消息,说明一种非英语字符集被选定bm_syskeydownp用户按下某键的同时按下了<ALT>键pbm_vscroll用户点击了垂直卷滚条9.3 删除用户事件自定义的用户事件号及事件名称不能更改,如果出现自定义事件与需求的不符,只能删除。删除的方法是:在该事件的脚本代码窗
26、口中右击,在弹出式菜单中选择Delete Event即可。但需注意的是PowerBuilder不会作任何有关删除的提示。9.4 触发用户事件定义了用户事件后,就需要设计事件处理程序,就像其他系统常用事件一样,没有事件处理程序,即使发生了该事件,应用程序也不做任何处理。如果选用的事件号对应于某个Windows消息(如表9.1),则事件何时发生,将由系统决定,就像其他系统常用事件一样被自动触发。如果选用的事件号为pbm_custom01到pbm_custom75,则必须使用TriggerEvent()函数或PostEvent()函数触发该事件。这两个函数的语法格式为:object_name. Tr
27、iggerEvent(event_name)object_name. PostEvent(event_name)其中:object_name为对象名,event_name为事件名,对系统事件而言,是枚举类型,如Clicked!等,对用户自定义事件而言,是一个字符串。例如:cb_2. triggerevent(Clicked!) /触发命令按钮cb_2的鼠标单击事件cb_2. triggerevent("ue_color") /触发命令按钮cb_2的用户自定义事件ue_color TriggerEvent和PostEvent的区别在于:TriggerEvent立即触发用户指定
28、的事件,再继续调用下面的事件,属于同步调用;而PostEvent则把事件排在事件队列的末尾,属于异步调用。如果定义用户事件时定义了事件参数,需用下面的格式触发用户事件:object_name. Trigger|PostStatic|DynamicEVENT event_name(para_list)其中:方括号表示可选部分。Object_name是事件所属对象的对象名。Trigger和Post选项只能选择一个,缺省时为Trigger。Trigger表示立即执行指定事件的事件处理程序,然后再执行该语句后面的代码;Post表示将该事件放置到对象的事件队列中,然后继续执行该语句后面的代码,至于发出去
29、的事件处理程序何时执行,由操作系统决定。Static和Dynamic选项只能选一个,缺省时为Static。Static表示编译时指定事件必须存在,系统要进行返回值类型检查;Dynamic表示编译时指定事件可以不存在,系统把返回值类型检查推迟到应用程序运行时进行。EVENT是关键字,表示后面的event_name是个事件名而不是函数。para_list是事件参数列表,多个参数时参数之间用逗号分隔。【实例9-1】触发用户事件要求:鼠标在命令按钮cb_1上移动,触发cb_1的鼠标移动事件ue_mousemove(自定义),改变静态文本st_1中文本的颜色。单击命令按钮cb_2,触发该按钮改变st_1
30、文本颜色的事件ue_color(自定义)。输入半径值后,单击命令按钮cb_3,触发该按钮的计算圆的面积事件ue_area(自定义)。技术要点:定义用户事件、触发用户事件。操作步骤:(1)新建工作区e:studentuserevent.pbw。(2)新建应用userevent。(3)创建窗口对象w_event,按图9-3所示添加控件、设置属性。Title值为:触发用户事件。St_1的BorderStyle的属性值为StyleLowered!,Text值为图9-3所示。st_1cb_1cb_3sle_1cb_2图9-3 w_event窗口的运行界面(4)定义窗口对象w_event的实例变量:int
31、 i=0 。(5)双击cb_1按钮,出现cb_1按钮的事件,选择New Event,出现如图9-2所示的自定义事件窗口,Event Name为ue_mousemove,Event ID为pbm_mousemove,输入代码为:i=i+1if i>200 then i=0end ifif mod(i,22)=0 then st_1.textcolor=rgb(255,0,0) /如i能被22整除,st_1的文字变成红色end ifif mod(i,48)=0 then st_1.textcolor=rgb(0,255,0) /如i能被48整除,st_1的文字变成绿色end if /代码中的
32、22和48用户可自己改,为了让红、绿两种颜色变化的间隔加长(6)双击cb_2按钮,出现cb_2按钮的事件,选择New Event,出现如图9-2所示的自定义事件窗口,Event Name为ue_color,Event ID为pbm_ custom17,输入代码为:i=i+1if i>200 theni=0end ifif mod(i,2)=0 then st_1.textcolor=rgb(255,0,0)/如果I为偶数,st_1的文字变成红色else st_1.textcolor=rgb(0,255,0)/ 如果I为奇数,st_1的文字变成绿色end if(7)在cb_2的clicke
33、d事件中输入如下代码:cb_2.triggerevent("ue_color")/触发命令按钮cb_2的用户自定义事件ue_color/此行代码中cb_1可省略。因为当前对象是cb_2(8)双击cb_3按钮,出现cb_3按钮的事件,选择New Event,出现如图9-2所示的自定义事件窗口,Event Name为ue_area,返回值为decimal,输入参数名r,参数返回值为decimal,Event ID为None。输入代码为:return (3.14159*r*r)(9)在cb_3的clicked事件中输入如下代码:dec 2 r1,sr1=dec(sle_1.tex
34、t)s=cb_3.event ue_area(r1)/触发带参数的自定义事件ue_areamessagebox("圆的面积为:",s)(10)在应用对象userevent的Open事件中键入脚本:open(w_ event)(11)存盘后单击按钮执行应用程序。运行的效果如图9-3所示。在cb_1上移动鼠标,观察st_1中文本颜色的变化。单击cb_2,观察st_1中文本颜色的变化。输入半径后,单击cb_3后观察圆的面积。说明:(1)本例中命令按钮cb_1的自定义事件ue_mousemove,Event ID为pbm_mousemove,是Windows所提供的事件编号,窗口运
35、行,鼠标移动到cb_1上就会自动触发自定义事件ue_mousemove,st_1中的文本颜色发生变化。(2)本例中命令按钮cb_2的自定义事件ue_color,Event ID为pbm_custom17是用户使用的事件编号,则必须使用代码触发该事件:cb_2.triggerevent("ue_color") 。可将triggerevent函数改为PostEvent函数。(3)本例中命令按钮cb_3的自定义事件ue_area,定义了参数r,不能使用triggerevent函数或PostEvent函数来触发,只能使用s=cb_3.event ue_area(r1)来触发。9.5 小结本章讲述了用户自定义事件的设计过程。尽管PowerBuilder提供了大量的预定义事件,可以解决常见的问题,但为了满足实际的需要,用户在设计时经常要自定义事件。选择不同的事件号触发事件的方法不同,表9.1列出部分常用事件的说明,对其
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中医病史采集试题及答案
- 2025年全国文职人员笔试题及答案
- 2025年三基中医试题及答案详解
- 2025年中医药学单招试题及答案
- 村级维修协议书
- 村部维修协议书
- 杭州情侣协议书
- 林地补贴协议书
- 查阅离婚协议书
- 2025年司勤人员面试题及答案
- 肾肿瘤考试题库及答案
- 肾结石健康科普指南
- 二零二五年度农村自建房买卖合同A3版(含土地使用)
- 村子绿化设计方案(3篇)
- 2025浙能集团甘肃有限公司新能源项目招聘22人笔试历年参考题库附带答案详解
- GB/T 45805-2025信控服务机构分类及编码规范
- DB3309-T 112-2024 嵊泗贻贝苗种包装运输通.用技术条件
- 【正版授权】 IEC 60931-2:2025 EN-FR Shunt power capacitors of the non-self-healing type for AC systems having a rated voltage up to and including 1 000 V - Part 2: Ageing test and destru
- 班主任安全管理培训讲座
- 2024年云南省罗平县人民医院公开招聘护理工作人员试题带答案详解
- 2025年农业灌溉站租赁合同范本
评论
0/150
提交评论