QReport的label竟然不支持中文换行?如何解决?(100分)

  • 主题发起人 主题发起人 tobject
  • 开始时间 开始时间
T

tobject

Unregistered / Unconfirmed
GUEST, unregistred user!
已经设置
autosize:=false
autostretch:=true
wordwrap:=true
 
加chr(13)即回车不就行了
 
qrlable是不支持中文换行的。可以加回车符来实现
例如:
qrlable.caption := '中华'+#13+'人民共和国'
 
能够这样加回车解决的就不会在这里提问题了。我的目标是通过改写tqrlabel来支持换行。
 
有没有人做过啊?
 
在qrlable的onprint事件中写下面这一段代码
//7是栏宽。
if Length(Value)<=qrlable1.Width/7 then
exit;
strSource := Value;
Value := '';
//防止截断汉字。
while truedo
begin
iLen := 1;
while iLen < qrlable1.Width/7do
begin
if ord(strSource[iLen]) > 128 then
inc(iLen, 2)
else
inc(iLen);
end;
dec(iLen);

strTemp := Copy(strSource, 1, iLen);
//加回车。
if Value = '' then
Value := strTemp
else
Value := Value + #13 + strTemp;
strSource := Copy(strSource, iLen + 1, Length(strSource) - iLen);
if Length(strSource) <=qrlable1.Width/7 then
begin
Value := Value + #13 + strSource;
exit;
end;
end;
 
哦,别忘了定义:
var
iLen : integer;
strSource, strTemp : string;
 
不对吧,我做过的可以直接换行的,我就将两个电话号码分成了两行
 
同意mlZhou!
 
感谢zhuwei02的提示,虽然你的代码不是很正确,
但我根据你的方法写了一个更加合适的。铁出来
希望对大家都有个帮助。如果有错也希望大家一起
来指正。
procedure TQRFormNY.QRLabelPrint(sender: TObject;
var Value: String);
var
SenderWidth: integer;
Line, Part, Final: string;
Posbegin
, PosEnd: integer;
i, j: integer;
LastIsEng: boolean;
begin
SenderWidth := (Sender as TQRCustomLabel).Width;
Part := '';
Final := '';
Line := Value;
// 首先删除行内所有换行
while pos(#10, Line) > 0do
Delete(Line, Pos(#10, Line), 1);
// 增加一个回车以方便下面的处理.
if Line[Length(Line)] <> #13 then
Line := Line + #13;
//循环查找#13,如果找到则处理找到范围内的数据,一直到全部处理完毕
Posbegin
:= 0;
PosEnd := 0;
for i := 0 to Length (Line)do
begin
if Line = #13 then
begin
Posbegin
:= PosEnd + 1;
// 这样可以在处理下一段的时候方便地生成开始和结束位置.
PosEnd := i;
Part := '';
j := Posbegin
;
while j <= PosEnddo
begin
if Line[j] < #128 then
begin
// an ascii character
Part := Part + Line[j];
j := j + 1;
LastIsEng := true;
end
else
begin
// a DBCS character
Part := Part + Line[j] + Line[j+1];
j := j + 2;
LastIsEng := false;
end;
// 判断目前是否已经超长
if QuickRepNY.TextWidth ((Sender as TQRCustomLabel).Font, part) > SenderWidth then
begin
// 需要剔除刚才的字符,
if LastIsEng then
begin
Delete (Part, Length (Part), 1);
j := j - 1;
end
else
begin
Delete (Part, Length (Part)-1, 2);
j := j - 2;
end;
//加入回车,
Part := Part + #13;
Final := Final + Part;
Part := '';
end;
end;
Final := Final + Part;
end;
end;
// 删除刚刚加入的回车
if Final [Length(Final)] = #13 then
Delete (Final, Length(Final), 1);
Value := Final;
end;
 
多人接受答案了。
 
后退
顶部