L
Luis Pater
Unregistered / Unconfirmed
GUEST, unregistred user!
我是直接使用Printer组件打印的!什么建议我用其他报表软件打印就不用回复了!
我用的方式是计算字节数,然后截断换行打印,估计是中英文混合的文本中,英文文字成单数,所以截断了的最后一个汉字的后半部分与之后一行下一个汉字的前半部分组成了乱码!我附上了我的算法!也许太简单了!呵呵……大家帮我看看吧!
tLine:=(Length(SettleMemo.Lines.Text) div 72);
for I:=0 to tLinedo
begin
TTextOut(350,960+50*I,Copy(SettleMemo.Lines.Text,I*72+1,72),'宋体',11);
end;
TTextOut是我自己写的函数,用于精确打印0.1毫米的文本!呵呵……我也在这里附上吧:
function TTextOut(XMM,YMM:integer;Str,FontName:String;FontSize:Integer):Boolean;
var
dpix,dpiy:integer;
X,Y:integer;
begin
dpix:=GetDeviceCaps(Printer.Handle,LogPixelsX);//获取横向打印分辨率
dpiy:=GetDeviceCaps(Printer.Handle,LogPixelsY);//获取纵向打印分辨率
Printer.Canvas.Font.Name:=FontName;
Printer.Canvas.Font.Size:=FontSize;
X:=Round((LeftRight+XMM)/254*dpix);
Y:=Round((TopEnd+YMM)/254*dpiy);
Printer.Canvas.TextOut(X,Y,Str);
Result:=True;
end;
麻烦大家了!挺着急的!希望大家能给我满意的解答!:)谢谢!
我用的方式是计算字节数,然后截断换行打印,估计是中英文混合的文本中,英文文字成单数,所以截断了的最后一个汉字的后半部分与之后一行下一个汉字的前半部分组成了乱码!我附上了我的算法!也许太简单了!呵呵……大家帮我看看吧!
tLine:=(Length(SettleMemo.Lines.Text) div 72);
for I:=0 to tLinedo
begin
TTextOut(350,960+50*I,Copy(SettleMemo.Lines.Text,I*72+1,72),'宋体',11);
end;
TTextOut是我自己写的函数,用于精确打印0.1毫米的文本!呵呵……我也在这里附上吧:
function TTextOut(XMM,YMM:integer;Str,FontName:String;FontSize:Integer):Boolean;
var
dpix,dpiy:integer;
X,Y:integer;
begin
dpix:=GetDeviceCaps(Printer.Handle,LogPixelsX);//获取横向打印分辨率
dpiy:=GetDeviceCaps(Printer.Handle,LogPixelsY);//获取纵向打印分辨率
Printer.Canvas.Font.Name:=FontName;
Printer.Canvas.Font.Size:=FontSize;
X:=Round((LeftRight+XMM)/254*dpix);
Y:=Round((TopEnd+YMM)/254*dpiy);
Printer.Canvas.TextOut(X,Y,Str);
Result:=True;
end;
麻烦大家了!挺着急的!希望大家能给我满意的解答!:)谢谢!