[返回]
中国计算机报1999年第71期

数据窗口可变细目带的应用

孙 丰

  在数据库编程中,我们常常遇到字符型字段中的值的长度不确定,这就给数据的显示与打印带来麻烦,如果要想使显示或打印的数据一目了然,在显示或打印宽度不变的情况下,就必须采用多行显示。在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)

   解决数据窗口细目带可变高度的问题还有其他方法,这里仅是一个经验之谈。