接手一程序,有固定格式票据打印(套打),现在发票格式变了,要重新算位置,看了以前的程序,部分打印代码如下:
procedure TChargeForm.PrintReceipt;
var
NPixX,NPixY:Integer;
i,m,j:Integer;
nx,ny:Integer;
hei:Single;
rhei,rHeight,rWid:Single;
str:string;
ItemName:string;
begin
if iSysWorkMode = 0 then
str := strPrioReceipt
else
str := strCurReceipt;
nx:=-5;
ny:=0;
hei:=0.295;
rhei:=0.3;
rWid:=1.5;
rHeight:=2.8;
printer.PrinterIndex:=-1;
printer.Orientation:=poPortrait; //纵向打印
NPixX:=GetDeviceCaps(printer.Handle,LOGPIXELSX);
NPixY:=GetDeviceCaps(printer.Handle,LOGPIXELSY);
printer.BeginDoc;
printer.Canvas.Font.Name:='宋体\0';
printer.Canvas.Font.Height:=28;
printer.Canvas.TextOut(trunc(NPixX*0.42)+nx,trunc(NPixY*0.7)+ny,ESickName.Text);
for i:=0 to ItemCount-1 do
begin
if Trunc(Array_Item[i][0])<8 then
printer.Canvas.TextOut(trunc(NPixX*0.7)+nx,trunc(NPixY*(0.5+(2+Array_Item[i][0])*hei))+ny,Format('%.2f',[Array_Item[i][1]]));
if (Trunc(Array_Item[i][0])>=8) and (Trunc(Array_Item[i][0])<14)then
printer.Canvas.TextOut(trunc(NPixX*2.4)+nx,trunc(NPixY*(0.5+(Array_Item[i][0]-5)*hei))+ny,Format('%.2f',[Array_Item[i][1]]));
if Trunc(Array_Item[i][0])=14 then
begin
printer.Canvas.TextOut(trunc(NPixX*1.65)+nx,trunc(NPixY*(0.5+(Array_Item[i][0]-5)*hei))+ny,'TX');
printer.Canvas.TextOut(trunc(NPixX*2.4)+nx,trunc(NPixY*(0.5+(Array_Item[i][0]-5)*hei))+ny,Format('%.2f',[Array_Item[i][1]]));
end;
if Trunc(Array_Item[i][0])=15 then
begin
printer.Canvas.TextOut(trunc(NPixX*0.04)+nx,trunc(NPixY*(0.5+(Array_Item[i][0]-5)*hei))+ny,'其 他');
printer.Canvas.TextOut(trunc(NPixX*0.65)+nx,trunc(NPixY*(0.5+(Array_Item[i][0]-5)*hei))+ny,Format('%.2f',[Array_Item[i][1]]));
end;
end;
有许多不解,期中
printer.Canvas.TextOut(trunc(NPixX*0.42)+nx,trunc(NPixY*0.7)+ny,ESickName.Text);中trunc(NPixX*0.42)是用来干吗的,0.42又从何处所得?
同样上语句用的0.7、1.65等等数字从何来?我想肯定有算法?
请做过这种打印的朋友帮忙将上边的代码给我解释一下,尤其是那些数字的算法?
谢谢!!!
procedure TChargeForm.PrintReceipt;
var
NPixX,NPixY:Integer;
i,m,j:Integer;
nx,ny:Integer;
hei:Single;
rhei,rHeight,rWid:Single;
str:string;
ItemName:string;
begin
if iSysWorkMode = 0 then
str := strPrioReceipt
else
str := strCurReceipt;
nx:=-5;
ny:=0;
hei:=0.295;
rhei:=0.3;
rWid:=1.5;
rHeight:=2.8;
printer.PrinterIndex:=-1;
printer.Orientation:=poPortrait; //纵向打印
NPixX:=GetDeviceCaps(printer.Handle,LOGPIXELSX);
NPixY:=GetDeviceCaps(printer.Handle,LOGPIXELSY);
printer.BeginDoc;
printer.Canvas.Font.Name:='宋体\0';
printer.Canvas.Font.Height:=28;
printer.Canvas.TextOut(trunc(NPixX*0.42)+nx,trunc(NPixY*0.7)+ny,ESickName.Text);
for i:=0 to ItemCount-1 do
begin
if Trunc(Array_Item[i][0])<8 then
printer.Canvas.TextOut(trunc(NPixX*0.7)+nx,trunc(NPixY*(0.5+(2+Array_Item[i][0])*hei))+ny,Format('%.2f',[Array_Item[i][1]]));
if (Trunc(Array_Item[i][0])>=8) and (Trunc(Array_Item[i][0])<14)then
printer.Canvas.TextOut(trunc(NPixX*2.4)+nx,trunc(NPixY*(0.5+(Array_Item[i][0]-5)*hei))+ny,Format('%.2f',[Array_Item[i][1]]));
if Trunc(Array_Item[i][0])=14 then
begin
printer.Canvas.TextOut(trunc(NPixX*1.65)+nx,trunc(NPixY*(0.5+(Array_Item[i][0]-5)*hei))+ny,'TX');
printer.Canvas.TextOut(trunc(NPixX*2.4)+nx,trunc(NPixY*(0.5+(Array_Item[i][0]-5)*hei))+ny,Format('%.2f',[Array_Item[i][1]]));
end;
if Trunc(Array_Item[i][0])=15 then
begin
printer.Canvas.TextOut(trunc(NPixX*0.04)+nx,trunc(NPixY*(0.5+(Array_Item[i][0]-5)*hei))+ny,'其 他');
printer.Canvas.TextOut(trunc(NPixX*0.65)+nx,trunc(NPixY*(0.5+(Array_Item[i][0]-5)*hei))+ny,Format('%.2f',[Array_Item[i][1]]));
end;
end;
有许多不解,期中
printer.Canvas.TextOut(trunc(NPixX*0.42)+nx,trunc(NPixY*0.7)+ny,ESickName.Text);中trunc(NPixX*0.42)是用来干吗的,0.42又从何处所得?
同样上语句用的0.7、1.65等等数字从何来?我想肯定有算法?
请做过这种打印的朋友帮忙将上边的代码给我解释一下,尤其是那些数字的算法?
谢谢!!!
0.7、1.65等等数字,肯定是经过调试确定下来的最佳数字,来确定位置的
你改用其他数据也可以打印,只是尺寸改变.
0.42是根据图形所需大小凑出来的一个比例值.