数据窗口可变细目带的应用
孙 丰
在数据库编程中,我们常常遇到字符型字段中的值的长度不确定,这就给数据的显示与打印带来麻烦,如果要想使显示或打印的数据一目了然,在显示或打印宽度不变的情况下,就必须采用多行显示。在PowerBuilder中的解决方法就是把数据窗口的细目带定义为可变高度。
实现数据窗口细目带可变首先要在设计数据窗口时,对需要根据长度调整尺寸的列,点鼠标右键在其弹出式选单中选择“Properties”项,接着在其属性对话框的“Position”标签页中,选中“Autisize
Height”复选框;接着将鼠标指针置于代表细目带的栏上,点鼠标右键在其弹出式选单中选择“Properties”,在随后出现的属性对话框中选择“General”标签页,选中“Autisize
Height”复选框。注意:为了防止列的数据水平滚动,需在该列的属性对话框中选择“Edit”标签页,并且使该标签页的“Auto
Horz Scroll”复选框呈未选中状态。
完成以上步骤并不表示问题已经解决。在实际应用中特别是字段的值中有汉字时,我们会发现有时数据窗口细目带并没有自动换行,而是截掉一些数据。为了实现在各种情况下的细目带高度的自我调整,笔者编制了一个字符串处理函数,可使任意输入的英文或中文在数据窗口的细目带中自动换行。源程序如下:
int li—len,li—judge,li—i,li—j,li—hz
string ls—right,ls—a,ls—line,ls—return,ls—space
string ls—left[100]
ls—line=′ ′
ls—return=char(10)
ls—space=′ ′
li—judge=0
li—len=fi—limit
ls—right=trim(fs—str)
li—i=1
ls—left[1]=′′
do while li—judge=0
if len(ls—right)<=li—len then
ls—a=′′
for li—j=1 to li—i
if li—j
ls—a=ls—a+ls—left[li—j]
else
ls—a=ls—a+ls—left[li—j]+ls—right
end if
next
exit
end if
if asc(right(left(ls—right,li—len+1),1))=asc(ls—return) or &
asc(right(left(ls—right,li—len+1),1))=asc(ls—space) or & asc(right(left(ls—right,li—len+1),1))=13
then
li—i=li—i+1
ls—left[li—i]=left(ls—right,li—len)
ls—right=right(ls—right,len(ls—right)-li—len)
continue
end if
li—i=li—i+1
ls—left[li—i]=left(ls—right,li—len)
ls—a=right(ls—left[li—i],1)
if asc(ls—a)>= asc(′A′) and asc(ls—a)<=asc(′Z′) or asc(ls—a)>=asc(′a′)
and asc(ls—a)<=asc(′z′) or asc(ls—a)>=asc(′1′) and asc(ls—a)<=asc(′9′)
or &
asc(ls—a)=asc(′0′) or asc(ls—a)=asc(′`′) or asc(ls—a)=asc(′@′) or
asc(ls—a)=asc(′#′) or asc(ls—a)=asc(′$′) or asc(ls—a)=asc(′%′) or
asc(ls_a)=asc(′%′) or &
asc(ls—a)=asc(′^′) or asc(ls—a)=asc(′&′) or asc(ls—a)=asc(′*′)
or asc(ls—a)=asc(′(′) or asc(ls—a)=asc(′)′) or asc(ls—a)=asc(′-′) or
asc(ls—a)=asc(′_′) or &
asc(ls—a)=asc(′=′) or asc(ls—a)=asc(′+′) or asc(ls—a)=asc(′\′)
or asc(ls—a)=asc(′|′) or asc(ls—a)=asc(′{′) or asc(ls—a)=asc(′}′) or
asc(ls—a)=asc(′[′) or &
asc(ls—a)=asc(′]′) or asc(ls—a)=asc(′;′) or asc(ls—a)=asc(′:′) or
asc(ls—a)=asc(′"′) or asc(ls—a)=asc("′") or asc(ls—a)=asc(′,′)
or asc(ls—a)=asc(′<′) or &
asc(ls—a)=asc(′.′) or asc(ls—a)=asc(′>′) or asc(ls—a)=asc(′/′)
or asc(ls—a)=asc(′?′) or asc(ls—a)=126 then
ls—left[li—i]=left(ls—right,li—len)+ls—line
ls—right=right(ls—right,len(ls—right)-li—len)
continue
end if
if asc(ls—a)=asc(ls—return) or asc(ls—a)=asc(ls—space) or asc(ls—a)=13
then
ls—right=right(ls—right,len(ls—right)-li—len)
continue
end if
li—hz=0
for li—j=1 to li—len
ls—a=right(left(ls—left[li—i],li—j),1)
if asc(ls—a)>=asc(′A′) and asc(ls—a)<=asc(′Z′) or asc(ls—a)>=asc(′a′)
and asc(ls—a)<=asc(′z′) or asc(ls—a)>=asc(′1′) and asc(ls—a)<=asc(′9′)
or &
asc(ls—a)=asc(′0′) or asc(ls—a)=asc(′`′) or asc(ls—a)=asc(′@′) or
asc(ls—a)=asc(′#′) or asc(ls—a)=asc(′$′) or asc(ls—a)=asc(′%′) or
asc(ls—a)=asc(′%′) or &
asc(ls—a)=asc(′^′) or asc(ls—a)=asc(′&′) or asc(ls—a)=asc(′*′)
or asc(ls—a)=asc(′(′) or asc(ls—a)=asc(′)′) or asc(ls—a)=asc(′-′) or
asc(ls—a)=asc(′_′) or &
asc(ls—a)=asc(′=′) or asc(ls—a)=asc(′+′) or asc(ls—a)=asc(′\′)
or asc(ls—a)=asc(′|′) or asc(ls—a)=asc(′{′) or asc(ls—a)=asc(′}′) or
asc(ls—a)=asc(′[′) or &
asc(ls—a)=asc(′]′) or asc(ls—a)=asc(′;′) or asc(ls—a)=asc(′:′) or
asc(ls—a)=asc(′"′) or asc(ls—a)=asc("′") or asc(ls—a)=asc(′,′)
or asc(ls—a)=asc(′<′) or &
asc(ls—a)=asc(′.′) or asc(ls—a)=asc(′>′) or asc(ls—a)=asc(′/′)
or asc(ls—a)=asc(′?′) or asc(ls—a)=126 or asc(ls—a)=asc(′ ′) or asc(ls—a)=13
or asc(ls—a)=10 then
continue
end if
if li—hz=0 then
li—hz=1
else
if li—hz=1 then
li—hz=0
end if
end if
if li—j=li—len and li—hz=1 then
ls—left[li—i]=left(ls—right,li—len -1)+ls—line
ls—right=right(ls—right,len(ls—right)-li—len+1)
exit
end if
if li—j=li—len and li—hz=0 then
ls—left[li—i]=left(ls—right,li—len)+ls—line
ls—right=right(ls—right,len(ls—right)-li—len)
exit
end if
next
loop
return trim(ls_a)
解决数据窗口细目带可变高度的问题还有其他方法,这里仅是一个经验之谈。