2024年4月12日发(作者:)

PB中下拉列表使用的假设干技巧

于红 聂尚宇

摘要 对PB中下拉列表的使用方法进行了研究,并提出了几种使用下拉

列表的实现方法,实践说明这些方法具有简单实用的特点。

关键词 下拉列表;动态;控件;事件;

Some Skills in the Use of DDLB of PB

Yu Hong Nie Shangyu

Department of Electronic Engineering, DFU

Abstract The use of DDLB in PB is studied and some skills are proposed.

The results show that these skills are simple and practical.

Key words DDLB; dynamic; control; event

随着科学技术的不断发展,电脑已经应用于社会的各个领域,相应的

管理软件的编制工作显得尤为重要。现有的编程工具中,PowerBuilder

是数据库管理软件设计比较理想的工具,但如何合理地选用控件和灵活

地使用每一个控件,以充分发挥PB的优势,是人们在编程过程中常遇到

的难题。作者对PB中的控件之一——下拉列表的使用

[1]

进行了研究,并

提出几个灵活使用下拉列表的方法。

1 下拉列表及其相应的事件

下拉列表是在窗口中定义的一个控件,与之相应的事件如下表所示:

表1 下拉列表控件上的事件

事件名称

Constructor

Destructor

Doubleclicked

Dragdrop

Dragenter

Dragleave

Dragwithin

Getfocus

Lostfocus

触发时机

在窗口中的OPEN事件发生前触发

在窗口中的CLOSE事件发生后触发

当下拉列表控件〔选中且激活〕被双击时触发

当一个可拖动控件到达下拉列表控件时触发

当一个可拖动控件进入下拉列表控件时触发

当一个可拖动控件离开下拉列表控件时触发

当一个可拖动控件在下拉列表控件内部时触发

正在下拉列表控件获得焦点之前〔它被选中且成为有效以前〕

触发。

当下拉列表控件失去焦点时触发

Modified

Other

Rbuttondown

当下拉列表控件失去焦点,同时下拉列表控件的文本内容已

被更改,且按动了ENTER或TAB时触发

当一个WINDOWS信息发生非PowerBuilder事件〔例如,用户

按动了鼠标中间的键〕时触发

当用户在下拉列表空间中按动鼠标右键时触发

Selectionchanged 当选中下拉列表控件的某一项时触发

当选中下拉列表控件的某一项时,不仅触发Selectionchanged事

件,还会触发Modified事件。

2 动态使用下拉列表

传统的下拉列表使用是静态的,它在一定程度上满足了编程的需要,

但是不能满足所有需要。例如,有时希望下拉列表中的选项在程序运行

过程中可以变化,这用静态下拉列表定义选项是不能实现的,这就促使人

们去思考如何使用动态下拉列表。有两种情况需要使用动态下拉列表。

1〕下拉列表中的选项与数据库中某列的内容相关联②

实际应用中,在对数据库表中的数据按名称进行查询时,为了减少

输入量,可以将库中某列的内容〔如单位名称〕列在下拉列表中供用户

选择,这样既可以保证选中的项目一定是库中的项目,而且不用输入汉

字;又使下拉列表的使用具有一定的灵活性,动态下拉列表选项确实定

必须在下拉列表被使用之前进行,可以在下拉列表所在窗口的Open事件

中确定,也可以在下拉列表的Getfocus事件中确定,相应的script为

string id,ic

int i-op=1

declare c1 cursor for

select hotelid from hotelid-dangan using SQLCA;

open c1;

fetch c1 into: id;

do while e=0

select p1602 into :ic from p16 where p1601=:id using sqlca;

if finditem(ddlb-1,ic,1)=-1 then

item(ic,+i-op)

i-op=i-op+1

end if

fetch c1 into :id;

loop

close c1;

其中,下拉列表中的项目取自数据库表hotelid-dangan 的hotelid

列所对应的p16表中的p1602(即单位名称)。

2〕在下拉列表的使用过程中动态增加选项

[1]

下拉列表中的选项在使用过程中有可能需要随时增加一些内容,例

如:在“政治面貌”一列的下拉列表中包含党员、群众、团员。在运行

过程中,发现有的人“政治面貌”为“民主党派”,此项不能从下拉列

表中选择,但假设“政治面貌”为“民主党派”的人很多,输入量就会

增加,这时用户可能希望将“民主党派”送到下拉列表中以便于输入。

处理方法:下拉列表控件定义为“可编辑”,下拉列表控件的Modified

事件中编写script为

int i-file

i-file=totalitems(ddlb-1)

if item(,1)=0 then

insertitem(ddlb-1,,i-file)

end if

此种方法只能保证在一次运行过程中该项存在于下拉列表中,第二

次重新进入该窗口后,下拉列表中的内容又恢复到定义时的状态。

3 在下拉列表中实现模糊查询

前述的查询方法中的选项来自于数据库,选项可能比较多,选择选

项的时间也较长,解决这一问题可以通过模糊查询的方法。具体如下:

在下拉列表控件的Modified事件中编写script为

hotelcx-mc= string ic-tj

long in-pos

boolean empty-ddlb=false

if not (sele-modi ) then

string select-str

long ad-count

ad-count=totalitems(ddlb-1)

ic-tj=trim()

do while ad-count>=0

item(ad-count)

select-str=

in-pos=pos(select-str,ic-tj)

if in-pos<>0 then

empty-ddlb=true

else

deleteitem(ddlb-1,ad-count)

end if

ad-count --

loop

if empty-ddlb=false then

messagebox(“提示信息",“没有满足条件的单位,请重新输入!")

string id-1,ic1 int i-op=1

declare c2 cursor for

select hotelid from hotelid-dangan using SQLCA;

open c2;

仅供参考

fetch c2 into :id-1;

do while e=0

select p1602 into :ic1 from p16 &

where p1601=:id-1 using sqlca;

if finditem(ddlb-1,ic1,1)=-1 then

item(ic1,+i-op)

i-op=i-op+1

end if

fetch c2 into :id-1;

loop

close c2;

=""

setfocus(ddlb-1)

else

st=true

=""

setfocus(ddlb-1)

end if

end if

sele-modi=false

其中:hotelcx-mc是一个shared变量,用来存放要进行模糊查询的

条件;ic-tj是进行查询时用来与下拉列表中的选项进行比较的内容;

in-pos用来存放每次比较的结果;empty-ddlb用来存放是否查到满足条

件的单位名称,如果没有满足条件的单位,必须将下拉列表恢复到最多

项选择项的状态;sele-modi是一个shared变量,用来屏蔽

Selectionchanged事件,因为选择下拉列表中的选项后激活

Selectionchanged事件,但此时不希望触发Modified事件,所以要屏

蔽;select-str用来存放从下拉列表中取出的每一项;ad-count存放下

拉列表中的总项数

[2]

在下拉列表控件的Selectionchanged事件中增加语句

sele-modi=true〔该事件中其他script代码与次数无关,故在此略去〕,

以保证执行Selectionchanged事件中的语句之后不再执行Modified事

件中的语句。另外,在窗口的Open事件中编写script为

string id,ic

int i-op=1

declare c1 cursor for

select hotelid from hotelid-dangan using SQLCA;

open c1;

fetch c1 into :id;

do while e=0

select p1602 into :ic from p16 where p1601=:id using sqlca;

if finditem(ddlb-1,ic,1)=-1 then

item(ic,+i-op)

i-op=i-op+1

end if

fetch c1 into :id;

loop

close c1;

sele-modi=false

以上程序已通过调试,有兴趣的读者不妨一试。

注释:① 侯志平. PowerBuilder高级应用技术. 北京:北京晓通网络

数据库研究所, 1997

②蒋红,文平.PowerBuilder4.0/5.0事件、属性与函数.北京:北京

晓通网络数据库研究所,1997

作者简介:于红: 1968年生, 女, 讲师, 大连 116023

作者单位:大连水产学院电子工程系

仅供参考