4000-520-616
欢迎来到免疫在线!(蚂蚁淘生物旗下平台)  请登录 |  免费注册 |  询价篮
主营:原厂直采,平行进口,授权代理(蚂蚁淘为您服务)
咨询热线电话
4000-520-616
当前位置: 首页 > 新闻动态 >
新闻详情
我想看看这个打印组件的效果,看看这代码哪里出问题了?-CSDN论坛
来自 : CSDN技术社区 发布时间:2021-03-24
这个程序在具体实现的时候第一个FUNCTION中
ifPrtIsCustomPaperthen提示PrtIsCustomPaper不识别?请问在单元中除了需要包含PRINTERS还需要包含什么单元吗?
首先、运行DELPHI5.0;选择FILE菜单中的NEW,在弹出的对话框中选择ActiveX页,选择ActiveXLibrary创建ActiveX库.然后,再往新建的库中加入一个AutomationObject,操作步骤同上。在AutomationObjectWizard对话框中填入组件名prtTest3;单击OK。
然后、在弹出的PrtTest3.tlb窗口中,选择IPrtTest3。单击右键新增一个IsInit的Property,类型为long。再继续增加如下5个Method:
procedureprtCustomPage(PageWidth:Integer;PageHeight:Integer);
safecall;
procedureprtStart;safecall;
procedureprtNewPage;safecall;
procedureprtEnd;safecall;
procedureprtDrawLine(X1:Integer;Y1:Integer;X2:Integer;Y2:
Integer;LineWidth:Integer);safecall;
procedureprtSetFont(constFontName:WideString;FontSize:
Integer);safecall;
procedureprtTextRect(VAlign:Integer;HAlign:Integer;RectLeft:
Integer;RectTop:Integer;RectRight:Integer;RectBottom:
Integer;constPrintString:WideString);safecall;
它们意义是:prtCustomPage用来设置自定义纸张.传入的参数自定义纸张的宽度和高度。
prtStart用来初始化打印机。如果初始化成功,则将属性IsInit置为真,反之则为假。
prtNewPage用来使打印机换页。
prtEnd 结束打印任务。
prtDrawLine用来在页面上绘制一条线。(X1,Y1)为起始点.(X2,Y2)为终止点。LineWidth为打印线的宽度。
prtSetFont用来设置打印的字体名及大小。
prtTextRect用来指定的方框内的输出的指定的字符串。

四、调用

在脚本中调用这个组件的方法:
(1)、利用CreateObject函数创建一个打印对象。
(2)、调用prtCustomPage来指定定制的纸张的大小(以0.1毫米为基本单位)。如果,不是定制的纸张则不需要调用这个过程(即以打印默认的纸张大小进行打印)。
(3)、调用prtStart进行打印机的初始化工作。如果打印机初始化成功,则会将IsInit属性置为真,表示初始化成功;否则,表示打印机正在忙或有别的应用程序正在使用打印机,初始化不能成功。
(4)、判断IsInit标志。如果为真,则继续执行打印段。
(5)、执行打印段。可以在利用打印机画线、和在指定位置输出文字。
(注:在组件接中的所有位置单位都是0.1毫米。例如.prtObject.prtDrawLien0,0,1000,1000表示从左上角(0,0)毫米到右下角(100,100)毫米处,画一条直线)
(6)、利用prtEnd结束打印任务。
SCRIPTLANGUAGE=\"VBScript\"
!--
SubTestPrtObject
DimprtObject
SetprtObject=CreateObject(\"PrtTest3.PrtTest3\")

prtObject.prtCustomPage1000,1000
prtObject.prtStart

ifprtObject.IsInitthen
prtObject.prtDrawLine0,0,1000,1000,1
prtObject.prtDrawLine500,700,1000,1000,1
prtObject.prtSetFont\"宋体\",16
prtObject.prtTextRect2,2,0,0,1000,500,\"WEB应用程序打印测试\"
prtObject.prtEnd
endif

SetprtObject=Nothing
EndSub

TestPrtObject()
//--
/SCRIPT

五、代码解析
在这个组件中,我们所要解决的几个问题:
(1)、在Delphi的应用程序设计中自定义打印纸张的设置,Delphi中自身带了一个QuickReport的打印设计程序,这个程序在一定的程度上方便了打印的设计,但这个设计程序对于自定义纸张的设定和打印支持却不是很好。因此,在这个组件中我们采用手工代码来设定自定义纸张大小。
FunctionTPrtTest3.InitPrintPaper:Boolean;
Var
Device:Array[0..cchDeviceName-1]ofChar;
Driver:Array[0..(max_path-1)]ofChar;
Port:Array[0..32]ofChar;
hDMode:THandle;
pDMode:PDevMode;
Begin
Result:=True;
ifPrtIsCustomPaperthen
Begin
{设置打印机段}
Printer.GetPrinter(Device,Driver,Port,hDMode);

ifhDMode 0thenBegin
Try
pDMode:=GlobalLock(hDMode);
ifpDMode nilthenBegin
//设定打印的方向为纵向或横向
ifPaperOrientation 0then
pDMode^.dmOrientation:=DMORIENT_LANDSCAPE
elsepDMode^.dmOrientation:=DMORIENT_PORTRAIT;
//设置拷贝份数为1份.
pDMode^.dmCopies:=1;
//以毫米为单位的纸张大小.
pDMode^.dmPaperLength:=PaperHeight*10;
pDMode^.dmPaperWidth:=PaperWidth*10;
//设置纸张类型为用户自定义.
pDMode^.dmPaperSize:=DMPAPER_USER;
end;
GlobalUnLock(hDMode);
Printer.SetPrinter(Device,Driver,Port,hDMode);
except
Result:=False;
end;
endelseBegin
Result:=False;
end;
end;
end;
(2)、打印位置的确定:由于组件是以图形方式进行打印,这就使得我们可以精确指向打印文件的输出位置,以便于进行对某些票据的套打。但这样就产生一个问题,我们是以打印的像素位置指定输入位置,还是以打印尺寸来指定位置。显然,利用像素来输出打印位置,对于编制程序来说是比较方便的。但由于一般用户对像素的概念并不理解,因此会带来使用上的困难;而且每一种打印机的分辩率是不一样的,因此,会出现在不同打印机上打印的效果不一样的问题。而以打印尺寸来指定位置并在程序中妥善加以处理就不会有上面的问题。具体的处理方法是,由用户输入尺寸位置。然后,在打印时,首先取得当前打印机的分辩率(注意:分辨率是以每英寸多少像素为单位的),再计算得出实际输入的像素位置后进行打印,这样就可以使得组件更加实用,而且,保持打印幅面的一致。具体的函数如下。
FunctionTPrtTest3.MMtoPrintPixel(InputPoint:TPoint):TPoint;
Begin
Result.x:=MMtoPrintPixelX(InputPoint.x);
Result.y:=MMtoPrintPixelY(InputPoint.y);
end;

FunctionTPrtTest3.MMtoPrintPixelX(InputX:Integer):Integer;
Begin
ifQueryPrintlogPixelthen
Begin
pDDIx:=GetDeviceCaps(Printer.Handle,logPixelsX);
pDDIy:=GetDeviceCaps(Printer.Handle,logPixelsY);
QueryPrintlogPixel:=False;
end;
Result:=Trunc(InputX/253.8*pDDIx+0.5);
end;

FunctionTPrtTest3.MMtoPrintPixelY(InputY:Integer):Integer;
Begin
ifQueryPrintlogPixelthen
Begin
pDDIx:=GetDeviceCaps(Printer.Handle,logPixelsX);
pDDIy:=GetDeviceCaps(Printer.Handle,logPixelsY);
QueryPrintlogPixel:=False;
end;
Result:=Trunc(InputY/253.8*pDDIy+0.5);
end;
GetDeviceCaps:为Windows系统中取得指定设备信息的函数。函数的原型如下
intGetDeviceCaps(
HDChdc,//设置的句柄
intnIndex//查询的设备参数。
);
其中,HDC为想要查询的打印机的句柄,logPixelsX、logPixelsY表示要查询的内容是打印机横向、纵向的每英寸的像素点数。

本文链接: http://orientint.immuno-online.com/view-707568.html

发布于 : 2021-03-24 阅读(0)
公司介绍
联络我们
服务热线:4000-520-616
(限工作日9:00-18:00)
QQ :1570468124
手机:18915418616