|
p align="JUSTIFY"> 在开发Client/Server大型网络数据库信息管理系统的时候,根据实际业务要求有时候会遇到一些“超常规”的系统需求,使用通常情况下开发工具提供的标准控件常常无法满足这样的需求。例如我们在进行一个总经理级的综合统计查询分析子系统的开发的时候就遇到了这样一个要求:“在进行销售查询的时候,要求能够一次选择多个省份进行查询”。通常情况下我们使用下拉列表框来选择省份,但是标准的下拉列表框一次只能选择其中的一项,经过研究,我们使用PowerBuilder7.0提供的EditMask、CommandButton和DataWindow创建了一个用对象(User Object)满足了我们的要求。 它的具体功能是:(1)单击列表框的下拉箭头,弹出下拉框,同时下拉箭头变成上拉箭头;(2)用户可以从下拉框里选择一项或多项内容,每单击其中的一项,如果该项内容以前没有选中,则该项前面打上对号表示该项已被选中,否则对号消失表示不选中该项;(3)选择完毕之后单击上拉箭头,列表框消失,同时在文本框里显示提示信息“您已经选择了XXX项内容”;(4)如果用户再次单击下拉箭头,则刚刚用户所作的选择项会排在下拉列表框的最上端,省去了用户上下翻动下拉框查看不便的麻烦。 - 用户对象的创建
新建一个“Custom Visual”用户对象,控件摆设如下:  说明:(1)Cb_1的字体为“Webdings”,默认值是“6”(下拉箭头)。 (2)定义控件函数f_min() & f_max(),二者均无参数、无返回值。 脚本如下: f_max(): int li_height_max=584 dw_1.sort() this.height=li_height_max cb_1.text="5" //上拉箭头 li_status=1 f_min(): long ll_row,i int li_height_min=116,li_checkedcount=0 ll_row=dw_1.rowcount() for i=1 to ll_row p> li_checkedcount=li_checkedcount + dw_1.object.pbj[i] next this.height=li_height_min em_1.text=你已经作了+string(li_checkedcount)+个选择. cb_1.text="6" li_status=0 (3)声明Instance变量: int li_height_min=116,li_height_max=584,li_status=0 long ll_lastrow=0 - 各控件的事件脚本
- 用户对象
- onstructor 事件脚本:
f_min() this.event post ue_open() - Ue_open事件脚本:
dw_1.setsort("pbj D") - 命令按钮cb_1
- Clicked事件脚本:
choose case li_status case 0 f_max() case 1 f_min() end choose - 数据窗口dw_1
- Clicked事件脚本:
if this.object.pbj[row]=0 then this.object.pbj[row]=1 else this.object.pbj[row]=0 end if - Mousemove事件(pbm_dwnmousemove)脚本:
long ll_row ll_row = row If ll_row $#@62; 0 and ll_row $#@60;$#@62; ll_lastrow Then ll_lastrow = ll_row this.selectrow(0, false) this.setrow(ll_row) this.selectrow(ll_row, true) End If - 调用方法:
在添加了本用户对象的窗口的open事件开始处里添加如下命令即可: uo_1.dw_1.object=’dw_sb//设置该用户对象的数据窗口对象为省别的数据窗口。 uo_1.dw_1. settransobject(sqlca) uo_1.dw_1.retrieve() 注:以上程序在PowerBuilder 7.0调试通过。 |