PB 09第9章 用户自定义事件
发布时间:2021-06-07
发布时间:2021-06-07
郑阿奇课件,详细讲解PB
第9章 用户自定义事件应用程序需要某种特殊控制、需要在特定情况下执行某段代码、 对象间需要灵活的通讯,可以根据需要定义自己的事件来完成这 些特殊需求,这类事件就称用户事件。 在下列情况下经常使用用户事件: (1) 解决对象与窗口之间的通讯问题。用户事件可以通过参数进行 信息传递。 (2) 响应特殊操作,这些操作没有相应的PowerBuilder预定义事件。 (3) 支持用户通过多种方式完成同一个功能。
郑阿奇课件,详细讲解PB
第9章 用户自定义事件9.1 定义用户事件 9.2 用户事件号 9.3 删除用户事件 9.4 触发用户事件 9.5 用户事件编程实例
郑阿奇课件,详细讲解PB
9.1定义用户事件定义用户事件, 首先要选定好所 在的对象,然后 打开Script窗口, 再选择New Event, 如图9.1,将出现 事件定义窗口, 如图9.2。1.选择对象 2.选择New Event
图9.1定义用户事件1.输入用户事件 名
2.选择用户事件 号
图9.2定义用户事件属性
郑阿奇课件,详细讲解PB
9.1定义用户事件可以为用户事件定义参数及返回值。在Return Type中选择返回值类型, 在Argument Type中选择参数类型,在Argment Name中输入参数名。在 图9.2中,右击,弹出一个菜单:
定义带参数的用户事件,其事件 号必须选None,若选择其它的 事件号,则定义的参数无效。 定义用户事件时,选择的事件标 识应与所在的对象吻合,否则用 户事件不起作用。用户事件定义 好后,可以象对象的其它标准事 件一样编程和使用。图9.3 增加、插入、删除参数
郑阿奇课件,详细讲解PB
9.2用户事件号表9.1列出了部分常用事件标识的前缀及其含义
郑阿奇课件,详细讲解PB
9.3删除用户事件定义的用户事件号及名称不能 更改,只能删除。在该事件的 代码编辑窗口,点击鼠标右键, 将 弹出一 个菜 单 ,选 择Delete Event,将删除该事件。 注意: 对该删除操作不作提醒,一 经选择Delete Event,就立刻删 除,因此若事件已有代码,则 应小心。只有用户事件才能删 除。
图9.4删除用户事件
郑阿奇课件,详细讲解PB
9.4触发用户事件定义了用户事件后,就需设计事件处理程序,没有事件处理程序, 即使发生了该事件,应用程序也不做任何处理。如果选用的事件号 对应于某个Window消息,则事件何时发生,将由系统决定。但若 选用的事件号为pbm_custom01到pbm_custom75,即不对应于任 何Windows消息,则必须编程时使用代码触发该事件。 触发用户事件有三种格式,前两种是: object_name.TriggerEvent(event_name) object_name.PostEvent(event_name) 其中:object_name为对象名;event_name为事件名,对系统事件而 言,是枚举类型,对用户自定义事件而言,是一个字符串。 例如: w_1.TriggerEvent(Clicked!) //触发窗口w_1的鼠标单击事件 w_1.TriggerEvent(“u_key”) // 触 发 窗 口 w_1 的 用 户 自 定 义 事 件 u_key TriggerE
vent和PostEvent的区别在于:TriggerEvent立即触发该事 件,而PostEvent则把事件排在事件队列的末尾。
郑阿奇课件,详细讲解PB
9.4触发用户事件在定义用户事件时,可以定义事件参数。但TriggerEvent和PostEvent不能带事件 参数(但可以给Message传送用户消息),因此需用下面的格式触发:object_name. [Trigger | Post] [Static | Dynamic] EVENT event_name( [para_list] )
其中: l object_name是事件所属对象的对象名 l Trigger和Post选项只能选择一个,缺省时为Trigger。Trigger表示立即执行指定事 件的事件处理程序,然后再执行该语句后面的代码;Post表示将该事件放置到对 象的事件队列中,然后继续执行该语句后面的代码。 l Static和Dynamic选项只能选择一个,缺省时为Static。Static表示编译时指定事件 必须存在,系统要进行返回值类型检查;Dynamic表示编译时指定事件可以不存 在,系统把返回值类型检查推迟到应用程序运行时进行。 l EVENT是关键字,表示后面的event_name是个事件名而不是函数。 l para_tlist是事件参数列表,多个参数时参数之间用逗号分隔。 如果用户事件定义了参数,只能使用上述格式触发事件,而不能使用函数 TriggerEvent()或PostEvent ()。 例如: cb_1.EVENT Clicked() //触发控件cb_1的鼠标单击事件 w_1.Event u_display(4,“math”) //触发窗口w_1的用户自定义事件u_dispaly, 它带两个参数。只能用这种方法触发
郑阿奇课件,详细讲解PB
9.5用户事件编程实例希望当焦点落在命令按钮上时,按回车键能代替鼠标。在数据窗口 中,按回车键可以跳到下一个输入项,而不是下一行。当在最后一行 的最后一列按回车键时,将增加一个空行。在最后一行按向下的箭头 键↓时,也增加一个空行。
图9.5用户事件编程实例
郑阿奇课件,详细讲解PB
9.5用户事件编程实例为实现图9.5的功能,可用自定义事件。 (1)创建一个student.pbl,其中ApplicationObject为stu,再建一个窗口w_uevent, 窗口上的控件分别为dw_1、cb_append、cb_insert、cb_delete、cb_retrieve、 cb_update、cb_return。 (2) 给应用对象stu的open事件编写代码:SQLCA.AutoCommit =True sqlca.DBMS= "odbc" sqlca.database= "student " sqlca.dbpass="dba" erid="sql " sqlca.servername = "" sqlca.dbparm = "Connectstring='DSN=student;UID=dba;PWD=sql;'" sqlca.logid=" " sqlca.logpass="" connect; if sqlca.sqlcode<>0 then messagebox(“”,“不能连结数据库! ~r~n~r~n请询问系统管理员",stopsign!) return end if open(w_uevent)
郑阿奇课件,详细讲解PB
l 给窗口w_1的open事件编写代码: dw_1.SetTransObject(SQLCA) long row row=dw_1.insertrow(0) dw_1.setrow(row) dw_1.scrolltorow(row) dw_1.setfocus()
9.5用户事件编程实例
l 给增加记录的命令按钮cb_append的clicked事件编写代码:
l
给cb_append定义一个用户事件u_keydown,事件号为pbm_keydown,当焦 点落在该控件上时,按任意键都将
触发u_keydown。给u_keydown编写代码:if keydown(keyenter!) then this.triggerevent(clicked!) end if //如果按了回车键,则触发clicked事件
l 给插入记录的命令按钮cb_insert的clicked事件编写代码:long row row=dw_1.insertrow(dw_1.getrow()) dw_1.setrow(row) dw_1.scrolltorow(row) dw_1.setfocus()
郑阿奇课件,详细讲解PB
9.5用户事件编程实例l 给cb_insert定义一个用户事件u_keydown,事件号为pbm_keydown,当 焦点落在该控件上时,按任意键都将触发u_keydown。给u_keydown编 写代码: if keydown(keyenter!) then //如果按了回车键,则触发clicked事件 cb_insert.event clicked() end if l 给删除记录的命令按钮cb_delete的clicked事件编写代码: dw_1.deleterow(dw_1.getrow()) l 给cb_delete定义一个用户事件u_keydown,事件号为pbm_keydown,当 焦点落在该控件上时,按任意键都将触发u_keydown。给u_keydown编 写代码: if keydown(keyenter!) then //如果按了回车键,则触发clicked事件 this.Event clicked() end if
郑阿奇课件,详细讲解PB
9.5用户事件编程实例l 给显示记录的命令按钮cb_retrieve的clicked事件编写代码: dw_1.retrieve() l 给cb_retrieve定义一个用户事件u_keydown,事件号为pbm_keydown,当焦点落 在该控件上时,按任意键都将触发u_keydown。给u_keydown编写代码:if keydown(keyenter!) then //如果按了回车键,则触发clicked事件 this.triggerevent(clicked!) end if
l 给存盘的命令按钮cb_update的clicked事件编写代码: dw_1.update () l 给cb_update定义一个用户事件u_keydown,事件号为pbm_keydown,当焦点落 在该控件上时,按任意键都将触发u_keydown。给u_keydown编写代码:if keydown(keyenter!) then //如果按了回车键,则触发clicked事件 this.triggerevent(clicked!) end if l 给返回的命令按钮cb_return的clicked事件编写代码: close(parent)
郑阿奇课件,详细讲解PB
9.5用户事件编程实例l 给 cb_return 定 义 一 个 用 户 事 件 u_keydown , 事 件 号 为 pbm_keydown,当焦点落在该控件上时,按任意键都将触发 u_keydown。给u_keydown编写代码: if keydown(keyenter!) then //如果按了回车键,则触发clicked事件 this.triggerevent(clicked!) end if l 给数据窗口dw_1再定义一个用户事件u_keyarrow,事件号为 pbm_dwntabdownout,当焦点落在该控件上时,按向下的箭头 键↓将触发u_keyarrow。给u_keyarrow编写代码: long row row=insertrow(0) //增加一行 setrow(row) //将新行变为当前行 scrolltorow(row)
郑阿奇课件,详细讲解PB
9.5用户事件编程实例l 给数据窗口 dw_1 定义 一个用户事件 u_keyenter , 事 件 号 为 pbm_dwnprocessenter,当焦点落在 该控件上时,按回车键将触发 u_keyenter。给u_keyenter编写代码:int col long row col=getcolumn() row=getrow() if col<4 then//当前列不是最后一列 setcolumn(col+1) //将下一列变为 当前列 else if row<rowcount() then //当前列 是最后一列但当前行不是最后一行 setrow(row+1) //将下一行的第
一列变为当前列 scrolltorow(row+1) setcolumn(1) else //当前列是最后一列且当前行 是最后一行 row=insertrow(0) // 增 加 一 行 setrow(row) //将新行的第一 列变为当前列 scrolltorow(row) setcolumn(1) end if end if return 1
//放弃系统原来的操作