宋铭
pb数据窗口没有提供调整计算域行间距的方法,甚至利用richtext类型的数据窗口也不行。我们设想,在计算域各行之间增加回车换行符来调整行间距。但由于计算域的内容是动态可变的,为此,我们设计了一个全局函数fun—string—intercept,解决了这个问题。
该函数有两个参数:text和len,其中text为需要处理的字符串,len为截取长度。函数按长度len把text截取成一行行的字符串,行与行之间增加一个空行,使正文部分疏落有致。
一、主要问题及解决方案
由于字符串由字母、数字和汉字混排组成,简单按固定长度截取会出现问题。需要考虑以下几个问题:
1. 如果截取字符串的最后一个字符刚好落到汉字中间,则会显示半个汉字,形成该行及下一行乱码。
解决方案:为截取字符串设计了半个汉字计数器,如计数器为奇数,则去掉最后一位字符。
2. 如果截取字符串最后一个字符刚好落到英文单词中间,则会把单词生硬地分割。
解决方案:此种情况该单词移到下一行。
3. 如果截取字符串最后一个字符刚好落到数字中间(如1999),则会把数字生硬地分割。
解决方案:此种情况该数字移到下一行。
4. 如果截取字符串最后一个字符刚好落到回车符(~r~n)上,则会多空一行。
解决方案:如果截取字符串已包含回车换行符,或者该行是最后一行且下行第一个字符是回车换行符,则截取字符串不加回车换行符。
/*ltext:text从左边截取len长度字符串*/
/*ntext: 处理后带回车换行符的text*/
/*i: ltext长度计数器*/
/*num: ltext中半个汉字计数器*/
/*rasc: ltext最右边字符的asc码*/
/*lasc: ltext下一个字符的asc码*/
integer i, num, rasc, lasc
string ltext, ntext
if len < 2 then
return text
end if
do while text<>''
/*初始化num,重新计算ltext*/
num=0
ltext=left(text,len)
/*计算半个汉字数量*/
for i=1 to len(ltext)
if asc(mid(ltext,i,1))>=160 then
num=num+1
end if
next
for i=1 to len(ltext)
rasc=asc(right(ltext,1))
lasc=asc(mid(text,len+1,1))
/*如果ltext最右边的字符和下一个字符均为字母数字,且该行包括汉字,则ltext截掉最后一位字符*/
if rasc<160 and rasc<>10 and rasc<>13 and rasc<>32 and num>0 and lasc<160 and lasc<>10 and lasc<>13 and lasc<>32 then
ltext = left(ltext,len(ltext) - 1 )
i = i - 1
else
/*如果ltext最右边的字符是半个汉字,则ltext截掉最后一位字符*/
if rasc>=160 and mod(num,2)=1 then
ltext=left(ltext,len(ltext)-1)
i = i - 1
end if
exit
end if
next
text=right(text,len(text)-len(ltext))
/*如果 ltext不包含回车换行符,该行不是最后一行,且下一个字符不是回车换行符,则ntext增加两个回车换行符*/
if pos(ltext,'~r')=0 and pos(ltext,'~n')=0 and lasc<>10 and lasc<>13 and text<>' ' then
ntext=ntext+ltext+'~r~n~r~n'
else
ntext=ntext+ltext
end if
loop
return ntext