读书人

好久没有使用该语言了。关于按下按钮就

发布时间: 2012-02-15 12:09:44 作者: rapoo

好久没有使用该语言了。关于按下按钮就直接打印(如发票)。特殊格式打印!
朋友让做一个打印标签(特殊纸大小,如发票类型),标签大小固定。字体大小以及位置也是设定的好的。
输入不同的信息,按下打印就可以直接输入到打印机(针打)即可

好久没有使用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

不过,如果想在这里说清楚是不容易的,因为报表设计窗口中的细节没办法描述清楚。
代码倒是很好贴出来,不过光有代码是不够的

读书人网 >.NET

热点推荐