感谢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;