QR打印数据时,遇到长的字段如何让他在规定字数范围内换行??? (100分)

  • 主题发起人 主题发起人 OHT
  • 开始时间 开始时间
O

OHT

Unregistered / Unconfirmed
GUEST, unregistred user!
希望动态的改变,是不是用LENGTH取得长度,然后加空格换行?或者有更好方法?
 
有的QR版本可自动解决些问题, 只需设置autosize=false wordwrap=true
不行的版本可用程序在适当的位置加入空格, 它就会自动折行了.
 
具体如何实现?比如如何COPY字符串
 
strcopy
strlen....
查一下delphi的帮助吧
这些函数要求的是空字符结束
 
{此函数在给定一个中英文字符串后,按给定的截止长度进行修正}
function GetStopPoint(tmpstr: string;
ecount: integer): integer;
var
strlen :integer;
coun,i :integer;
begin
//非法输入时退出
if (tmpstr='') or (ecount<1) then
begin
result:=length(tmpstr);
exit;
end;

strlen:=length(tmpstr);
result:=strlen;
if ecount<strlen then
begin
i:=1;
while i<=ecountdo
begin
coun:=i;
if IsDBCSLeadByte(byte(tmpstr)) then
i:=i+2 else
i:=i+1;
end;
//判断所设定的截止长度是否在一个汉字的前半部,是的话返回(长度-1)的值
if (i-coun=2) and (coun=ecount) then
result:=ecount-1 else
result:=ecount;
end;
if result<1 then
result:=strlen;
end;

{此函数将给定的字符串按规定的长度加上空格,然后就能在Qrlabel中自动换行了}
procedure StrWordWrap(var instr: string;
coun: integer);
var
i,j :Integer;
tmpstr :String;
leftstr :String;
begin
if instr='' then
exit;
//下面的循环先去掉给定的字符串中的空格(怕已有空格影响换行)
tmpstr:='';
for i:=1 to length(instr)do
begin
if instr<>' ' then
tmpstr:=tmpstr+instr;
end;
leftstr:=tmpstr;
tmpstr:='';
i:=length(instr);
while i>coundo
begin
j:=getstoppoint(leftstr,coun);
tmpstr:=tmpstr+copy(leftstr,1,j)+' ';
leftstr:=copy(leftstr,j+1,length(leftstr)-j);
i:=length(leftstr);
end;
tmpstr:=tmpstr+leftstr;
instr:=tmpstr;
end;

{在DetailBand上放一个Qrlabel来显示所需换行字段的值 }
{注意AutoSize:=false;
WordWrap:=True;
将Qrlabel拉到需要的长度和高度}
procedure DetailBand1BeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);
var
tmpstr:string;
i :Integer;
begin
i:=40;//你需要的换行的长度,也可以用QrLabel的显示长度和字体自动判断
tmpstr:=query1.Fields[*].Value;
//想用QrLabel显示的字段的值
zyhpro.StrWordWrap(tmpstr,i);
qrlabel1.Caption:=tmpstr;
end;
 
http://expert.csdn.net/Expert/topic/1354/1354136.xml?temp=.4455835
 
后退
顶部