资源预览内容
第1页 / 共31页
第2页 / 共31页
第3页 / 共31页
第4页 / 共31页
第5页 / 共31页
第6页 / 共31页
第7页 / 共31页
第8页 / 共31页
第9页 / 共31页
第10页 / 共31页
亲,该文档总共31页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第第14章章 用户自定义对象用户自定义对象 用户对象具有下述优势:用户对象具有下述优势:(1)避免了在应用程序的不同地方编写功能相同或相近代码的麻烦,提高了应用程序的可维护性。(2)用户对象可以把一组总在一起使用的可视控件组合在一起,构成一个完成特定功能的控件,应用程序可以随时使用它。(3) 用户对象提供了构造具有一致外观的可视部件的方法。(4) 用户对象能够把相关功能封装在一起。(5) 用户对象允许开发人员扩展某些对象的功能。用户对象的命名一般以“u_”为前缀,用户对象控件或实例的命名一般以“uo_”为前缀。第第14章章 用户自定义对象用户自定义对象14.1 可视用户对象可视用户对象 14.2 类用户对象类用户对象 14.3 用户对象使用编程实例用户对象使用编程实例 14.1.1 创建标准可视用户对象创建标准可视用户对象 标准可视用户对象在现有控件基本功能的基础上增加应用程序需要的功能。继承了原始控件的各种特征,包括属性、事件和函数。例如,命令按钮只能用鼠标点击,而不响应回车键,可以利用标准可视用户对象来定制一个用户对象,既能用鼠标点击,又可以按回车键操作。点击主窗口的工具 栏 图 标 按 钮New或选择主菜单File的New子菜单,将打开标题为“New”的窗口,选择Object页。图图14-1 创建用户对象创建用户对象14.1.1 创建标准可视用户对象创建标准可视用户对象打开标题为“SelectStandardVisualType”的窗口,选择所要的对象类型,点击Ok按钮。这里我们选择commandbutton来定制一个命令按钮用户对象。图图14-2 选择对象类型选择对象类型14.1.1 创建标准可视用户对象创建标准可视用户对象选好标准对象类型后,将打开用户对象画板。该界面和创建窗口的界面相似。在这里可以设置CommandButton的属性如Text、字体、控件大小等作为该用户对象的默认值,还可以定义用户函数和用户事件,并给某些事件编写代码。图图14-3 定义可视用户对象定义可视用户对象14.1.1 创建标准可视用户对象创建标准可视用户对象给该用户对象定义一个用户事件以响应用户的回车键操作。用户事件名为“ue_enter”,事件号选“pbm_keydown”。14-4 在用户对象中定义用户事件在用户对象中定义用户事件14.1.1 创建标准可视用户对象创建标准可视用户对象在该事件中输入代码:ifKeyDown(KeyEnter!)then/如果是回车键,则触发鼠标单击事件this.TriggerEvent(Clicked!)endif保存该用户对象,名为u_commandbutton。定义了一个可视用户对象u_commandbutton,该对象除具备标准的CommandButton命令按钮的属性、事件、函数外,还有用户自定义事件ue_keyenter,当焦点落在该控件上时,用户按回车键将触发该事件。14.1.2 使用可视用户对象使用可视用户对象 可视用户对象定义好后,就可以象标准控件那样使用。在窗口打开后,点击工具栏上的控件工具箱中的用户对象User Object图标按钮。 图图14-5 控件工具箱控件工具箱用户对象用户对象14.1.2 使用可视用户对象使用可视用户对象将出现标题为“SelectObject”的窗口,在其中列出了当前pbl文件中所有的用户对象,选择一个用户对象,点击OK按钮或直接双击所选的用户对象。这里选u_commandbutton。调整用户对象在窗口中的位置、大小,并设置必要的属性。这样,当焦点落在该控件上时,按回车键将触发Click事件。图图14-6 选择用户对象选择用户对象图图14-7 打开用户对象打开用户对象2.选择选择pbl库库3.选择选择User Objects4.选选择择要要修修改改的的用用户对象户对象1.选择目标选择目标14.1.3 修改用户对象修改用户对象 修改用户对象。选择工具栏的Open图标,打开标题为“Open”的窗口。在ApplicationLibraries中选择要修改的用户对象所在的pbl库文件,在对象类型ObjectType中选择UserObjects,选择要修改的用户对象,点击OK按钮或直接双击所选的用户对象,将打开用户对象定义画板,如前图14-3所示。14.1.4 创建定制可视用户对象创建定制可视用户对象 定制可视用户对象是将多个控件以及可视用户对象组合成一个整体,完成一定的功能和操作。选择主窗口工具栏上的图标按钮New或选择主菜单File的New子菜单,将打开标题为“New”的窗口,选择Object页。图图14-8 选择定制可视用户对象选择定制可视用户对象14.1.4 创建定制可视用户对象创建定制可视用户对象定制可视用户对象画板。在左上角的窗口上放置所需的控件和已定义的可视用户对象。还可以定义用户函数和用户事件,并给某些事件编写代码。图图14-9 定制可视用户对象画板定制可视用户对象画板在在这这里里放放置置控控件件和和已已定定义义的的可可视视用用户户对象对象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.1.5 创建外部可视用户对象创建外部可视用户对象 使用外部控件的目的通常是为了完成PB本身难以完成或不支持的功能。选择主窗口工具栏上的图标按钮New或选择主菜单File的New子菜单,选择Object页。图图14-10 创建外部可视用户对象创建外部可视用户对象14.1.5 创建外部可视用户对象创建外部可视用户对象在图14-10Object页中选择ExternalVisual项,点击OK按钮或直接双击ExternalVisual项,将打开外部可视用户对象画板。图图14-11 外部可视用户对象画板外部可视用户对象画板14.1.5 创建外部可视用户对象创建外部可视用户对象图14-11中,在LibraryName中输入外部用户对象所在的DLL文件名,或者单击Browse按钮选择DLL文件;在ClassName编辑框中键入DLL中的注册类名(该类名通常由生产DLL的厂商提供);在“Text”编辑框中输入显示在控件上的文本(并非都需要此项);根据需要设置其它属性;说明用户对象所需的函数、事件、变量、结构;编写用户对象的各种事件处理程序;最后保存用户对象。定义了外部可视用户对象后,就可以在窗口、定制可视用户对象等多个地方运用该对象了。注意:注意:要创建外部可视用户对象,必须知道外部用户对象所在的DLL文件名和注册类名。14.2.1 创建标准类用户对象创建标准类用户对象 选择主窗口工具栏上的图标按钮New或选择主菜单File的New子菜单,将打开标题为“New”的窗口,选择Object页。图图14-12 定义标准类用户对象定义标准类用户对象14.2.1 创建标准类用户对象创建标准类用户对象在图14-12的Object页中选择StandardClass项,点击OK或直接双击StandardClass项,打开标题为“SelectStandardClassType”的窗口来选择创建的用户对象所继承的内部系统对象。图图14-13 选择标准对象类选择标准对象类14.2.1 创建标准类用户对象创建标准类用户对象选择所要的对象类,点Ok,打开标准类用户对象定义画板。类用户对象是不可见的,不能在它上面布置任何的可视控件。为这个对象封装属性、函数和事件以及变量等,编写用户对象所需的各种事件处理程序。最后保存用户对象。图图14-14 标准用户类画板标准用户类画板14.2.2 使用类用户对象使用类用户对象 使用类用户对象时,需要在代码中创建它的一个实例。步骤为:(1)说明类用户对象类型的变量,用CREATE语句创建该对象的一个实例;(2)在变量的整个作用域中,代码都能访问该对象的属性、事件、函数,就像使用系统预定义对象那样(比如事务处理对象SQLCA);(3) 不再使用该用户对象时,使用DESTROY语句删除该对象,以释放它所占的内存。14.2.2 使用类用户对象使用类用户对象例如:例如:我们已经创建了一个标准类用户对象u_datastore,它从数据存储对象Datastore继承得到,那么代码中可以这样使用:u_datastoremyds/声明u_datastore类型的变量mydsmyds=CREATEu_datastore/创建用户对象实例mydsmyds.DataObject=d_user_search/将数据窗口对象与类用户对象联系起来myds.SetTransObject(SQLCA)/设置类用户对象使用的事务对象ret=myds.Retrieve(math)/检索数据据./应用程序所需的其它处理DESTROYmyds/使用后删除用户对象14.2.3 创建定制类用户对象创建定制类用户对象 定制类用户对象是用户自己设计的对象,用于封装不需要可视特性的处理过程。这些对象并不继承某个对象或控件,完全由用户通过定义实例变量、函数、事件来实现。定制类用户对象只有两个系统预定义事件:Constructor和Destructor。其创建过程和使用方法完全类似于标准类用户对象。要将用户对象删除,只有在Library工作区才能实现。方法是打开Library工作区,右击要删除的对象,出现弹出式菜单,选择Delete,打开一个提示框,选择Yes,删除所选的对象。参见PBL库管理器。14.3 用户对象使用编程实例用户对象使用编程实例在用户自定义事件的编程实例中,要求当焦点落在命令按钮上时,按回车键能代替鼠标。在数据窗口中,按回车键可以跳到下一个输入项,而不是下一行。在最后一行的最后一列按回车键时,将增加一个空行。在最后一行按向下的箭头键时,也增加一个空行。图图14-15 用户对象使用实例用户对象使用实例14.3 用户对象使用编程实例用户对象使用编程实例应该设计一个统一的按钮,无须在每个用到的地方分别编程。使用用户对象可以方便的解决问题。实例创建步骤如下:实例创建步骤如下:(1)创建一个ustudent.pbl,其ApplicationObject为ustu,再建一个窗口w_uobject。(2)创建标准可视用户对象,它是从标准控件commandbutton命令按钮继承来的。给该用户对象增加自定义事件ue_keyenter,事件号为pbm_keydown。该用户对象能够响应鼠标和回车键操作。在该用户对象的事件ue_keyenter中输入以下代码:ifKeyDown(KeyEnter!)then/如果是回车键,则触发鼠标单击事件this.TriggerEvent(Clicked!)endif保存该用户对象,名为u_commandbutton。14.3 用户对象使用编程实例用户对象使用编程实例(3)再创建标准可视用户对象,也是从标准控件commandbutton命令按钮继承来的。给该用户对象增加自定义事件ue_keyenter,事件号为pbm_keydown。该用户对象能够响应鼠标和回车键操作,并关闭控件所在的窗口。l在该用户对象的自定义事件ue_keyenter中输入以下代码:ifKeyDown(KeyEnter!)then/如果是回车键,则触发鼠标单击事件this.TriggerEvent(Clicked!)endifl在该用户对象的事件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()中输入以下代码:/返回当前数据窗口的列数longrowintcol,oldcol,retrow=this.getrow()oldcol=this.getcolumn()/oldcol为当前列ifrow1thenreturn0/数据窗口为空则返回14.3 用户对象使用编程实例用户对象使用编程实例/下面循环的意思是从第一列开始设置为当前列,/若设置成功,则将下一列设置为当前列,./直到设置失败(setcolumn函数返回-1),/这时列数就是col-1/假设数据窗口的列数不超过10000列.forcol=1to10000ret=this.setcolumn(col)ifret=-1thenthis.setcolumn(oldcol)/将原来的列恢复为当前列returncol1/返回数据窗口中的列数endifnextreturn0l在该用户对象的自定义事件ue_keyenter中输入以下代码:intcol,colnumlongrowcolnum=uf_getcolnumber()/求数据窗口的列数14.3 用户对象使用编程实例用户对象使用编程实例if colnum1 then return 1 /如果列数小于如果列数小于1,则返回则返回col=getcolumn()row=getrow()if colcolnum then/当前列不是最后一列当前列不是最后一列setcolumn(col+1)/将下一列变为当前列将下一列变为当前列elseif rowrowcount() then /当前列是最后一列但当前行不是最后一行当前列是最后一列但当前行不是最后一行setrow(row+1)/将下一行的第一列变为当前列将下一行的第一列变为当前列scrolltorow(row+1)setcolumn(1)else/当前列是最后一列且当前行是最后一行当前列是最后一列且当前行是最后一行row=insertrow(0)/增加一行增加一行setrow(row)/将新行的第一列变为当前列将新行的第一列变为当前列scrolltorow(row)setcolumn(1)end ifend ifreturn 1 /放弃原来的操作放弃原来的操作 14.3 用户对象使用编程实例用户对象使用编程实例l在该用户对象的自定义事件ue_keyarrow中输入以下代码:longrowrow=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=Truesqlca.DBMS=odbcsqlca.database=studentsqlca.dbpass=dbasqlca.userid=sqlsqlca.servername=sqlca.dbparm=Connectstring=DSN=student;UID=dba;PWD=sql;sqlca.logid=sqlca.logpass=connect;ifsqlca.sqlcode0thenmessagebox(“=错误信息提示=”,“不能连结数据库!rnrn请询问系统管理员,stopsign!)returnendifopen(w_uobject)14.3 用户对象使用编程实例用户对象使用编程实例 l给窗口w_uobject的open事件编写代码:dw_1.SetTransObject(SQLCA) l给增加记录的命令按钮cb_append的clicked事件编写代码:longrowrow=dw_1.insertrow(0)dw_1.setrow(row)dw_1.scrolltorow(row)dw_1.setfocus() l给插入记录的命令按钮cb_insert的clicked事件编写代码:longrowrow=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()
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号