科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件Delphi开发Web应用程序打印组件

Delphi开发Web应用程序打印组件

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

近些年来,随着互联网的普及和推广,传统的单机模式和局域中的c/s模式的应用程序越来越不能满足信息共享的要求。

作者:佚名 来源:悠游在线 2007年10月31日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
四、调用

  在脚本中调用这个组件的方法:

  (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表示要查询的内容是打印机横向、纵向的每英寸的像素点数。


  六、组件的注册

  如果是在delphi编写了这个组件的,则可以选择run菜单下的register activex server来进行这个组件的注册。

  对于不开发机器的注册则可使用:点击“开始”→“运行”;在运行对话框中输入以下命令:

  regsvr32 < 文件名 > 注册一个activex控件
  regsvr32 /u < 文件名 > 解除某activex控件的注册

  七、其它应用

  组件的扩展:以上列出的仅仅是编写这个组件的框架,功能比较有限。根据需要我们还可以添加上画圆、椭圆,矩形,甚至图片等功能。有兴趣的读者就请自行添加。

  因为,组件是采用com的方式运行,所以,我们还在window script hosts(wsh)中应用这个组件,结合wsh原有(通过ado对象)访问外部数据库的能力,就可能做出在windows下功能强大的wsh的脚本程序。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章