310 likes | 386 Views
第 14 章 用户自定义对象. 用户对象具有下述优势: (1) 避免了在应用程序的不同地方编写功能相同或相近代码的麻烦,提高了应用程序的可维护性。 (2) 用户对象可以把一组总在一起使用的可视控件组合在一起,构成一个完成特定功能的控件,应用程序可以随时使用它。 (3) 用户对象提供了构造具有一致外观的可视部件的方法。 (4) 用户对象能够把相关功能封装在一起。 (5) 用户对象允许开发人员扩展某些对象的功能。 用户对象的命名一般以“ u_” 为前缀,用户对象控件或实例的命名一般以“ uo_” 为前缀。. 第 14 章 用户自定义对象. 14.1 可视用户对象
E N D
第14章用户自定义对象 用户对象具有下述优势: (1)避免了在应用程序的不同地方编写功能相同或相近代码的麻烦,提高了应用程序的可维护性。 (2)用户对象可以把一组总在一起使用的可视控件组合在一起,构成一个完成特定功能的控件,应用程序可以随时使用它。 (3)用户对象提供了构造具有一致外观的可视部件的方法。 (4)用户对象能够把相关功能封装在一起。 (5) 用户对象允许开发人员扩展某些对象的功能。 用户对象的命名一般以“u_”为前缀,用户对象控件或实例的命名一般以“uo_”为前缀。
第14章用户自定义对象 14.1 可视用户对象 14.2 类用户对象 14.3 用户对象使用编程实例
标准可视用户对象在现有控件基本功能的基础上增加应用程序需要的功能。继承了原始控件的各种特征,包括属性、事件和函数。标准可视用户对象在现有控件基本功能的基础上增加应用程序需要的功能。继承了原始控件的各种特征,包括属性、事件和函数。 例如,命令按钮只能用鼠标点击,而不响应回车键,可以利用标准可视用户对象 来定制一个用户对象,既能用鼠标点击,又可以按回车键操作。 点击主窗口的工具栏图标按钮New或选择主菜单File的New子菜单,将打开标题为“New”的窗口,选择Object页。 图14-1 创建用户对象 14.1.1 创建标准可视用户对象
图14-2 选择对象类型 14.1.1 创建标准可视用户对象 打开标题为“Select Standard Visual Type”的窗口,选择所要的对象类型,点击Ok按钮。这里我们选择commandbutton来定制一个命令按钮用户对象。
图14-3 定义可视用户对象 14.1.1 创建标准可视用户对象 选好标准对象类型后,将打开用户对象画板。该界面和创建窗口的界面相似。在这里可以设置CommandButton的属性如Text、字体、控件大小等作为该用户对象的默认值,还可以定义用户函数和用户事件,并给某些事件编写代码。
14-4 在用户对象中定义用户事件 14.1.1 创建标准可视用户对象 给该用户对象定义一个用户事件以响应用户的回车键操作。用户事件名为“ue_enter”,事件号选“pbm_keydown”。
14.1.1 创建标准可视用户对象 在该事件中输入代码: if KeyDown(KeyEnter!) then //如果是回车键,则触发鼠标单击事件 this.TriggerEvent(Clicked!) end if 保存该用户对象,名为u_commandbutton。 定义了一个可视用户对象u_commandbutton,该对象除具备标准的CommandButton命令按钮的属性、事件、函数外,还有用户自定义事件ue_keyenter,当焦点落在该控件上时,用户按回车键将触发该事件。
用户对象 图14-5 控件工具箱 14.1.2 使用可视用户对象 可视用户对象定义好后,就可以象标准控件那样使用。在窗口打开后,点击工具栏上的控件工具箱中的用户对象User Object图标按钮。
图14-6 选择用户对象 14.1.2 使用可视用户对象 将出现标题为“Select Object”的窗口,在其中列出了当前pbl文件中所有的用户对象,选择一个用户对象,点击OK按钮或直接双击所选的用户对象。这里选u_commandbutton。 调整用户对象在窗口中的位置、大小,并设置必要的属性。这样,当焦点落在该控件上时,按回车键将触发Click事件。
1.选择目标 2.选择pbl库 4.选择要修改的用户对象 3.选择User Objects 图14-7 打开用户对象 14.1.3 修改用户对象 修改用户对象。选择工具栏的Open图标,打开标题为“Open”的窗口。 在Application Libraries中选择要修改的用户对象所在的pbl库文件,在对象类型Object Type中选择User Objects,选择要修改的用户对象,点击OK按钮或直接双击所选的用户对象,将打开用户对象定义画板,如前图14-3所示。
图14-8 选择定制可视用户对象 14.1.4 创建定制可视用户对象 定制可视用户对象是将多个控件以及可视用户对象组合成一个整体,完成一定的功能和操作。选择主窗口工具栏上的图标按钮New 或选择主菜单File的New子菜单,将打开标题为“New”的窗口,选择Object页。
在这里放置控件和已定义的可视用户对象 图14-9 定制可视用户对象画板 14.1.4 创建定制可视用户对象 定制可视用户对象画板。在左上角的窗口上放置所需的控件和已定义的可视用户对象。还可以定义用户函数和用户事件,并给某些事件编写代码。
14.1.4 创建定制可视用户对象 注意: 该可视用户对象中的控件的大小、位置等属性不能在窗口上改变,而只能在如图14-9所示的定制可视用户对象画板中修改。 创建的定制可视用户对象作为一个整体来使用,与其它用户对象的一个明显差别是:定制可视用户对象中包括了多个控件。窗口中的代码控制定制可视用户对象中的控件时,需要用“用户对象名+控件名+属性或函数”这样的格式。 例如: uo_1.cb_ok.text=”确定”//cb_ok是用户对象中的一个控件 st_1.text=uo_1.sle_1.text //sle_1是用户对象中的一个控件,st_1 是窗口上的一个控件 uo_1.lb_1.additem(sle_2.text) //lb_1是用户对象中的控件,sle_2是窗 口上的控件
图14-10 创建外部可视用户对象 14.1.5 创建外部可视用户对象 使用外部控件的目的通常是为了完成PB本身难以完成或不支持的功能。 选择主窗口工具栏上的图标按钮New 或选择主菜单File的New子菜单,选择Object页。
图14-11 外部可视用户对象画板 14.1.5 创建外部可视用户对象 在图14-10 Object页中选择External Visual项,点击OK按钮或直接双击External Visual项,将打开外部可视用户对象画板。
14.1.5 创建外部可视用户对象 图14-11中,在LibraryName中输入外部用户对象所在的DLL文件名,或者单击Browse按钮选择DLL文件;在Class Name编辑框中键入DLL中的注册类名(该类名通常由生产DLL的厂商提供);在“Text”编辑框中输入显示在控件上的文本(并非都需要此项);根据需要设置其它属性;说明用户对象所需的函数、事件、变量、结构;编写用户对象的各种事件处理程序;最后保存用户对象。定义了外部可视用户对象后,就可以在窗口、定制可视用户对象等多个地方运用该对象了。 注意:要创建外部可视用户对象,必须知道外部用户对象所在的DLL文件名和注册类名。
图14-12 定义标准类用户对象 14.2.1 创建标准类用户对象 选择主窗口工具栏上的图标按钮New 或选择主菜单File的New子菜单,将打开标题为“New”的窗口,选择Object页。
图14-13 选择标准对象类 14.2.1 创建标准类用户对象 在图14-12的Object页中选择Standard Class项,点击OK或直接双击Standard Class项,打开标题为“Select Standard Class Type”的窗口来选择创建的用户对象所继承的内部系统对象。
图14-14 标准用户类画板 14.2.1 创建标准类用户对象 选择所要的对象类,点Ok,打开标准类用户对象定义画板。 类用户对象是不可见的,不能在它上面布置任何的可视控件。为这个对象封装属性、函数和事件以及变量等,编写用户对象所需的各种事件处理程序。最后保存用户对象。
14.2.2 使用类用户对象 使用类用户对象时,需要在代码中创建它的一个实例 。 步骤为: (1)说明类用户对象类型的变量,用CREATE语句创建该对象的一个实例; (2)在变量的整个作用域中,代码都能访问该对象的属性、事件、函数,就像使用系统预定义对象那样(比如事务处理对象SQLCA); (3) 不再使用该用户对象时,使用DESTROY语句删除该对象,以释放它所占的内存。
14.2.2 使用类用户对象 例如: 我们已经创建了一个标准类用户对象u_datastore,它从数据存储对象Datastore继承得到,那么代码中可以这样使用: u_datastore myds //声明u_datastore类型的变量myds myds = CREATE u_datastore //创建用户对象实例myds myds.DataObject = ‘d_user_search’ //将数据窗口对象与类用 户对象联系起来 myds.SetTransObject(SQLCA) //设置类用户对象使用的事务对象 ret = myds.Retrieve(math) //检索数据据 ...... //应用程序所需的其它处理 DESTROY myds //使用后删除用户对象
14.2.3 创建定制类用户对象 定制类用户对象是用户自己设计的对象,用于封装不需要可视特性的处理过程。这些对象并不继承某个对象或控件,完全由用户通过定义实例变量、函数、事件来实现。 定制类用户对象只有两个系统预定义事件:Constructor和Destructor。其创建过程和使用方法完全类似于标准类用户对象。 要将用户对象删除,只有在Library工作区才能实现。方法是打开Library工作区,右击要删除的对象,出现弹出式菜单,选择Delete,打开一个提示框,选择Yes,删除所选的对象。参见PBL库管理器。
图14-15 用户对象使用实例 14.3 用户对象使用编程实例 在用户自定义事件的编程实例中,要求当焦点落在命令按钮上时,按回车键能代替鼠标。在数据窗口中,按回车键可以跳到下一个输入项,而不是下一行。在最后一行的最后一列按回车键时,将增加一个空行。在最后一行按向下的箭头键↓时,也增加一个空行。
14.3 用户对象使用编程实例 应该设计一个统一的按钮,无须在每个用到的地方分别编程。使用用户对象可以方便的解决问题。 实例创建步骤如下: (1)创建一个ustudent.pbl,其ApplicationObject为ustu,再建一个窗口w_uobject。 (2)创建标准可视用户对象,它是从标准控件commandbutton命令按钮继承来的。给该用户对象增加自定义事件ue_keyenter,事件号为pbm_keydown。该用户对象能够响应鼠标和回车键操作。 在该用户对象的事件ue_keyenter中输入以下代码: if KeyDown(KeyEnter!) then //如果是回车键,则触发鼠标单击事件 this.TriggerEvent(Clicked!) end if 保存该用户对象,名为u_commandbutton。
14.3 用户对象使用编程实例 (3)再创建标准可视用户对象,也是从标准控件commandbutton命令按钮继承来的。给该用户对象增加自定义事件ue_keyenter,事件号为pbm_keydown。该用户对象能够响应鼠标和回车键操作,并关闭控件所在的窗口。 l在该用户对象的自定义事件ue_keyenter中输入以下代码: if KeyDown(KeyEnter!) then //如果是回车键,则触发鼠标单击事件 this.TriggerEvent(Clicked!) end if l在该用户对象的事件click中输入以下代码: close(parent) //关闭控件所在的窗口 保存该用户对象,名为u_cb_return。 (4)创建标准可视用户对象,它是从标准控件datawindow数据窗口继承来的。给该用户对象增加两个自定义事件和一个自定义函数:
14.3 用户对象使用编程实例 l一个事件是ue_keyenter,事件号为pbm_dwnprocessenter。该事件的主要功能是按回车键可以跳到下一个输入项,不是下一行。当在最后一行的最后一列按回车键时,将增加一个空行。 l一个事件是ue_keyarrow,事件号为pbm_dwntabdownout.。该事件的主要功能是在最后一行按向下的箭头键↓时,增加一个空行。 l自定义函数是uf_getcolnumber(),无入口参数,返回值表示数据窗口中的列数。该函数的功能就是求当前数据窗口中的列的数目。 l在该用户对象的自定义函数uf_getcolnumber()中输入以下代码: //返回当前数据窗口的列数 long row int col,oldcol,ret row=this.getrow() oldcol=this.getcolumn() //oldcol为当前列 if row<1 then return 0 //数据窗口为空则返回
14.3 用户对象使用编程实例 //下面循环的意思是从第一列开始设置为当前列, //若设置成功,则将下一列设置为当前列,.... //直到设置失败(setcolumn函数返回-1), //这时列数就是col-1 //假设数据窗口的列数不超过10000列. for col=1 to 10000 ret=this.setcolumn(col) if ret= - 1 then this.setcolumn(oldcol) //将原来的列恢复为当前列 return col – 1 //返回数据窗口中的列数 end if next return 0 l在该用户对象的自定义事件ue_keyenter中输入以下代码: int col,colnum long row colnum=uf_getcolnumber() //求数据窗口的列数
14.3 用户对象使用编程实例 if colnum<1 then return 1 //如果列数小于1,则返回 col=getcolumn() row=getrow() if col<colnum 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 //放弃原来的操作
14.3 用户对象使用编程实例 l在该用户对象的自定义事件ue_keyarrow中输入以下代码: long row row=insertrow(0) //增加一行 setrow(row) //将新行变为当前行 scrolltorow(row) (5)在窗口w_uobject上创建用户对象控件: dw_1:从u_datawindow继承而来 cb_append:从u_commandbutton继承而来 cb_insert:从u_commandbutton继承而来 cb_delete:从u_commandbutton继承而来 cb_retrieve:从u_commandbutton继承而来 cb_update:从u_commandbutton继承而来 cb_return:从u_commandbutton继承而来 分别给cb_append、cb_insert、cb_delete、cb_retrieve、cb_update控件的text属性赋值;给dw_1的dataobject属性赋值,即将控件与某个数据窗口对象相关联。
14.3 用户对象使用编程实例 l给应用对象ustu的open事件编写代码: SQLCA.AutoCommit = True sqlca.DBMS = "odbc" sqlca.database = "student" sqlca.dbpass="dba" sqlca.userid="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_uobject)
14.3 用户对象使用编程实例 l给窗口w_uobject的open事件编写代码: dw_1.SetTransObject(SQLCA) l给增加记录的命令按钮cb_append的clicked事件编写代码: long row row=dw_1.insertrow(0) dw_1.setrow(row) dw_1.scrolltorow(row) dw_1.setfocus() l给插入记录的命令按钮cb_insert的clicked事件编写代码: long row row=dw_1.insertrow(dw_1.getrow()) dw_1.setrow(row) dw_1.scrolltorow(row) dw_1.setfocus() l给删除记录的命令按钮cb_delete的clicked事件编写代码: dw_1.deleterow(dw_1.getrow()) l给显示记录的命令按钮cb_retrieve的clicked事件编写代码: dw_1.retrieve() l给存盘的命令按钮cb_update的clicked事件编写代码: dw_1.update ()