第 14 章 用户自定义对象

31
第 14 第 第第第第第第第 第第第第第第第第第第(1) 避避避避避避避避避避避避避避避避避避避避避避避避避避避 避避避避避避避避避避避避避 ,。 (2) 避避避避避避避 避避避避 避避避避避避避避避避避避 避避 避避避 避避避避避避避避避避避 避 一一一,一, 避避避避避避避避避避(3) 避避避避避避避避避避避 避避避避避避避避避避避避 一。 (4) 避避避避避避避避避避避避避避 避避 一。 (5) 避避避避避避避避避避避避避避避避避避避避避避避避避避 避避“ u_” 避避避 避避避避避避避避避避避避避 避避“ ,一 uo_” 避避避

description

第 14 章 用户自定义对象. 用户对象具有下述优势: (1) 避免了在应用程序的不同地方编写功能相同或相近代码的麻烦,提高了应用程序的可维护性。 (2) 用户对象可以把一组总在一起使用的可视控件组合在一起,构成一个完成特定功能的控件,应用程序可以随时使用它。 (3) 用户对象提供了构造具有一致外观的可视部件的方法。 (4) 用户对象能够把相关功能封装在一起。 (5) 用户对象允许开发人员扩展某些对象的功能。 用户对象的命名一般以“ u_” 为前缀,用户对象控件或实例的命名一般以“ uo_” 为前缀。. 第 14 章 用户自定义对象. 14.1 可视用户对象 - PowerPoint PPT Presentation

Transcript of 第 14 章 用户自定义对象

Page 1: 第 14 章 用户自定义对象

第 14 章 用户自定义对象 用户对象具有下述优势:(1) 避免了在应用程序的不同地方编写功能相同或相近代码的麻烦,

提高了应用程序的可维护性。(2) 用户对象可以把一组总在一起使用的可视控件组合在一起,构成

一个完成特定功能的控件,应用程序可以随时使用它。(3) 用户对象提供了构造具有一致外观的可视部件的方法。(4) 用户对象能够把相关功能封装在一起。(5) 用户对象允许开发人员扩展某些对象的功能。 用户对象的命名一般以“ u_” 为前缀,用户对象控件或实例的命

名一般以“ uo_” 为前缀。

Page 2: 第 14 章 用户自定义对象

第 14 章 用户自定义对象14.1 可视用户对象 14.2 类用户对象 14.3 用户对象使用编程实例

Page 3: 第 14 章 用户自定义对象

14.1.1 创建标准可视用户对象 标准可视用户对象在现有控件基本功能的基础上增加应用程序需要的功能。继承了原始控件的各种特征,包括属性、事件和函数。

例如,命令按钮只能用鼠标点击,而不响应回车键,可以利用标准可视用户对象

来定制一个用户对 象 , 既 能 用 鼠标 点 击 , 又 可 以按回车键操作。点 击 主 窗 口 的 工具栏图标按钮 New 或选择主菜单 File 的 New 子菜单,将打开标题为“ New” 的 窗 口 , 选择 Object 页。

图 14-1 创建用户对象

Page 4: 第 14 章 用户自定义对象

14.1.1 创建标准可视用户对象 打开标题为“ Select Standard Visual Type” 的窗口,选择所要的

对象类型,点击 Ok 按钮。这里我们选择 commandbutton 来定制一个命令按钮用户对象。

图 14-2 选择对象类型

Page 5: 第 14 章 用户自定义对象

14.1.1 创建标准可视用户对象 选好标准对象类型后,

将打开用户对象画板。该界面和创建窗口的界面相似。在这里可以设置 CommandButton 的属性如 Text 、字体、控件大小等作为该用户对象的默认值,还可以定义用户函数和用户事件,并给某些事件编写代码。

图 14-3 定义可视用户对象

Page 6: 第 14 章 用户自定义对象

14.1.1 创建标准可视用户对象 给该用户对象定义一个用户事件以响应用户的回车键操作。用户

事件名为“ ue_enter” ,事件号选“ pbm_keydown” 。

14-4 在用户对象中定义用户事件

Page 7: 第 14 章 用户自定义对象

14.1.1 创建标准可视用户对象在该事件中输入代码:

if KeyDown(KeyEnter!) then// 如果是回车键 , 则触发鼠标单击事件this.TriggerEvent(Clicked!)

end if保存该用户对象,名为 u_commandbutton 。定义了一个可视用户对象 u_commandbutton ,该对象除具备标准的 CommandButton 命令按钮的属性、事件、函数外,还有用户自定义事件 ue_keyenter ,当焦点落在该控件上时,用户按回车键将触发该事件。

Page 8: 第 14 章 用户自定义对象

14.1.2 使用可视用户对象 可视用户对象定义

好 后 , 就 可 以 象 标准控件那样使用。在窗口打开后,点击工具栏上的控件工具箱中的用户对象 User Object 图标按钮。

图 14-5 控件工具箱

用户对象

Page 9: 第 14 章 用户自定义对象

14.1.2 使用可视用户对象 将出现标题为“ Selec

t Object” 的窗口,在其中列出了当前 pbl 文件中所有的用户对象,选择一个用户对象,点击 OK 按钮或直接双击所选的用户对象。这里选 u_commandbutton 。

调整用户对象在窗口中的位置、大小,并设置必要的属性。这样,当焦点落在该控件上时,按回车键将触发 Click事件。

图 14-6 选择用户对象

Page 10: 第 14 章 用户自定义对象

图 14-7 打开用户对象

2. 选择 pbl 库

3. 选择 User Objects

4. 选择要修改的用户对象

1. 选择目标

14.1.3 修改用户对象 修改用户对象。选择

工具栏的 Open 图标,打开标题为“ Open”的窗口。在 Application Libraries 中选择要修改的用户对象所在的 pbl库文件,在对象类型 Object Type 中选择 User Objects ,选择要修改的用户对象,点击OK 按钮或直接双击所选的用户对象,将打开用户对象定义画板,如前图 14-3 所示。

Page 11: 第 14 章 用户自定义对象

14.1.4 创建定制可视用户对象 定制可视用户对象是将多个控件以及可视用户对象组合成一个整体,

完成一定的功能和操作。选择主窗口工具栏上的图标按钮 New 或选择主菜单 File 的 New 子菜单,将打开标题为“ New” 的窗口,选择Object 页。

图 14-8 选择定制可视用户对象

Page 12: 第 14 章 用户自定义对象

14.1.4 创建定制可视用户对象 定制可视用户对象画板。在左上角的窗口上放置所需的控件和已

定义的可视用户对象。还可以定义用户函数和用户事件,并给某些事件编写代码。

图 14-9 定制可视用户对象画板

在这里放置控件和已定义的可视用户对象

Page 13: 第 14 章 用户自定义对象

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

是窗 口上的控件

Page 14: 第 14 章 用户自定义对象

14.1.5 创建外部可视用户对象 使用外部控件的目的通常是为了完成 PB 本身难以完成或不支持的功能。 选择主窗口工具栏上的图标按钮 New 或选择主菜单 File 的 New 子菜单,选择

Object 页。

图 14-10 创建外部可视用户对象

Page 15: 第 14 章 用户自定义对象

14.1.5 创建外部可视用户对象 在图 14-10 Object 页中选择 External Visual项,点击 OK 按钮

或直接双击 External Visual项,将打开外部可视用户对象画板。

图 14-11 外部可视用户对象画板

Page 16: 第 14 章 用户自定义对象

14.1.5 创建外部可视用户对象 图 14-11 中,在 LibraryName 中输入外部用户对象所在的 DLL

文件名,或者单击 Browse 按钮选择 DLL文件;在 Class Name编辑框中键入 DLL中的注册类名(该类名通常由生产 DLL的厂商提供);在“ Text” 编辑框中输入显示在控件上的文本(并非都需要此项);根据需要设置其它属性;说明用户对象所需的函数、事件、变量、结构;编写用户对象的各种事件处理程序;最后保存用户对象。定义了外部可视用户对象后,就可以在窗口、定制可视用户对象等多个地方运用该对象了。注意:要创建外部可视用户对象,必须知道外部用户对象所在的DLL文件名和注册类名。

Page 17: 第 14 章 用户自定义对象

14.2.1 创建标准类用户对象 选择主窗口工具栏上的图标按钮 New 或选择主菜单 File 的 New

子菜单,将打开标题为“ New” 的窗口,选择 Object 页。

图 14-12 定义标准类用户对象

Page 18: 第 14 章 用户自定义对象

14.2.1 创建标准类用户对象 在图 14-12 的 Object 页中选择 Standard Class项,点击 OK 或

直接双击 Standard Class项,打开标题为“ Select Standard Class Type” 的窗口来选择创建的用户对象所继承的内部系统对象。

图 14-13 选择标准对象类

Page 19: 第 14 章 用户自定义对象

14.2.1 创建标准类用户对象 选择所要的对象类,点 Ok ,打开标准类用户对象定义画板。 类用户

对象是不可见的,不能在它上面布置任何的可视控件。为这个对象封装属性、函数和事件以及变量等,编写用户对象所需的各种事件处理程序。最后保存用户对象。

图 14-14 标准用户类画板

Page 20: 第 14 章 用户自定义对象

14.2.2 使用类用户对象 使用类用户对象时,需要在代码中创建它的一个实例 。

 步骤为: (1) 说明类用户对象类型的变量,用 CREATE语句创建该对象的

一个实例; (2)  在变量的整个作用域中,代码都能访问该对象的属性、事件、

函数,就像使用系统预定义对象那样(比如事务处理对象 SQLCA);

(3) 不再使用该用户对象时,使用 DESTROY 语句删除该对象,以释放它所占的内存。

Page 21: 第 14 章 用户自定义对象

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 // 使用后删除用户对象

Page 22: 第 14 章 用户自定义对象

14.2.3 创建定制类用户对象 定制类用户对象是用户自己设计的对象,用于封装不需要可视特

性的处理过程。这些对象并不继承某个对象或控件,完全由用户通过定义实例变量、函数、事件来实现。定制类用户对象只有两个系统预定义事件: Constructor 和 Destructor 。其创建过程和使用方法完全类似于标准类用户对象。

要将用户对象删除,只有在 Library 工作区才能实现。方法是打开 Library 工作区,右击要删除的对象,出现弹出式菜单,选择Delete ,打开一个提示框,选择 Yes ,删除所选的对象。参见PBL 库管理器。

Page 23: 第 14 章 用户自定义对象

14.3 用户对象使用编程实例 在用户自定义事件的编程实例中,要求当焦点落在命令按钮上时,按

回车键能代替鼠标。在数据窗口中,按回车键可以跳到下一个输入项,而不是下一行。在最后一行的最后一列按回车键时,将增加一个空行。在最后一行按向下的箭头键↓时,也增加一个空行。

图 14-15 用户对象使用实例

Page 24: 第 14 章 用户自定义对象

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 。

Page 25: 第 14 章 用户自定义对象

14.3 用户对象使用编程实例(3) 再创建标准可视用户对象,也是从标准控件 commandbutton 命

令按钮继承来的。给该用户对象增加自定义事件 ue_keyenter ,事件号为 pbm_keydown 。该用户对象能够响应鼠标和回车键操作,并关闭控件所在的窗口。

        在该用户对象的自定义事件 ue_keyenter 中输入以下代码:if KeyDown(KeyEnter!) then

// 如果是回车键 , 则触发鼠标单击事件this.TriggerEvent(Clicked!)

end if        在该用户对象的事件 click 中输入以下代码:

close(parent) // 关闭控件所在的窗口保存该用户对象,名为 u_cb_return 。

(4) 创建标准可视用户对象,它是从标准控件 datawindow 数据窗口继承来的。给该用户对象增加两个自定义事件和一个自定义函数:

Page 26: 第 14 章 用户自定义对象

14.3 用户对象使用编程实例    一个事件是 ue_keyenter ,事件号为 pbm_dwnprocessenter 。

该事件的主要功能是按回车键可以跳到下一个输入项,不是下一行。当在最后一行的最后一列按回车键时,将增加一个空行。

  一个事件是 ue_keyarrow ,事件号为 pbm_dwntabdownout. 。该事件的主要功能是在最后一行按向下的箭头键↓时,增加一个空行。

  自定义函数是 uf_getcolnumber() ,无入口参数,返回值表示数据窗口中的列数。该函数的功能就是求当前数据窗口中的列的数目。

  在该用户对象的自定义函数 uf_getcolnumber() 中输入以下代码: //返回当前数据窗口的列数 long row

int col,oldcol,ret

row=this.getrow()

oldcol=this.getcolumn() //oldcol 为当前列 if row<1 then return 0 // 数据窗口为空则返回

Page 27: 第 14 章 用户自定义对象

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 ifnext return 0     在该用户对象的自定义事件 ue_keyenter 中输入以下代码: int col,colnum long row colnum=uf_getcolnumber() //求数据窗口的列数

Page 28: 第 14 章 用户自定义对象

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 ifend ifreturn 1 // 放弃原来的操作

Page 29: 第 14 章 用户自定义对象

14.3 用户对象使用编程实例   在该用户对象的自定义事件 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_u

pdate 控件的 text 属性赋值;给 dw_1 的 dataobject 属性赋值,即将控件与某个数据窗口对象相关联。

Page 30: 第 14 章 用户自定义对象

14.3 用户对象使用编程实例  给应用对象 ustu 的 open 事件编写代码:

SQLCA.AutoCommit = Truesqlca.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!)

returnend ifopen(w_uobject)

Page 31: 第 14 章 用户自定义对象

14.3 用户对象使用编程实例   给窗口 w_uobject 的 open 事件编写代码:

dw_1.SetTransObject(SQLCA)   给增加记录的命令按钮 cb_append 的 clicked 事件编写代码:

long rowrow=dw_1.insertrow(0)dw_1.setrow(row)dw_1.scrolltorow(row)dw_1.setfocus()

   给插入记录的命令按钮 cb_insert 的 clicked 事件编写代码:long rowrow=dw_1.insertrow(dw_1.getrow())dw_1.setrow(row)dw_1.scrolltorow(row)dw_1.setfocus()

   给删除记录的命令按钮 cb_delete 的 clicked 事件编写代码:dw_1.deleterow(dw_1.getrow())

   给显示记录的命令按钮 cb_retrieve 的 clicked 事件编写代码:dw_1.retrieve()

   给存盘的命令按钮 cb_update 的 clicked 事件编写代码:dw_1.update ()