好久没有使用该语言了。关于按下按钮就直接打印(如发票)。特殊格式打印!
朋友让做一个打印标签(特殊纸大小,如发票类型),标签大小固定。字体大小以及位置也是设定的好的。
输入不同的信息,按下打印就可以直接输入到打印机(针打)即可
好久没有使用DELPHI了,对于这些打印也不擅长的。
希望大家提供实现方式。对于做过发票打印以及各种格式打印的人员来说不难的
100分赠与了!
谢谢大家
[解决办法]
从2CCC中下的一个套打单元,作者杨振华,删除了一些功能
use后如下调用
_OutTxt(145,52,edtUsetype.Text,4,'宋体');
- Delphi(Pascal) code
unit Print;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,Printers, Grids, DBGrids, DB, ADODB,DateUtils, ExtCtrls; procedure SetPaperHeight(Value:integer); //设置纸张高度-单位:mm procedure SetPaperWidth(Value:integer); //设置纸张宽度:单位--mm function _init(PageSize:TPoint):Boolean; // function _outTxt(x,y:Real;Txt:String;FontSize:Real;FontName:String):Boolean; procedure PrintPage(); procedure PrintPageend(); procedure PrintNewPage();var PhysicalWidth,PhysicalHeight,PageWidth,PageHeight,PageLeft,PageRight,PageTop,PageBottom:Integer; mm_H,mm_V:real; //毫米implementationprocedure SetPaperHeight(Value:integer); //设置纸张高度-单位:mmvar Device : array[0..255] of char; Driver : array[0..255] of char; Port : array[0..255] of char; hDMode : THandle; PDMode : PDEVMODE;beginif Value < 127 then Value := 127; //自定义纸张最小高度127mm if Value > 432 then Value := 432; //自定义纸张最大高度432mm 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;procedure SetPaperWidth(Value:integer); //设置纸张宽度:单位--mmvar Device : array[0..255] of char; Driver : array[0..255] of char; Port : array[0..255] of char; hDMode : THandle; PDMode : PDEVMODE;beginif Value < 76 then Value := 76; //自定义纸张最小宽度76mm if Value > 216 then Value := 216; //自定义纸张最大宽度216mm 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; pDMode^.dmPaperWidth := Value * 10; //将毫米单位转换为0.1mm单位 pDMode^.dmFields := pDMode^.dmFields or DMBIN_MANUAL; pDMode^.dmDefaultSource := DMBIN_MANUAL; GlobalUnlock(hDMode); end; end; Printer.PrinterIndex := Printer.PrinterIndex;end;function _init(PageSize:TPoint):Boolean; //begin PhysicalWidth:=PageSize.x; //物理页宽 PhysicalHeight:=PageSize.Y; //物理页高 PageWidth:=printer.PageWidth; //逻辑页宽 PageHeight:=printer.PageHeight; //逻辑页高 PageLeft:=GetDeviceCaps(Printer.Handle,PHYSICALOFFSETX); //左边距 PageTop:=GetDeviceCaps(Printer.Handle,PHYSICALOFFSETY); //上边距 PageRight:=PhysicalWidth-PageLeft-PageWidth; //右边距 PageBottom:=PhysicalHeight-PageTop-PageHeight; //下边距end;function _outTxt(x,y:Real;Txt:String;FontSize:Real;FontName:String):Boolean;var LogRec: TLOGFONT; OldFont, NewFont: HFONT; i: LongInt;begin with printer do begin GetObject(Canvas.Font.Handle, SizeOf(LogRec), @LogRec); LogRec.lfOutPrecision := OUT_TT_ONLY_PRECIS; LogRec.lfFaceName :='宋体'; LogRec.lfHeight:=round(FontSize*mm_V); LogRec.lfWeight:=0; NewFont := CreateFontIndirect(LogRec); OldFont := SelectObject(Canvas.Handle,NewFont); end; x:=Round(x*mm_H)-PageLeft; y:=Round(y*mm_V)-PageTop; Printer.Canvas.TextOut(round(x),round(y),txt);end;procedure PrintPage();var PageSize:Tpoint; PointX,PointY:Integer; //英寸begin Printer.Canvas.Brush.Style := bsclear; Escape(Printer.Handle, GETPHYSPAGESIZE, 0,nil,@PageSize); //取得物理页尺寸 PointX:=GetDeviceCaps(Printer.Handle,LOGPIXELSX); PointY:=GetDeviceCaps(Printer.Handle,LOGPIXELSY); mm_H:=PointX/25.4; mm_V:=PointY/25.4; Printer.BeginDoc;end;procedure PrintPageend;begin Printer.EndDoc;end;procedure PrintNewPage(); begin printer.NewPage; end;end.
[解决办法]
顶你
[解决办法]
你说的,我感觉是套打功能,适用FastReport可以实现,很方便。
[解决办法]
FastReport,QuickReport都可以实现
[解决办法]
用delphi的print,实现过,不过要设置位置什么的非常麻烦
用fastreport,没去试过
[解决办法]
fastreport的打印代码:
frmPersonPay.frReport1.LoadFromFile(extractfilepath(application.ExeName)+'\发票.frf');
frmPersonPay.frReport1.PrepareReport;
frmPersonPay.frReport1.PrintPreparedReport('',1,true,frall);
[解决办法]
在fastreport的发票.frf设置好打印纸张的尺寸
[解决办法]
我一直使用的FR来做打印。套打功能很好实现的。可以在设计报表时,把不需要打印的控件(Memoview和表格线)的Printable属性设置为False
只有要打印的才保留默认的Printable属性为True
不过,如果想在这里说清楚是不容易的,因为报表设计窗口中的细节没办法描述清楚。
代码倒是很好贴出来,不过光有代码是不够的