pb中截取混排字符串
- 格式:doc
- 大小:23.50 KB
- 文档页数:3
pb中截取混排字符串
宋铭
pb数据窗口没有提供调整计算域行间距的方法,甚至利用richtext类型的数据窗口也不行。
我们设想,在计算域各行之间增加回车换行符来调整行间距。
但由于计算域的内容是动态可变的,为此,我们设计了一个全局函数fun—string—intercept,解决了这个问题。
该函数有两个参数:text和len,其中text为需要处理的字符串,len为截取长度。
函数按长度len把text 截取成一行行的字符串,行与行之间增加一个空行,使正文部分疏落有致。
一、主要问题及解决方案
由于字符串由字母、数字和汉字混排组成,简单按固定长度截取会出现问题。
需要考虑以下几个问题:
1. 如果截取字符串的最后一个字符刚好落到汉字中间,则会显示半个汉字,形成该行及下一行乱码。
解决方案:为截取字符串设计了半个汉字计数器,如计数器为奇数,则去掉最后一位字符。
2. 如果截取字符串最后一个字符刚好落到英文单词中间,则会把单词生硬地分割。
解决方案:此种情况该单词移到下一行。
3. 如果截取字符串最后一个字符刚好落到数字中间(如1999),则会把数字生硬地分割。
解决方案:此种情况该数字移到下一行。
4. 如果截取字符串最后一个字符刚好落到回车符(~r~n)上,则会多空一行。
解决方案:如果截取字符串已包含回车换行符,或者该行是最后一行且下行第一个字符是回车换行符,则截取字符串不加回车换行符。
二、程序清单
全局函数fun—string—intercept(text string,len integer)程序清单如下:
/*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
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
调用方法:在数据窗口中,建立计算域notice1、notice2,notice1表达式内容为书写的内容,notice2表达式内容为fun—string—intercept (notice1,x),第二个参数x根据页宽需要可任意调整。
把notice1隐藏,notice2的内容作为正文,据此实现后,打印效果令人满意。