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

 

一、引言 数据挖掘论坛

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

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的脚本程序。

数据挖掘交友

源程序请到程序员杂志频道下载.

数据挖掘论坛

[数据挖掘专家] [数据挖掘研究院] [数据挖掘论坛] [数据挖掘实验室]
上一篇:在DELPHI文本和图形的打印
下一篇:向word文档中输出表格及图形
最新评论共有 0 位网友发表了评论 , 查看所有评论
发表评论( 不能超过250字,需审核,请自觉遵守互联网相关政策法规。 )
匿名?
数据挖掘网站导航 数据挖掘论坛导航
  • 数据挖掘工具
  • 数据挖掘论坛
  • DataCruncher - Cognos
  • MineSet - MathSoft
  • Intelligent Miner - GainSmarts
  • Sqlserver - SAS - Clementine
  • CART - Weka - WizSoft
  • NeuroShell - ModelQuest
  • data mining tools - Darwin
  • 数据挖掘交友
  • 数据挖掘博客
  • 数据挖掘工具
  • 数据挖掘资源
  • 数据挖掘技术算法
  • 数据挖掘相关期刊、会议
  • 研究院联盟合作专区
  • 数据挖掘基础与相关技术
  • 数据挖掘厂商与就业
  • 数据挖掘研究者乐园
  • 知名厂商数据挖掘工具资料
  • 国内数据挖掘实验室
  • Foreign Data Mining Lab
  • 热点关注
  • GDI+简介
  • COM与DCOM的区别与联系
  • 使用Delphi解析XML 文档
  • 如何设置delphi/cbuilder/BDE/MSSQL
  • BORLAND在“迫害”程序员?
  • 将image的图片保存为JPG格式图片方法
  • InstallShieldExpressfordelphi制作安装程
  • Real Programmers Use Pascal
  • 关于在COM中使用可选参数的研究
  • TStrings的AddObject方法应用
  • 论坛最新话题
  • Foundations of Statistical Natural Langu
  • Game Theory meet Data Mining: A Recent P
  • System Building: How does it help or hin
  • 数据挖掘与Clementine培训
  • 新手报到
  • 求 SASEM 客户流失预测分析
  • 数据挖掘工程师/搜索研究院—北京——无线
  • 数据挖掘入门介绍(如何着手数据挖掘)
  • Information Overload Survey Results
  • The INEX 2005 Workshop on Element Retrie
  • 相关资讯
  • BORLAND在“迫害”程序员?
  • 李维:我的回忆和一些有趣的事(精彩绝伦)
  • 李维看.net和DELPHI6(含李维照片)
  • 《代码大全》电子版1.01发布了
  • Real Programmers Use Pascal
  • Kylix安装手记
  • Borland与Microsoft关于Delphi的对话
  • InstallShieldExpressfordelphi制作安装程
  • 关于在COM中使用可选参数的研究
  • msagent经典用法
  • 数据挖掘实验室资料
  • 数据挖掘博客地址
  • 数据挖掘实验室网站地址
  • Prepare for Medicare audits by using dat
  • 注册成为SAS用户与爱好者俱乐部会员
  • 水南梅
  • 明日烟
  • 新人报道
  • 下载
  • 厦门服务器托管,450元/月—0592-5177319 高
  • 买空间送域名--0592-5177319 高静