我想看看这个打印组件的效果,看看这代码哪里出问题了?

Kandy 2001-08-08 12:39:23
这个程序在具体实现的时候第一个FUNCTION中
if PrtIsCustomPaper then 提示PrtIsCustomPaper 不识别?请问在单元中除了需要包含PRINTERS还需要包含什么单元吗?

  首先、运行DELPHI 5.0;选择FILE菜单中的NEW,在弹出的对话框中选择ActiveX页,选择ActiveX Library创建ActiveX库.然后,再往新建的库中加入一个Automation Object,操作步骤同上。在Automation Object Wizard对话框中填入组件名prtTest3;单击OK。

  然后、在弹出的PrtTest3.tlb窗口中,选择IPrtTest3。单击右键新增一个IsInit的Property,类型为long。再继续增加如下5个Method:

  procedure prtCustomPage(PageWidth: Integer; PageHeight: Integer);
       safecall;

  procedure prtStart; safecall;

  procedure prtNewPage; safecall;

  procedure prtEnd; safecall;

  procedure prtDrawLine(X1: Integer; Y1: Integer; X2: Integer; Y2:
       Integer; LineWidth: Integer); safecall;

  procedure prtSetFont(const FontName: WideString; FontSize:
       Integer); safecall;

  procedure prtTextRect(VAlign: Integer; HAlign: Integer; RectLeft:
       Integer; RectTop: Integer;RectRight: Integer; RectBottom:
       Integer; const PrintString: 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.prtDrawLien 0,0,1000,1000 表示从左上角(0,0)毫米到右下角(100,100)毫米处,画一条直线)

(6)、利用prtEnd结束打印任务。

<SCRIPT LANGUAGE="VBScript">

<!--

Sub TestPrtObject

Dim prtObject

Set prtObject=CreateObject("PrtTest3.PrtTest3")



prtObject.prtCustomPage 1000,1000

prtObject.prtStart



if prtObject.IsInit then

prtObject.prtDrawLine 0,0,1000,1000,1

prtObject.prtDrawLine 500,700,1000,1000,1

prtObject.prtSetFont "宋体",16

prtObject.prtTextRect 2,2,0,0,1000,500,"WEB应用程序打印测试"

prtObject.prtEnd

end if



Set prtObject=Nothing

End Sub



TestPrtObject()

//-->

</SCRIPT>



五、代码解析

  在这个组件中,我们所要解决的几个问题:

(1)、在Delphi的应用程序设计中自定义打印纸张的设置,Delphi中自身带了一个QuickReport的打印设计程序,这个程序在一定的程度上方便了打印的设计,但这个设计程序对于自定义纸张的设定和打印支持却不是很好。因此,在这个组件中我们采用手工代码来设定自定义纸张大小。

Function TPrtTest3.InitPrintPaper:Boolean;

Var

Device:Array [0..cchDeviceName-1] of Char;

Driver:Array [0..(max_path-1)] of Char;

Port:Array [0..32] of Char;

hDMode:THandle;

pDMode:PDevMode;

Begin

Result:=True;

if PrtIsCustomPaper then

Begin

{设置打印机段}

Printer.GetPrinter(Device,Driver,Port,hDMode);



if hDMode<>0 then Begin

Try

pDMode:=GlobalLock(hDMode);

if pDMode<>nil then Begin

//设定打印的方向为纵向或横向

if PaperOrientation<>0 then
         pDMode^.dmOrientation:=DMORIENT_LANDSCAPE

else pDMode^.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;

end else Begin

Result:=False;

end;

end;

end;

(2)、打印位置的确定:由于组件是以图形方式进行打印,这就使得我们可以精确指向打印文件的输出位置,以便于进行对某些票据的套打。但这样就产生一个问题,我们是以打印的像素位置指定输入位置,还是以打印尺寸来指定位置。显然,利用像素来输出打印位置,对于编制程序来说是比较方便的。但由于一般用户对像素的概念并不理解,因此会带来使用上的困难;而且每一种打印机的分辩率是不一样的,因此,会出现在不同打印机上打印的效果不一样的问题。而以打印尺寸来指定位置并在程序中妥善加以处理就不会有上面的问题。具体的处理方法是,由用户输入尺寸位置。然后,在打印时,首先取得当前打印机的分辩率(注意:分辨率是以每英寸多少像素为单位的),再计算得出实际输入的像素位置后进行打印,这样就可以使得组件更加实用,而且,保持打印幅面的一致。具体的函数如下。

Function TPrtTest3.MMtoPrintPixel(InputPoint:TPoint):TPoint;

Begin

Result.x:=MMtoPrintPixelX(InputPoint.x);

Result.y:=MMtoPrintPixelY(InputPoint.y);

end;



Function TPrtTest3.MMtoPrintPixelX(InputX:Integer):Integer;

Begin

if QueryPrintlogPixel then

Begin

pDDIx:=GetDeviceCaps(Printer.Handle,logPixelsX);

pDDIy:=GetDeviceCaps(Printer.Handle,logPixelsY);

QueryPrintlogPixel:=False;

end;

Result:=Trunc(InputX/253.8*pDDIx+0.5);

end;



Function TPrtTest3.MMtoPrintPixelY(InputY:Integer):Integer;

Begin

if QueryPrintlogPixel then

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系统中取得指定设备信息的函数。函数的原型如下

int GetDeviceCaps(

HDC hdc, // 设置的句柄

int nIndex // 查询的设备参数。

);

其中,HDC为想要查询的打印机的句柄,logPixelsX、logPixelsY表示要查询的内容是打印机横向、纵向的每英寸的像素点数。


...全文
97 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kandy 2001-08-08
  • 打赏
  • 举报
回复
真的没有人回答吗?这个问题不难啊
Kandy 2001-08-08
  • 打赏
  • 举报
回复
为什么没有人回复?

5,931

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧