HITSY 版 (精华区)
发信人: lyfe (修身养性), 信区: HITSY
标 题: PB中窗口操作技巧两则(转载)
发信站: 哈工大紫丁香 (2002年04月06日13:16:07 星期六), 站内信件
【 以下文字转载自 Database 讨论区 】
【 原文由 Sun@Lilac 所发表 】
PowerBuilder是一个功能全面、性能优异的应用开发工具,但同时它也是一个结构体系复
杂的系统,学习和掌握它都有一定的难度。我在实际工作中,总结了两条窗口操作的技巧
,现写出来与大家共享。
一、在下拉数据窗口中查找与输入数据匹配的数据
我们从下拉数据窗口中查找数据时,一般是需要从下拉数据窗口的第一行开始查找。如果
下拉数据窗口中的数据很少,这样查找很方便。但是,如果下拉数据窗口中的数据很多,
用此法查找起来就会很麻烦。如果下拉数据窗口具有自动匹配功能,即将数据输入该列时
,该列的下拉数据窗口自动滚动到与输入数据最匹配的第一个数据所在的行,并且高亮度
显示该行。这样就可以在很短的时间内查找到用户所需的数据,省去了用户在下拉数据窗
口中查找的麻烦,提高了输入数据的准确性及查找相关数据的效率。实现这一功能,需在
数据窗口控制(dw-1)的“editchanged”事件中写入如下代码:
//定义变量
string ls_search,ls_col_name,ls_type,ls_mach
datawindowchild child
long ll_count=1
long ll_mthrow
string ll_mthtext
long ll_searchrow=0
//判别当前列是否具有下拉数据窗口,如果不具有,则退出事件程序
ls_col_name=dw_1.getcolumnname()
if dw_1.getchild(ls_col_name,child)〈0 then
return
end if
//获得下拉数据窗口的显示列及其类型
ls_col_name=this.describe(ls_col_name+".dddw.displaycolumn")
ls_type=child.describe(ls_col_name+".coltype")
//获得输入到列中的文本
ls_search=dw_1.gettext()
if len(ls_search)=0 then
return
end if
//找出下拉数据窗口中与输入数据最匹配的行
if ls_type="number" then
do until ll_count〉child.rowcount()
ll_mthrow=child.getitemnumber(ll_count,ls_col_name)
if left(string(ll_mthrow),len(ls_search))=ls_search then
ll_searchrow=ll_count
exit
else
ll_count=ll_count+1
end if
loop
else
do until ll_count〉child.rowcount()
ll_mthtext=child.getitemstring(ll_count,ls_col_name)
if left(ll_mthtext,len(ls_search))=ls_search then
ll_searchrow=ll_count
exit
else
ll_count=ll_count+1
end if
loop
end if
if ll_searchrow〉0 then
//下拉数据窗口中被选中的行以高亮度显示
child.setrow(ll_searchrow)
if ls_type="number" then
ls_mach=string(child.getitemnumber(ll_searchrow,ls_col_name))
dw_1.setitem(dw_1.getrow(),dw_1.getcolumn(),ls_mach)
else
ls_mach=child.getitemstring(ll_searchrow,ls_col_name)
dw_1.setitem(dw_1.getrow(),dw_1.getcolumn(),ls_mach)
end if
child.selectrow(ll_searchrow,true)
end if
注意,在带有下拉数据窗口的列中,必须指定该列的“Allow Editing”属性为True。
二、在窗口和用户对象间实现信息交互的技巧
在实际应用中经常需要将窗口对象的信息传递给该窗口引用的一个用户对象,或者将用户
对象的参数传递给窗口对象。实现两者之间的信息交互有很多方法与技巧,我在这里介绍
其中的三种方法。
1.直接引用对象属性
实现窗口与用户对象通信的最简单方法是直接引用对象的属性。例如,如果在窗口中有一
个名为uo_1的用户对象控件,它关联一个定制的可视用户对象,这个定制的用户对象有一
个名为sle_1的单行编辑器,则可以在窗口的脚本中编写如下代码:
uo_1.sle_1.text=string(today())
这种方法简单,但是窗口和用户对象之间的接口比较模糊。为了保持在用户对象和窗口之
间有一个清晰的界面,最好通过函数和用户事件来与用户对象通信。
2.使用函数实现窗口与用户对象的通信
当要从窗口传递信息给用户对象时,首先在用户对象描绘器中为用户对象定义一个用户对
象级的函数,它的访问权限是Public。接着为该函数定义需要传递的输入参数,这些参数
的实际值来自于窗口对象。当把定义好的用户对象放入窗口后,在窗口的脚本中调用该用
户对象级函数,把实际的信息值通过用户对象函数的参数传递过去。这样,用户对象就可
以处理窗口对象中的信息了。
例如,定义一个可视用户对象,其中包含一个单行编辑控件,当使用者在其中输入字符串
后,将所输入的字符串传送到窗口的单行编辑控件sle_1中。
首先在窗口描绘器中定义一个窗口函数wf_1,它有一个参数sf,用于接受来自用户对象的
字符串。该函数体只有一条代码,把接受的参数显示在单行编辑控件sle_1中:
sle_1.text=sf
然后在用户对象描绘器中定义一个可视用户对象,包括一个单行编辑控件sle_u1,在
sle_u1的Modified事件中输入下面的代码:
parent.f2(this.text)
其中f2是用户对象级函数。由于在用户对象的控件中无法调用窗口的函数,所以先在用户
对象中调用用户对象级的函数,将字符串传递给f2的参数,然后在f2中调用窗口函数wf_1
。用户对象函数f2的代码如下:
parent.dynamic wf_1(ff)
注意其中的dynamic关键字不能省略。这是因为,在用户对象描绘器中无法确定该用户对
象所在窗口是否有此函数,所以需要在运行时确定此语句的正确性。
3.使用用户事件实现窗口与用户对象的通信
把定制的用户对象放在窗口或者另一个定制的用户对象中之后,只能给该用户对象的事件
编写脚本,而不能给该用户对象中的控件编写脚本。因此,经常需要为用户对象定义用户
事件,然后在Windows描绘器中为用户事件编写脚本,这样就可以实现在窗口中引用用户
对象中的控件。
例如,定义一可视用户对象,包括一个命令按钮,为该可视用户对象定义一个用户事件“
ue_user”,在命令按钮的clicked事件中编写程序代码:
parent.triggerevent(″ue_user″)
把该用户对象放在窗口中。在窗口中该用户对象的Script描绘器的Select Event下列表中
,可以发现为该用户对象所声明的用户事件“ue_user”并可为它编写代码,从而实现在
窗口中引用用户对象中的控件。
--
太阳就是个大灯泡。
※ 来源:·紫 丁 香 bbs.hit.edu.cn·[FROM: 202.118.239.237]
--
※ 转载:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: 202.118.226.245]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.044毫秒