procedure TUserDM.PrintInvoice(aDanJuID:string); var vYear,vMonth,vDay:Word; PDevice,PDriver,pPort:Array[0..255] of Char; hDMode:THandle; PDMode:PDeviceMode; vDate,vHeJi,vPrintHeJi:string; X,Y,vX,vY:integer; i:integer; IntHeJi:string; vDocID:string; begin //发票汇总信息 QryPrint1.Close; QryPrint1.ParamByName('DanJuID').AsString:=aDanJuID; QryPrint1.Open; QryPrint3.Close; QryPrint3.ParamByName('DanJuID').AsString:=aDanJuID; QryPrint3.Open; with SysDM.qryfree do begin close; sql.clear; sql.add(' select a.YiShengBM '); sql.add(' from Out_Recipe a,Out_RecipeDetail b '); sql.add(' where a.JiuZhenID=b.JiuZhenID and a.ChuFangLH=b.ChuFangLH '); sql.add(' and b.DanJuID=:DanJuID'); parambyname('DanJuID').asstring:=aDanJuID; open; vDocID:=FieldByName('YiShengBM').asstring; end;
if SysDM.GetSysParam(pkSys_BillVersion)=1 then begin QryPrint4.Close; QryPrint4.ParamByName('DanJuID').AsString:=aDanJuID; QryPrint4.Open; //获得打印机的DeviceMode结构句柄 Printer.GetPrinter(pDevice,pDriver,pPort,hDMode); //如果句柄为0,表示打印机没有装载 if hDMode=0 then begin Printer.PrinterIndex :=Printer.PrinterIndex ; Printer.GetPrinter(pDevice,pDriver,pPort,hDMode); end; if hDMode<>0 then begin //根据TDeviceMode的句柄获得指向该结构的指针变量 PDMode:=GlobalLock(hDMode); if PDMode<>Nil then with PDMode^ do begin DMFields:=DMFields Or DM_PAPERLENGTH; dmPaperLength:=1270;//设置打印页长 dmFields:=dmFields or DM_PAPERWIDTH; dmPaperWidth:=1920;//设置打印页宽 end; GlobalUnLock(hDMode);//解锁,释放内存 Printer.PrinterIndex :=Printer.PrinterIndex ; end; Printer.Canvas.font.name:='宋体'; Printer.BeginDoc;//开始打印 Printer.Canvas.font.size:=11; DecodeDate(QryPrint1.FieldByName('DanJuRQ').AsDateTime, vYear, vMonth, vDay); vDate:=IntToStr(vYear)+' '+IntToStr(vMonth)+' '+IntToStr(vDay); Printer.Canvas.TextOut(95,220,QryPrint1.FieldByName('XingMing').AsString); Printer.Canvas.TextOut(255,745,'No. '+QryPrint1.FieldByName('DanJuID').AsString); //Printer.Canvas.TextOut(255,190,QryPrint1.FieldByName('LeiBieMC').AsString); Printer.Canvas.TextOut(35,525,SysDM.GetSysParam(pkOut_InvoiceEmptyFormat1)); Printer.Canvas.TextOut(35,625,SysDM.GetSysParam(pkOut_InvoiceEmptyFormat2)); //打印单据日期 Printer.Canvas.TextOut(250,220,vDate); vHeJi:=FormatFloat('0.00',QryPrint1.FieldByName('ShiShouJE').AsFloat); ShareFunc.CapitalizeMoney(abs(StrToFloat(vHeJi)),false,vPrintHeJi); IntHeJi:=IntToStr(trunc(abs(StrToFloat(vHeJi)))); for i:=0 to 3-Length(IntHeJi) do vPrintHeJi:='零 '+vPrintHeJi; //打印大写合计金额 if StrToFloat(vHeJi)<0 then Printer.Canvas.TextOut(135,680,'负'+vPrintHeJi) else Printer.Canvas.TextOut(135,680,vPrintHeJi); //打印备注信息 Printer.Canvas.TextOut(600,680,SysDM.GetSysParam(pkOut_InvoiceMemoInfo)); //打印收款人 Printer.Canvas.TextOut(110,730,QryPrint1.FieldByName('ShouKuanYBM').AsString); Printer.Canvas.font.size:=9; Printer.Canvas.TextOut(245,720,'医生编码: '+vDocID); Printer.Canvas.font.size:=11; Printer.Canvas.TextOut(700,730,vHeJi); //打印核算项目 with QryPrint4 do begin while not Eof do begin vX:=FieldByName('ZuoBiaoX').AsInteger; vY:=FieldByName('ZuoBiaoY').AsInteger; if FieldByName('JinE').AsFloat=0 then Printer.Canvas.TextOut(vX,vY,'') else Printer.Canvas.TextOut(vX,vY,FormatFloat('0.00',FieldByName('JinE').AsFloat)); QryPrint4.Next; end; end; Printer.Canvas.font.size:=9; Printer.Canvas.TextOut(580,170,'收费项目 数量 金额'); Printer.Canvas.TextOut(580,190,'--------------------------------------------'); Y := 210; while not QryPrint3.Eof do begin Printer.Canvas.TextOut(580,Y,QryPrint3.FieldByName('ZiDingMa').AsString+' '+QryPrint3.FieldByName('YaoMing').AsString); Printer.Canvas.TextOut(950,Y,FormatFloat('0',QryPrint3.FieldByName('ShuLiang').AsFloat)+Copy(QryPrint3.FieldByName('DanWei').AsString,0,2)); Printer.Canvas.TextOut(1035,Y,FormatFloat('0.00',QryPrint3.FieldByName('JinE').AsFloat)); QryPrint3.Next ; Y := Y + 25; end; Printer.EndDoc; end; end;
要用尺量的。
要用尺量的。
file://设置纸张高度-单位:mmprocedure SetPaperHeight(Value:integer);var Device : array[0..255] of char; Driver : array[0..255] of char; Port : array[0..255] of char; hDMode : THandle; PDMode : PDEVMODE;beginfile://自定义纸张最小高度127mmif Value < 127 then Value := 127; file://自定义纸张最大高度432mm if Value > 432 then Value := 432; Printer.PrinterIndex := Printer.PrinterIndex; Printer.GetPrinter(Device, Driver, Port, hDMode); if hDMode <> 0 then begin pDMode := GlobalLock(hDMode); if pDMode <> nil then begin pDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE or DM_PAPERLENGTH; pDMode^.dmPaperSize := DMPAPER_USER; pDMode^.dmPaperLength := Value * 10; pDMode^.dmFields := pDMode^.dmFields or DMBIN_MANUAL; pDMode^.dmDefaultSource := DMBIN_MANUAL; GlobalUnlock(hDMode); end; end; Printer.PrinterIndex := Printer.PrinterIndex;end;file://设置纸张宽度:单位--mmProcedure SetPaperWidth(Value:integer);var Device : array[0..255] of char; Driver : array[0..255] of char; Port : array[0..255] of char; hDMode : THandle; PDMode : PDEVMODE;beginfile://自定义纸张最小宽度76mmif Value < 76 then Value := 76; file://自定义纸张最大宽度216mm if Value > 216 then Value := 216; Printer.PrinterIndex := Printer.PrinterIndex; Printer.GetPrinter(Device, Driver, Port, hDMode); if hDMode <> 0 then begin pDMode := GlobalLock(hDMode); if pDMode <> nil then begin pDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE or DM_PAPERWIDTH; pDMode^.dmPaperSize := DMPAPER_USER; file://将毫米单位转换为0.1mm单位 pDMode^.dmPaperWidth := Value * 10; pDMode^.dmFields := pDMode^.dmFields or DMBIN_MANUAL; pDMode^.dmDefaultSource := DMBIN_MANUAL; GlobalUnlock(hDMode); end; end; Printer.PrinterIndex := Printer.PrinterIndex;end;file://在 (Xmm, Ymm)处按指定配置文件信息和字体输出字符串procedure PrintText(X, Y: Extended; Txt: string; ConfigFileName: string; FontSize: Integer=12);var OrX, OrY: Extended; Px, Py: Integer; AP: TPoint; Fn: TStrings; FileName: string; OffSetX, OffSetY: Integer;beginfile://打开配置文件,读出横向和纵向偏移量try Fn := TStringList.Create; FileName := ExtractFilePath(Application.ExeName) + ConfigFileName; if FileExists(FileName) then begin Fn.LoadFromFile(FileName); file://横向偏移量 OffSetX := StrToInt(Fn.Values['X']); file://纵向偏移量 OffSetY := StrToInt(Fn.Values['Y']); endelsebegin file://如果没有配置文件,则生成 Fn.Values['X'] := '0'; Fn.Values['Y'] := '0'; Fn.SaveToFile(FileName);end;finally Fn.Free;end;X := X + OffSetX;Y := Y + OffSetY;Px := Round(Round(X * HPointsPerInch * 10000/25.4) / 10000);Py := Round(Round(Y * VPointsPerInch * 10000/25.4) / 10000);Py := Py - GetOffSetY; file://因为是绝对坐标, 因此, 不用换算成相对于Y轴坐标Px := Px + 2 * AvgCharWidth;Printer.Canvas.Font.Name := '宋体';Printer.Canvas.Font.Size := FontSize;file://Printer.Canvas.Font.Color := clGreen;Printer.Canvas.TextOut(Px, Py, Txt);end; 2. 使用举例 在主窗体中加入对mprint单元的引用,在一命令钮的OnClick事件中书写如下代码(用于在邮政汇款单上的相应方框内打印邮政编码843300):Printer.BeginDoc;PrintText(16, 14, '8', 'config.txt');PrintText(26, 14, '4', 'config.txt');PrintText(36, 14, '3', 'config.txt');PrintText(46, 14, '3', 'config.txt');PrintText(56, 14, '0', 'config.txt');PrintText(66, 14, '0', 'config.txt');Printer.EndDoc; 观察结果,用尺子测量偏移量,在config.txt文件中修改X,Y的值即可。 其它,设置打印机和纸张类型从略。
特别是Means_pan(酷鱼-真的是"难得胡涂")
还有没有其他的兄弟有什么资料或是建议
var
vYear,vMonth,vDay:Word;
PDevice,PDriver,pPort:Array[0..255] of Char;
hDMode:THandle;
PDMode:PDeviceMode;
vDate,vHeJi,vPrintHeJi:string;
X,Y,vX,vY:integer;
i:integer;
IntHeJi:string;
vDocID:string;
begin
//发票汇总信息
QryPrint1.Close;
QryPrint1.ParamByName('DanJuID').AsString:=aDanJuID;
QryPrint1.Open; QryPrint3.Close;
QryPrint3.ParamByName('DanJuID').AsString:=aDanJuID;
QryPrint3.Open; with SysDM.qryfree do
begin
close;
sql.clear;
sql.add(' select a.YiShengBM ');
sql.add(' from Out_Recipe a,Out_RecipeDetail b ');
sql.add(' where a.JiuZhenID=b.JiuZhenID and a.ChuFangLH=b.ChuFangLH ');
sql.add(' and b.DanJuID=:DanJuID');
parambyname('DanJuID').asstring:=aDanJuID;
open;
vDocID:=FieldByName('YiShengBM').asstring;
end;
if SysDM.GetSysParam(pkSys_BillVersion)=1 then
begin
QryPrint4.Close;
QryPrint4.ParamByName('DanJuID').AsString:=aDanJuID;
QryPrint4.Open;
//获得打印机的DeviceMode结构句柄
Printer.GetPrinter(pDevice,pDriver,pPort,hDMode);
//如果句柄为0,表示打印机没有装载
if hDMode=0 then
begin
Printer.PrinterIndex :=Printer.PrinterIndex ;
Printer.GetPrinter(pDevice,pDriver,pPort,hDMode);
end;
if hDMode<>0 then
begin
//根据TDeviceMode的句柄获得指向该结构的指针变量
PDMode:=GlobalLock(hDMode);
if PDMode<>Nil then
with PDMode^ do
begin
DMFields:=DMFields Or DM_PAPERLENGTH;
dmPaperLength:=1270;//设置打印页长
dmFields:=dmFields or DM_PAPERWIDTH;
dmPaperWidth:=1920;//设置打印页宽
end;
GlobalUnLock(hDMode);//解锁,释放内存
Printer.PrinterIndex :=Printer.PrinterIndex ;
end;
Printer.Canvas.font.name:='宋体';
Printer.BeginDoc;//开始打印
Printer.Canvas.font.size:=11;
DecodeDate(QryPrint1.FieldByName('DanJuRQ').AsDateTime, vYear, vMonth, vDay);
vDate:=IntToStr(vYear)+' '+IntToStr(vMonth)+' '+IntToStr(vDay);
Printer.Canvas.TextOut(95,220,QryPrint1.FieldByName('XingMing').AsString);
Printer.Canvas.TextOut(255,745,'No. '+QryPrint1.FieldByName('DanJuID').AsString);
//Printer.Canvas.TextOut(255,190,QryPrint1.FieldByName('LeiBieMC').AsString); Printer.Canvas.TextOut(35,525,SysDM.GetSysParam(pkOut_InvoiceEmptyFormat1));
Printer.Canvas.TextOut(35,625,SysDM.GetSysParam(pkOut_InvoiceEmptyFormat2)); //打印单据日期
Printer.Canvas.TextOut(250,220,vDate); vHeJi:=FormatFloat('0.00',QryPrint1.FieldByName('ShiShouJE').AsFloat);
ShareFunc.CapitalizeMoney(abs(StrToFloat(vHeJi)),false,vPrintHeJi);
IntHeJi:=IntToStr(trunc(abs(StrToFloat(vHeJi))));
for i:=0 to 3-Length(IntHeJi) do
vPrintHeJi:='零 '+vPrintHeJi;
//打印大写合计金额
if StrToFloat(vHeJi)<0 then Printer.Canvas.TextOut(135,680,'负'+vPrintHeJi)
else Printer.Canvas.TextOut(135,680,vPrintHeJi);
//打印备注信息
Printer.Canvas.TextOut(600,680,SysDM.GetSysParam(pkOut_InvoiceMemoInfo));
//打印收款人
Printer.Canvas.TextOut(110,730,QryPrint1.FieldByName('ShouKuanYBM').AsString); Printer.Canvas.font.size:=9;
Printer.Canvas.TextOut(245,720,'医生编码: '+vDocID);
Printer.Canvas.font.size:=11;
Printer.Canvas.TextOut(700,730,vHeJi);
//打印核算项目
with QryPrint4 do
begin
while not Eof do
begin
vX:=FieldByName('ZuoBiaoX').AsInteger;
vY:=FieldByName('ZuoBiaoY').AsInteger;
if FieldByName('JinE').AsFloat=0 then
Printer.Canvas.TextOut(vX,vY,'')
else
Printer.Canvas.TextOut(vX,vY,FormatFloat('0.00',FieldByName('JinE').AsFloat));
QryPrint4.Next;
end;
end;
Printer.Canvas.font.size:=9;
Printer.Canvas.TextOut(580,170,'收费项目 数量 金额');
Printer.Canvas.TextOut(580,190,'--------------------------------------------');
Y := 210;
while not QryPrint3.Eof do
begin
Printer.Canvas.TextOut(580,Y,QryPrint3.FieldByName('ZiDingMa').AsString+' '+QryPrint3.FieldByName('YaoMing').AsString);
Printer.Canvas.TextOut(950,Y,FormatFloat('0',QryPrint3.FieldByName('ShuLiang').AsFloat)+Copy(QryPrint3.FieldByName('DanWei').AsString,0,2));
Printer.Canvas.TextOut(1035,Y,FormatFloat('0.00',QryPrint3.FieldByName('JinE').AsFloat));
QryPrint3.Next ;
Y := Y + 25;
end;
Printer.EndDoc;
end;
end;
http://218.56.11.178:8020/web/index.aspx-》下载基地-》控件-数据库/报表-》fastreport报表工具 -》程序员读物-》fastreport报表使用手册有兴趣研究研究!