在DELPHI中如何实现打印功能
delphi printerdialog 用法

delphi printerdialog 用法Delphi是一种集成开发环境(IDE),用于创建Windows应用程序。
其中一个常见的用途是与打印机进行交互,以实现打印功能。
PrinterDialog是Delphi中用于显示打印对话框的函数。
在Delphi中,可以使用PrinterDialog函数来显示打印对话框,让用户选择打印机、打印范围、打印份数等打印参数,然后进行打印操作。
要在Delphi中使用PrinterDialog函数,首先需要包含Printers单元。
Printers单元提供了用于处理打印机和打印操作的类和函数。
然后可以在需要的地方调用PrinterDialog函数来显示打印对话框。
下面是一个简单的示例:```delphiuses Printers;procedure TForm1.Button1Click(Sender: TObject);beginif PrinterSetupDialog1.Execute thenbeginPrinter.BeginDoc;tryPrinter.Canvas.TextOut(100, 100, 'Hello, World!');finallyPrinter.EndDoc;end;end;end;```在这个示例中,当用户点击Button1时,会调用PrinterSetupDialog1.Execute方法显示打印对话框。
用户可以在打印对话框中选择打印机、打印范围等参数,然后点击“打印”按钮进行打印。
在Printer.BeginDoc和Printer.EndDoc之间的代码将在打印操作开始前和结束后执行,可以在其中进行打印操作。
除了显示打印对话框,PrinterDialog函数还可以用于获取用户在打印对话框中选择的打印参数,以便在程序中进行进一步处理。
通过Printer.PrinterIndex属性可以获取用户选择的打印机索引,通过Printer.Copies属性可以获取用户选择的打印份数,通过Printer.PageWidth和Printer.PageHeight属性可以获取打印纸张的宽度和高度等。
用Delphi_FastReport解决ERP系统开发中单据打印的实例探索

图1:单据管理示意图摘要:本文用Delphi+Fastreport 为例介绍了用数据库后台存储单据文件前台进行调用很好的解决了后台存储与用户本地自定义设置之间的矛 盾,还介绍了通过编写通用式主从结构的单据打印程序快速解决各种单据的打印输出以及用cross-tab 技术解决交叉表样式报表的输出。
这些方法的 实现很好的解决了ER P 系统中单据输出和报表打印问题,同时较方便的实现了用户对单据和报表样式自定义的需求。
关键词:ER P 系统;后台;套打;交叉表;单据 中图分类号:T P302.1 文献标识码:A 文章编号:1003-9767(2011)05-0054-03下载:将存于后台表中的单据字段通过流文件方式保存至本地相 1. 单据文件的存储与用户自定义FastReport 中报表默认是以文件形式存储于各客户端本地系统 中,以其调用速度快而获得程序的首选,但这种方式更新时必须在各 客户端站点之间进行手动同步操作,给后期的报表维护带来了极大的不便,因此往往适用于站点数量较少的系统应用场合,在ER P 系统应用中,一般采用将FastReport 报表文件以image 字段的形式存储于后台数据库中,再通过相应的下载和上传操作实现对数据库内image 字段(即相应报表文件)的修改。
应的报表文件。
try SetStream := TFileStream.Create(ReportFileName, fmC reate orfmShareExclusive);// 保存相应字段内容到文件流中 TBlobField(ADOQueryBill.FieldByName('xt_bill_attach')). SaveToStream(SetStream);MessageDlg('报表文件下载成功!', mtInformation, [mbOk], 0);exceptMessageDlg('报表文件下载过程中遇到了错误!', mtError,[mbOk], 0);end; 上传至服务器:将重新设置的本地报表文件上传至后台表xt_bill 相应记录。
开发IE控件ActiveX(Delphi+打印控件)

开发IE控件ActiveX(Delphi打印控件)关键字:activex ie控件fastreport一直以来都觉得开发IE控件是一件非常难的事情,都是一些比较资深的程序员开发的,对于开发IE控件真的是觉得无从下手。
经过这几天的,查资料,问别人,瞎摸索终于做出了我的第一个IE控件--汽车电子客票打印控件。
下面按照自己的步骤,记录一下,以免以后自己都忘了,我这里是用Delphi7开发的(学校的课程设计时学过,后来一直都没用过,手生得很),使用了FastReport报表打印控件(/en/),以及Delphi7WebDeploy发布工具(/article.asp?articleid=4381):1、安装Delphi及插件,由于不会在Delphi上安装插件,还是费了不少功夫,问别人。
2、新建一个ActiveX工程,我这里选的是“ActiveX Form”,至于其它的选项,我还真不知道是用来开发什么的。
3、开发Delphi程序,接下来的事情,就是拖控件,写代码了。
其中很多时候需要调试,不知道有没有什么好的办法,自己觉得开发ActiveX控件,调试还是比较麻烦的,所以,我基本上是先在普通的Application Form上先把一些比较难弄、需要多次的程序写好,再拷到“ActiveX Form”工程中(详细的delphi+fastReport的开发过程下面再说)。
4、用WebDeploy发布,之前需要先在“Web deployment options”里,选择发布路径,发布后,会自动生成一个html文件了一个ocx控件,其中html 里的代码还需要自己去调一下,大小啊,位置啊,还有就是object标签的ocx 路径,最好改成相对路径,否则好像会报access拒绝的错误。
5、用IE打开这个html,选择警告中的“允许阻止的内容”,这样就会安装控件了,它安装在了“C:\WINDOWS\Downloaded Program Files”这个路径下,如果需要再次改代码、调试,你需要从这里把它右键删除掉(需要关掉这个html 页面,否则删不掉)6、接下来你会觉得,安装的这个控件的图标有点丑(delphi的默认图标),在project->options->application发现这个东西,还不让改,怎么办,查资料,“/t/20041021/14/3477746.html”我好像两种办法都试了一次,但总是改不了,后来重启一次,发现这个是已经改掉了。
delphi打印技巧

结果就一目了然了。
2.将结果直接送到打印机
Delphi提供了两种打印方式:一是将结果输送到Form,再调用Form的print方法将结果输送到打印机,二是将结果直接输送到打印机。如果你采用第一种方式,则无论你怎样调整Form的PrintScal属性,打印出来的东西也不会让你满意。因此建议采用第二种方式。
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
如果你想自己用Delphi编写一个打印程序,那么,下面这些技巧或许对你有所帮助。
1.获取、显示当前打印机的分辨率
Windows下的打印分辨对打印程序有着至关重要的作用,如果你想知道打印机的分辨率,请在程序中加入一行:
ShowMessage(′水平分辨率′+inttostr(GetDeviceCaps(printer Handle,LOGPIXELSX))+chr(13)+′垂直分辨率:′+ inttostr(GetDeviceCaps(printerHandle,LOGPIXELSY)));
如果想让打印程序在任何打印机上都能正常地打印,你就必须改变你的度量单位。如果采用固定的度量,不同分辨率的打印效果是不同的。举例来讲:printerCanvasrectangle(0,0,360,720)在360×360的佳能4200SP上能打出一个1英寸宽、2英寸高的矩形,但在600×600的惠普6L上只能打出0.6英寸宽、1.2英寸高的矩形。使用打印机的点数做为度量单位是一个明智的选择。具体做法如下:
3.尽量不要使用AssignPrn
尽管AssignPrn简化了文本打印操作,使输出到打印机像输出到文件一样简单。但简单带来的是一系列的不方便:你无法知道当前打印的行数,无法准确控制行距,无法灵活改变字体字形等等。还是用打印机的Canvas属性进行打印吧。
delphi报表打印讲稿

报表打印在数据库开发应用时,一般都离不开报表打印功能,Delphi 6.0提供了一种完善易用的打印组件---QReport,利用它可是非常方便的实现报表打印功能,这里不准备详细讨论实现报表的一切方法,具体问题已经有不少资料,不过一般的资料都是介绍的应用英美模式构造报表,这种报表格式和国内一般的习惯并不相同,下面,我们将通过一个实际的例子,说明如何构造一个符合我们习惯的报表。
有了这样的基础,实现其它样式的报表并不是太困难的事情。
一、QReport面板组件介绍QReport面板提供的组件可以分类以下几种类型:1,模板类:这类组件是作为快速构建报表的模板或容器,它实际上是QReport面板左边的前六个组件,包括QuickRep、QrsubDetall、QRStringBand、QRBand、QRChildBand、QRGroup。
其中,QuickRep是必用组件,它必须加入到一个空白的表单中,作为建立报表的基础,其它所有的组件都要放在这个组件之上。
QRBand也是一个必用组件,它用于显示具体内容,内容的类型由BandType 属性来决定。
其它几个组件的使用频率低一些,主要是构建特殊类型的报表。
2,显示一般内容的组件:这类组件主要是为了显示非数据库类型的内容,或者提供一些特定的功能,包括:QRLabel、QRExpr、QRSysData、QRMemo、QRExprMemo、QRRichText、QRShape、QRChart 等。
其中,QRExpr既可以显示一般数据,也可以显示数据库数据。
3,显示数据库内容的组件:该组件主要用于显示数据库中的数据,这些组件包括QRDBText、QRExpro、QRDBRichText、QRDBImage等。
4,其它组件:这些组件包括QRCompositeReport用于合并多个报表, QRPreview用于预览报表,至于 QRTextFilter、QRCSVFFilter、QRHTMLFilter等组件则用于输出报表内容,这些组件用的较少。
Delphi下POS机控制钱箱,客显,打印机(精)

Delphi下使用并口控制打印机使用Delphi编程的人员如果需要在Windows下使用并口打印机逐行打印,而又不想使用Windows的驱动程序。
我们这里提供一种不需要任何外来的元件的方法。
Var F:TextFile; Str:string; Begin try Str:=’ 欢迎使用票据打印机!’+Chr(10; AssignFile(F, 'LPT1'; Rewrite(F; Write(F, Str; CloseFile(F; Except Messagedlg('数据发送失败!',mterror,[mbok],0; End; end; 如果需要控制并口打印机开钱箱,也只需要重新给Str如下赋值: Str:=Chr(27+'p'+Chr(0+Chr(25+Chr(255;Delphi下使用串口控制打印机使用Delphi编程的人员如果需要在Windows下使用串口控制顾客显示屏或串口打印机,就需要使用外来方式。
我们这里提供了API_COM.DLL这个链接库供调用。
首先把API_COM.DLL文件复制到编写的源程序目录下,接着在程序的开头声明调用的三个函数来源: var Form1: TForm1; {加入下面三行声明} functioncom_init(com:Integer; baud:Dword:Boolean;stdcall;external 'api_com.dll'; functioncom_rest:Boolean;stdcall;external 'api_com.dll'; function com_send(buf:PChar;len:Integer:Boolean;stdcall;external 'api_com.dll';implementation{$R*.DFM}Com_init(1,9600是打开串口进行通讯,1是打开COM1,波特率为9600。
delphi打印实现(节选)

delphi打印实现(节选)................{$R *.dfm}procedure SetPaperHeight(V alue:integer); //设置纸张高度-单位:mmvarDevice : 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; //自定义纸张最小高度127mmif Value > 432 then Value := 432; //自定义纸张最大高度432mmPrinter.PrinterIndex := Printer.PrinterIndex;Printer.GetPrinter(Device, Driver, Port, hDMode);if hDMode <> 0 thenbeginpDMode := GlobalLock(hDMode);if pDMode <> nil thenbeginpDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE orDM_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(V alue:integer); //设置纸张宽度:单位--mmvarDevice : 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; //自定义纸张最小宽度76mmif Value > 216 then Value := 216; //自定义纸张最大宽度216mmPrinter.PrinterIndex := Printer.PrinterIndex;Printer.GetPrinter(Device, Driver, Port, hDMode);if hDMode <> 0 thenbeginpDMode := GlobalLock(hDMode);if pDMode <> nil thenbeginpDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE orDM_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;//======================================绘基础几何图型函数======================//--------------------圆--------------------------------------------------------procedure _Circle(x,y,r,N:real);varIntLineWidth:Integer;beginx:=x*mm_H;y:=y*mm_V;r:=r*mm_H;IntLineWidth:=Round(N*mm_H);MyCanvas.Pen.Width:=IntLineWidth;MyCanvas.Ellipse(round(x-r),round(y-r),round(x+r),round(y+r));end;function _outTxt(x,y:Real;Txt:String;FontSize:Real;FontName:String):Boolean;varLogRec: TLOGFONT;OldFont, NewFont: HFONT;i: LongInt;begin// case PrnMode of{ 1: beginwith printer dobeginGetObject(Canvas.Font.Handle, SizeOf(LogRec), @LogRec);LogRec.lfOutPrecision := OUT_TT_ONL Y_PRECIS;LogRec.lfFaceName :='宋体';LogRec.lfHeight:=round(FontSize*mm_V);LogRec.lfWeight:=0;NewFont := CreateFontIndirect(LogRec);OldFont := SelectObject(Canvas.Handle,NewFont);end;x:=Round((x+PageLeft)*mm_H);y:=Round((y+PageTop)*mm_V);MyCanvas.TextOut(round(x),round(y),txt);end; }// 2:beginx:=Round((x+PageLeft)*mm_H);y:=Round((y+PageTop)*mm_V);MyCanvas.Font.Height:=round(FontSize*mm_V);:=FontName;MyCanvas.TextOut(round(x),round(y),txt);end;// end;end;//移动坐标点procedure _Move(x,y:Real);beginPoint1.X:=point1.X+round(x*mm_H);point1.Y:=Point1.Y+round(y*mm_V);MyCanvas.MoveTo(point1.X,point1.Y);end;procedure _line(x1,y1,x2,y2,LineWidth:Real);varpoint2:TPoint;IntLineWidth:Integer;begin// if x1+y1<>0 then_move(x1,y1); //移动到起点坐标point2.X:=Point1.X+round(x2*mm_H);point2.Y:=Point1.Y+round(y2*mm_V);IntLineWidth:=Round(LineWidth*mm_H); //输出线宽MyCanvas.Pen.Width:=IntLineWidth; //设置线宽MyCanvas.LineTo(point2.X,point2.Y);point1:=point2;end;procedure TForm1.FormCreate(Sender: TObject);varTmpQry : TADOQuery;beginMyCanvas:=Image1.Canvas;ADOCOnnection1.Connected := false;ADOConnection1.ConnectionString :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+GetCurrentDir()+'\data.mdb;Persist Security Info=False';ADOCOn:=ADOConnection1;ADOTable1.Active := true;TmpQry := OpenDB('select * from report order by ID',ADOCon);ComboBox1.Items.Clear;SetLength(TabIds,TmpQry.RecordCount);while not TmpQry.Eof dobeginComboBox1.Items.Add(VarToStr(TmpQry.FieldValues['Title']));TabIds[TmpQry.RecNo-1]:=TmpQry.FieldValues['id'];TmpQry.Next;end;if ComboBox1.Items.Count>0 then ComboBox1.ItemIndex :=0;TmpQry.Freeend;procedure recover;beginpoint1.X := round(PageLeft*mm_H);point1.Y := round(PageTop*mm_V);end;procedure _Grid(Id:Integer;Sql:String;Grid,Data:Boolean);varTmpQry,TmpQry1 : TADOQuery;x1,y1,x2,y2,r,w,FontSize:real;txt : String;classId : Integer;FontName : TFontName ; //显示使用的字体TmpColor:TColor;beginif Sql<>'' then TmpQry1 := OpenDB(sql,ADOCon);Sql := 'select * from TableLib where hidden=0 and tabId='+IntToStr(Id);if (not Grid) and (data) then sql:=sql+' and classId=4';if (grid) and (not data) then sql:=sql+' and classId<>4';TmpQry := OpenDB(Sql,ADOCon);while not TmpQry.Eof dobeginx1 := TmpQry.FieldValues['x1'];y1 := TmpQry.FieldValues['y1'];w := TmpQry.FieldValues['width'];if not TmpQry.FieldValues['relatively'] then recover; //若非相对坐村,恢复原点ClassId := TmpQry.FieldValues['ClassId'];case ClassId of1 : begin //标签txt := VarToStr(TmpQry.FieldValues['text']);if not TmpQry.FieldByName('FontSize').IsNull thenFontSize := TmpQry.FieldValues['FontSize']else FontSize := 2.5;if not TmpQry.FieldByName('FontName').IsNull thenFontName:=TmpQry.FieldValues['FontName']else FontName:='宋体';MyCanvas.Font.Style:=[];if TmpQry.FieldValues['FontBold'] thenMyCanvas.Font.Style:=[fsBold];_outTxt(x1,y1,txt,FontSize,FontName);end;2 : begin //直线x2 := TmpQry.FieldValues['x2'];y2 := TmpQry.FieldValues['y2'];_line(x1,y1,x2,y2,w);end;3 : begin //圆r := TmpQry.FieldValues['r'];_circle(x1,y1,r,w);end;4 : begin //字段if not TmpQry.FieldByName('text').IsNull thenbeginif not TmpQry1.FieldByName(TmpQry.FieldValues['text']).IsNull thenbegintxt := VarToStr(TmpQry1.FieldValues[TmpQry.FieldValues['text']]);if not TmpQry.FieldByName('FontSize').IsNull thenFontSize := TmpQry.FieldValues['FontSize']else FontSize := 2.5;if not TmpQry.FieldByName('FontName').IsNull thenFontName:=TmpQry.FieldValues['FontName']else FontName:='宋体';MyCanvas.Font.Style:=[];if TmpQry.FieldValues['FontBold'] thenMyCanvas.Font.Style:=[fsBold];TmpColor := MyCanvas.Font.Color;MyCanvas.Font.Color := clBlack;_outTxt(x1,y1,txt,FontSize,FontName);MyCanvas.Font.Color := TmpColor;end;end;end;end;TmpQry.Next;end;TmpQry.Free;end;procedure _init(PageSize:TPoint);begincase PrnMode of1: beginPhysicalWidth:=PageSize.x; //物理页宽PhysicalHeight:=PageSize.Y; //物理页高PageWidth:=printer.PageWidth; //逻辑页宽PageHeight:=printer.PageHeight; //逻辑页高end;2: beginPageWidth:=PhysicalHeight; //逻辑页宽PageHeight:=PhysicalHeight; //逻辑页高end;end;end;//---------------------------------------------------------------------------------procedure TForm1.OutPut(PrnMode:Integer;Grid,data:Boolean);varPaperW,PaperH:integer;PrintDialog1:TPrintDialog;LogRec: TLOGFONT;OldFont, NewFont: HFONT;PageSize:Tpoint;pw,ph,PointX,PointY:Integer; //纸张设置TabId : Integer;TmpQry :TADOQuery;Sql:String;beginTabId := ComboBox1.ItemIndex+1; //报表号Sql := 'select * from report where id='+IntToStr(TabId);TmpQry := OpenDb(Sql,ADOCon);if not TmpQry.Eof thenbeginPaperW := TmpQry.FieldValues['PaperWidth'];paperH := TmpQry.FieldValues['PaperHeight'];Sql := VarToStr(TmpQry.FieldValues['Sql']);if not ADOTable1.Eof thensql := _replace(sql,'@id@',VarToStr(ADOTable1.FieldValues['id']))else sql :='';PrintDialog1:=TPrintDialog.Create(nil);PageLeft := TmpQry.FieldValues['Left'];PageTop := TmpQry.FieldValues['Top'];case PrnMode of1: beginif PrintDialog1.Execute thenbeginSetPaperHeight(paperH);SetPaperWidth(PaperW);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;_Init(PageSize);Printer.Title:=VarToStr(TmpQry.FieldValues['title']);MyCanvas := Printer.Canvas;Printer.BeginDoc;MyCanvas.Brush.Color:=clBlue;MyCanvas.Brush.Style := bsclear;MyCanvas.Pen.Color:=clGreen;MyCanvas.Font.Color := clGreen;Zoom:=TmpQry.FieldValues['Zoom'];mm_H := mm_H*zoom;mm_V := mm_V*zoom;_Grid(TabId,Sql,Grid,data);Printer.EndDoc;end;end;2: beginmm_H:=2;mm_V:=2;Zoom := ComboBox2.ItemIndex+2 ; //全局缩放比例mm_H := mm_H*zoom;mm_V := mm_V*zoom;Image1.Picture.Graphic.Width := 1;Image1.Picture.Graphic.Height := 1;Image1.Width := Image1.Picture.Graphic.Width;Image1.Height := Image1.Picture.Graphic.Height;Image1.Picture.Graphic.Width := round(PaperW*mm_H);Image1.Picture.Graphic.Height := round(PaperH*mm_V);Image1.Width := Image1.Picture.Graphic.Width;Image1.Height := Image1.Picture.Graphic.Height;Image1.Top:=10-ScrollBox1.VertScrollBar.Position;if Image1.Width+10>ScrollBox1.Width thenImage1.Left:=0-ScrollBox1.HorzScrollBar.Position+2elseImage1.Left:=((ScrollBox1.Width-Image1.Width) div 2)-8-ScrollBox1.HorzScrollBar.Position;Image1.Canvas.Brush.Style := bsSolid;// ---------清除预览画布上的残像Image1.Canvas.Brush.Color:=clWhite;Image1.Canvas.Pen.Color:=clWhite;Image1.Canvas.Rectangle(0,0,PageWidth,PageHeight);Shape1.Top:=Image1.Top+10;Shape1.Left:=Image1.Left+10;Shape1.Width:=Image1.Width;Shape1.Height:=Image1.Height;Shape1.Visible:=True;Image1.Visible := true;MyCanvas.Brush.Color :=clWhite;MyCanvas.FillRect(MyCanvas.ClipRect); //清除残留影像MyCanvas:=Image1.Canvas;MyCanvas.Brush.Color:=clBlue;MyCanvas.Brush.Style := bsclear;MyCanvas.Pen.Color:=clGreen;MyCanvas.Font.Color := clGreen;Zoom:=TmpQry.FieldValues['Zoom'];mm_H := mm_H*zoom;mm_V := mm_V*zoom;_Grid(TabId,Sql,Grid,data);end;end;end;TmpQry.free;end;//-----------------------------------------------------------------------------------procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginStart_Point.X:=x;Start_Point.Y:=y;end;procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginScrollBox1.HorzScrollBar.Position:= ScrollBox1.HorzScrollBar.Position+(Start_Point.X-x); ScrollBox1.VertScrollBar.Position:= ScrollBox1.VertScrollBar.Position+(Start_Point.Y-y); end;procedure TForm1.ToolButton1Click(Sender: TObject);beginOutPut(1,checkBox1.Checked,checkBox2.Checked);end;procedure TForm1.ToolButton2Click(Sender: TObject);beginOutPut(2,checkBox1.Checked,checkBox2.Checked);end;procedure TForm1.DBEdit10Change(Sender: TObject);beginDBText1.caption := NumToChnStr(StrToFloat(DBEdit10.Text),false);end;procedure TForm1.DBEdit12Change(Sender: TObject);beginDBText2.caption := NumToChnStr(StrToFloat(DBEdit12.Text),false);end;procedure TForm1.ADOTable1BeforePost(DataSet: TDataSet);beginADOTable1.FieldValues['cn_price'] := NumToChnStr(StrToFloat(DBEdit12.Text),false); ADOTable1.FieldValues['cn_rate'] := NumToChnStr(StrToFloat(DBEdit12.Text),false); end;procedure TForm1.PageControl1Change(Sender: TObject);beginif ADOTable1.State = dsEdit then ADOTable1.Post;ToolButton2.Click;end;procedure TForm1.Shape1ContextPopup(Sender: TObject; MousePos: TPoint;var Handled: Boolean);beginend;procedure TForm1.TabSheet2ContextPopup(Sender: TObject; MousePos: TPoint;var Handled: Boolean);beginend;end.procedure PrintDbGrid(DataSet:TDataSet;DbGrid:TDbGrid;Title:String);varPointX,PointY:integer;ScreenX:integer;i,lx,ly:integer;px1,py1,px2,py2:integer;RowPerPage,RowPrinted:integer;ScaleX:Real;THeight:integer;TitleWidth:integer;SumWidth:integer;PageCount:integer;SpaceX,SpaceY:integer;RowCount:integer;beginPointX:=Round(GetDeviceCaps(printer.Handle,LOGPIXELSX)/2.54);PointY:=Round(GetDeviceCaps(printer.Handle,LOGPIXELSY)/2.54);ScreenX:=Round(Screen.PixelsPerInch/2.54);ScaleX:=PointX/ScreenX;RowPrinted:=0;SumWidth:=0;printer.BeginDoc;With Printer.Canvas dobeginDataSet.DisableControls;DataSet.First;THeight:=Round(TextHeight('我')*2.5);//设定每行高度为字符高的1.5倍SpaceY:= Round(TextHeight('我')/4);SpaceX:=Round(TextWidth('我')/4);RowPerpage:=Round((printer.PageHeight-5*PointY)/THeight); //上下边缘各2厘米ly:=2*PointY;PageCount:=0;while not DataSet.Eof dobeginif (RowPrinted=RowPerPage) or (RowPrinted=0) thenbeginif RowPrinted<>0 thenPrinter.NewPage;RowPrinted:=0;PageCount:=PageCount+1;:='宋体';Font.size:=16;Font.Style:=Font.Style+[fsBold];lx:=Round((Printer.PageWidth-TextWidth(Title))/2);ly:=2*PointY;TextOut(lx,ly,Title);Font.Size:=11;Font.Style:=Font.Style-[fsBold];lx:=Printer.PageWidth-5*PointX;ly:=Round(2*PointY+0.2*PointY);if RowPerPage*PageCount>DataSet.RecordCount thenRowCount:=DataSet.RecordCountelseRowCount:=RowPerPage*PageCount;TextOut(lx,ly,'第'+IntToStr(RowPerPage*(PageCount-1)+1)+'-'+IntToStr(RowCount)+'条,共'+IntToStr (DataSet.RecordCount)+'条');lx:=2*PointX;ly:=ly+THeight*2;py1:=ly-SpaceY;if RowCount=DataSet.RecordCount thenpy2:=py1+THeight*(RowCount-RowPerPage*(PageCount。
Delphi数据库编程讲座第六讲 程序重要功能及打印功能的实现

第六讲程序重要功能及打印功能的实现《上》在本讲及下一讲中,我们来完成本程序最重要的一个功能:劳保发放。
此功能从原理上来讲不是太复杂,但实现起来需要动脑筋,稍有不慎就会导致发放错误。
下面我们来讲如何实现此功能。
劳保用品发放。
在前面的讲座中,心铃给大家讲了数据维护等一些功能,在劳保用品发放前必须对各种需要维护的数据做好维护工作,比如工种、岗位是否有调整,劳保用品的发放周期是否改变,部门是否有新进员工,是否有员工退休等等,这些工作的目的都是为了保证上次发放记录(对某些员工是初始发放记录)的完整性。
因为心铃在程序中采用的方式是发放记录中保存着发放周期、上次发放时间、工种等几个关键信息,所以上次发放记录的准确性是非常重要的。
下面我们来看看程序实现思路。
劳保用品发放要得到的结果是:本次发放劳保用品的员工姓名(编号)、劳保用品名称、发放数量,这是直接结果,同时我们还需要在发放的同时把发放记录中的劳保用品的上次发放时间更新为本次发放时间。
根据需要,我们要统计单个部门所有劳保用品名称、规格、发放数量,还要统计所有需要发放的劳保用品名称、规格、发放数量。
由于我们的发放记录数据表中是不保存这些信息的,所以我们需要建立一个数据表来保存本次发放的基本数据,便于随时查询、统计本次发放的各种信息。
心铃将此数据表命名为fftmp(发放临时表),此数据表字段如下:注意:上面的表格有点冗余,其实部门名称、员工姓名都是可以根据部门编号和员工编号查到的,这里主要是为了方便起见才这样处理的。
之所以称此表为发放临时表,主要是其数据寿命周期为到下次发放为止,在下次发放(我们公司是半年为一周期)时要清空此数据表。
下面我们就来看看如何用代码实现。
首先看发放界面图,见图(12-1)。
界面图上右下角有一个“初始化发放数据表”,此按钮的代码如下:procedure TForm3.BitBtn23Click(Sender: TObject);beginif MessageDlg('本功能每次发放前使用一次,且只能使用一次,请确认!', mtConfirmation, [mbYes, mbNo], 0) = mrYes thenbegintable11.EmptyTable;MessageDlg('初始化完毕,本次发放过程中不要再使用此功能!', mtInformation, [mbOk], 0);end;end;上面这段代码用了Emptytable这个数据表的方法来清空数据表,并在清空数据表前让用户确认、在清空后给出用户提示信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在DELPHI中提供了一个PRINTERS程序单元,它说明了一个TPRINTER对象,封装了WINDOWS打印工作和输出打印机之间的接口,并提供常用的属性和方法,其中画布CANVAS是一个非常有用的属性,它代表了当前打印文件的表面,是以图形方式来工作的,整个的打印输出工作仅仅是将你打印的内容输出到TPRINTER的属性CANVAS上,当全部的输出工作完成以后,打印对象(TPRINTER)把CANVAS的属性值送到打印机上去。
下面举例来说明如何通过DELPHI实现文本内容的打印。
在DELPHI 中提供了PRINTDIALOG、PRINTERSETUPDIALOG两个控件允许我们进行打印机以及其他影响打印输出的选择,此外最重要的一点是要想实现打印功能必须在编译程序以前将PRINTERS加入到INTERFACE或者IMPLEMENTATION的UESE语句当中,因为PRINTER单元包括ASSIGNPRN和其他控制打印机的过程。
首先在FORM当中加入MEMO、PRINTDIALOG、PRINTERSETUPDIALOG和两个BUTTON控件,两个BUTTON的CAPTION分别为“打印设置”和“打印”。
然后编写BUTTON的事件驱动程序(代码在下面),这个简单的例子中只要单击“打印”按钮时便可以在打印机上输出文件0S2.TXT,打印事件的清单如下:
implementation
usesprinters;
{$R*.DFM}
procedureTForm1.BitBtn1Click(Sender:TObject);
begin
printersetupdialog1.execute;//选择输出的打印机以及其他打印控制选项
end;
procedureTForm1.BitBtn2Click(Sender:TObject);
var
lines:integer;
prntext:system.text;
//将PRNTEXT声名为一个在SYSTEM程序单元当中定义的文本文件begin
ifprintdialog1.executethen
assignprn(prntext);//将PRNTEST分配给打印机
rewrite(prntext);//调用REWRITE函数,为输出打开已分配的文件printer.canvas.font:=memo1.font;
//把当前MEMO1的字体指定给打印对象的CANVAS的字体属性forlines:=0tomemo1.lines.count-1do
writeln(prntext,memo1.lines[lines]);
//把MEMO的内容写到打印机对象
system.close(prntext);//关闭打印文件
end;
procedureTForm1.FormCreate(Sender:TObject);
begin
memo1.lines.loadfromfile('c:\dos\os2.txt');
//在FORM建立时读入C:\DOS\OS2.TXT文件
end;
end.
2、图形的打印功能,简单的图形打印功能也如打印文本一样的容易,只是告诉打印机对象(TPRINTER)开始打印,把图形简单的复制到打印机上去,最后告诉打印机结束打印工作。
举例说明:将上面的例子的MEMO控件换成IMAGE控件,再经过一些简单的修改,图形打印的代码如下:
procedureTForm1.BitBtn1Click(Sender:TObject);
begin
ifprintdialog1.executethen
begin
printer.begindoc;
printer.canvas.draw(0,0,image1.picture.graphic);
printer.enddoc;
end;
end;
在这种情况下,使用的是打印机的分辨率,图形在页面的左上角开始打印输出,打出的图形很小,在很多的情况下不能符合要求,但是打印机画布CANVAS的STRETHDRAW的方法,可以让我们对图形进行灵活的处理,画布(CANVAS)的STRETCHDRAW方法声名为:
procedureStretchDraw(constRect:TRect;Graphic:TGraphic);
其中的RECT参数代表图形输出区域的大小,TRECT的类型声名为:TRect=record
caseIntegerof
0:(Left,Top,Right,Bottom:Integer);
1:(TopLeft,BottomRight:TPoint);
end;
因此我们只要调整RECT的大小及其在打印页面上的位置,进而达到自己满意的效果,下面的代码是不断的放大图形,充满我们定义的矩
形区域,并将其定位在打印机画布(CANVAS)的中央进行输出。
代码如下:
procedureTForm1.Button1Click(Sender:TObject);
VAR
strect:Trect;//定义打印输出矩形框的大小
temhi,temwd:integer;
begin
ifprintdialog1.executethen
begin
temhi:=image1.picture.height;
temwd:=image1.picture.width;
while(temhiprinter.pageheightdiv2)and
//将图形放大到打印页面的1/2大小
(temwdprinter.pagewidthdiv2)do
begin
temhi:=temhi+temhi;
temwd:=temwd+temwd;
end;
withstrectdo//定义图形在页面上的中心位置输出
begin
left:=(printer.pagewidth-temwd)div2;
top:=(printer.pageheight-temhi)div2;
right:=left+temwd;
bottom:=top+temhi;
end;
withprinterdo
begin
begindoc;
//将放大的图形向打印机输出
canvas.stretchdraw(strect,image1.picture.graphic);
enddoc;
end;
end;
end;
以上代码在DELPHI2.0上编译通过,通过这些小小的例子,相信大家对于在DELPHI中打印图形和文本有一定的了解,同样通过打印机的画布(CANVAS)属性也可以实现数据库表单的打印,在这里不一一赘述,如果大家有兴趣不妨一试。