转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
关于WEB应用程序的打印组件开发初探         ★★★★

关于WEB应用程序的打印组件开发初探

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1139 更新时间:2009/4/23 18:25:57
 

一、引言

  近些年来,随着互联网的普及和推广,传统的单机模式和局域中的C/S模式的应用程序越来越不能满足信息共享的要求。因此,一种新的基于浏览器的B/S的应用程序的开发方式被提了出来。新的开发方案以其客户端的免维护、免配置、程序能根据服务器的信息能够自动更新升级;服务器端多层模式的应有提高处理的效率和安全性越来越被广大的应用程序的开发者所看好。成为应用程序开发的一个新的发展方向。在WINDOWS的平台上,人们利用ASP来开发服务的显示界面,而用组件来封装商业规则,在各种杂志上利用各种工具进行组件开发也是屡见不鲜。但介绍打印组开发却不怎么看到。笔者希望就自已开发打印组件的一点心得体会来抛砖引玉。

 

二、设想

  WEB打印组件要求是在一次为某单位开发信息管理系统中被提及的,这个系统中的一些票据需要打印。这样,如何对这些票据进行套打成了我们必须解决的问题。

  要在客户端打印一些用户要求的票据或其它的文字或图片资料,有两种方式:一种是利用DELPHI的ACTIVE FORM来生成客户端的界面,由浏览器下载安装,并在客户端运行。(这种方式在开发多后台数据库中,较为常用。在国内许多新版本的财务软件都采用了这种方法,其缺点是对开发人员的要求太高),另一种是开发一个组件在客户端安装,然后,由服务器端来生成VBSCRIPT脚本,在客户端运行、创建相应的组件对象;利用组件对象来进行打印操作。(这种方法只要客户端的COM组件开发完成,使用者只要熟悉VBSCRIPT或JAVASCRIPT脚本语言就可能方便的调用)。本文我们主要讨论第二种方式。

 

三、实现

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

[1] [2]  下一页


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台