1、PB中数据窗口的精确页面打印技术窗口的精确页面打印技术1.引言自PowerBuild4.0问世以来,以其简洁高效的集成开发环境、强大的数据窗口技术、(几乎)无所不能的数据库访问能力,越来越受到编程人员的 青睐。据Sybase自己的统计,目前全球YOU60万程序员和系统分析人员在使用他们的Powerbuilder和S-designer,进行各种类型的应 用程序开发。最新发布的PowerBuilder6.0族系列开发工具,直接支持ActiveX技术、ServerPush技术,对分布式计算模型的定义 更加明确,实现更为简便,并可以利用数据窗口直接生成HTML格式文件,等等。所以,PowerBuild
2、er 已成为C/S模式应用和基于InterNet 模式应用的主要开发工具之 一。 数据窗口(DataWindow)是PowerBuilder的专利,也是PowerBuilder应用程序的核心和精华所在.PowerBuilder 通过丰富的属性和函数来控制数据窗口的显示和数据操纵,但对数据窗口的打印支持似乎过于简单,只YOU一个Print() 窗口函数和一个PrintDataWindowPowerScript函数,并且这两个函数的功能几乎都是一样,都只简单地将选定数据窗口原样送入打印队 列,本身 不具备页面控制功能。为此很多程序员抱怨这是PowerBuilder的一个缺陷,其实,PowerBui
3、lder对打印功能的支持一样十分周到全面,只 不过应用场合不同,需要用户自行加以选择。以下是对PowerBuilder打印控制功能的详尽分析,并介绍一个实用的数据窗口页面控制程序。2.Powerbuilder实现动态页面控制的途径PowerBuilder数据窗口YOU一对函数Describe 和Modify,用于动态描述和修改数据窗口结构,与其它相关函数结合可以完成动态生成数据窗口、任意改变数据窗口显示方式、修改打印属性等。这两个函数是控制与修改数据窗口的核心函数,其使用方法如下:1)Describe获取数据窗口特定属性值语法:dwcontrol.Describe(propertylist)参
4、数:dwcontrol数据窗口(或datastore)控 件名。propertylist用字符串表示的数据窗口属性。返回值:返回一个表示属性的字符串。数据窗口属性值也可以用dwcontrol.object.Datawindow.property来完成直接取得。2)Modify修改数据窗口特定属性语法:dwcontrol.Modify(modstring)参数:dwcontroldwcontrol数据窗口(或datastore)控 件名。modstring用字符串表示的数据窗口属性。返回值:如果函数执行成功返回“1”。与Describe类似, 修改数据窗口属性可以用:dwcontrol.obje
5、ct.Datawindow.property=value直 接赋值。3)与打印YOU关的数据窗口属性数据窗口属性中与打印YOU关的YOU24个,其中实现打印页面控制的几个属性是:Copies:打印份数。Filename:如果不为空,表示输出到文件的文件名。Orientation:打印方向1=横向,2=纵 向Page.Range:输出页范围,要打印1,2,和5到10 页,输入: 1,2,5-10。Page.RangeInclude:本 次打印范围,0=全部,1= 偶数页,2= 奇数页。Paper.Size:纸张大小。Scale:打印比例。程序中利用Modify函数设置好这些属性后,即可实现动态修
6、改数据窗口的目的,再调用datawindow.print()函数,完成最后的打印输出。一个通用Datawindow打印控制程序 将数据窗口中的报表在打印机上输出是PowerBuilder应用程序开发过程中必不可少的功能,作为例子,这里提供一个使用上述方法研制的通用打印控 制窗口,用以替代Prompt属性所提供的Print窗口,实现汉化界面,并且可被自行修改扩充。为了书写简单,程序中采用直接赋值的方式修改属性。实例变量:datawindowdw_printstringprintername,name,port窗口open 事件脚 本:dw_print=Message.PowerObjectPar
7、mprintername=dw_print.Object.Datawindow.Printername=left(printername,pos(printername,on)-1)port=right(printername,len(printername)-pos(printername,on)-1)plb_printername.additem(name,1)st_portname.text=port“设置” 按钮clicked事件脚本IntegercodeCode=printSetup()Ifcode=1thenprintername=dw_print.Object.Datawindo
8、w.Printername=left(printername,pos(printername,on)-1)port=right(printername,len(printername)-pos(printername,on)-1)plb_printername.additem(name,1)st_portname.text=portendif打印范围组中“全部”选择钮clicked事件 脚本dw_print.object.DataWindow.Print.Range=sle_1.enabled=falsesle_2.enabled=falsesle_3.enabled=false“页数” 栏后
9、sle_2单行文本编辑框Modified事件 脚本dw_print.object.DataWindow.Print.Page.Range=sle_1.text +-+sle_2.text“自定 义”栏后sle_3单行文 本编辑 框Modified事件脚本dw_print.object.DataWindow.Print.Page.Range=sle_3.text打印份数组中份数单行文本编辑框Modified事件脚本dw_print.Object.DataWindow.Print.Copies=integer(this.text)“全部” 选择钮Cliecked事件 脚本dw_print.Obje
10、ct.DataWindow.Print.Page.Rangeinclude =0“奇数” 选择钮Cliecked事件 脚本dw_print.Object.DataWindow.Print.Page.Rangeinclude =1“偶数” 选择钮Cliecked事件 脚本dw_print.Object.DataWindow.Print.Page.Rangeinclude =2“确认” 命令按 钮Clicked事件脚本longjobifIsValid(dw_print)thenjob=PrintOpen()PrintDataWindow(job,dw_print)PrintClose(job)cl
11、ose(parent)endif“取消” 命令按 钮Clicked事件脚本close(parent) 窗口调用方法:在其它带YOU数据窗口的窗口中,使用OpenWithParm(w_print_set,dwname) 即可,其中w_print_set为本窗口名,dwname为要打印的数据窗口。该程序是一个通用打印控制程序,可在任何版本的PowerBuilder 应用中使用。打印问题/PB中如何使用带孔打印纸 操作系统:win98 编程工具:pb70 问题:在pb中,数据窗口打印时,常常需要用带孔打印纸,我的办法是,在数据窗口的打印属性中选择“default(0)”,然后在打印机属性中,设置自定
12、义纸张(38002800),这才可能打印。在使用中,如果YOU窄行、宽行多种自定义纸张,就需要在多者之间选来选出,实在是麻烦。请问能否用命令去设置自定义纸张,而又不用去设置打印机属性,我现在一个项目只YOU这个问题,其他已经完成,很急用,在这里我万分感谢,!请帮帮我吧!请赐教? 水平: 中级 回答: s_w_y的意见: 数据对象窗口YOU此属性:dw_control.Object.DataWindow.Print.Paper.Size可以通过设置此属性来实现自定义打印纸张大小。 ZWD的意见: 我YOU一个很笨的办法不知是否可行。在打印机列表中增加一个打印机的多个驱动,分别设置各种自定义纸的大
13、小,在打印时只要选择打印机就可以了。 彭定友的意见: 请查看Datawindow相关的打印属性:dw_1.object.datawindow.print.property 如:dw_1.object.datawindow.print.copies=10 打印10份 dw_1.object.datawindow.print.Orientation=1 横向打印 dw_1.object.datawindow.print.Range=1,3-8,10 打印1,3,4,5,6,7,8,10页 dw_1.object.datawindow.print.paper.Size=x (0-33分别表示纸张大小
14、) dw_1.object.datawindow.print.preview=true 打印预览 dw_1.object.datawindow.print.Zoom=80% 缩小预览打印 dw_1.object.datawindow.print.Scale=2 改变实际打印比例 dw_1.object.datawindow.print.margin.top=50 改变打印至顶端距离 。 /PB如何控制打印指定某页或某几页 操作系统:Windows 98 oem 编程工具:PowerBuilder 6.0 问题:在PB开发应用软件中,能否像WORD打印那样控制打印指定某页,或某几页范围(因为打印
15、机问题等而打坏了某页,需要这样做)。在PFC中YOU这似YOU这样的对话框,但不知道怎样用。而且是之前我开发的PB程序中YOU的窗体名字与PFC库中的一样(若要改涉及许多问题),又怎样引用PFC库中的函数等。不胜感激 回答: dw_1.object.datawindow.print.page.range=1,3,5-10,15 /使用PRINTTEXT函数打印,如何设置打印字符的宽度 操作系统:windows、nt 编程工具:powerbuilder 问题:在使用PB中的PRINTTEXT函数打印,如何设置打印字符的宽度? 水平: 中级 回答: 用PrintDefineFont()设置。 /P
16、B在一些已YOU格式和文字的表单上打印 编程工具: powerbuilder 操作系统: windows98 初接触PB,想用它为朋友编一个表单的打印程序,即在一些已打印好格式和文字的表单上,打印相应数据。不知用PB好实现不,及如何实现?谢谢。 回答: 可以实现,用两个数据窗口(DataWindow),一个数据窗口用作数据输入,第二个数据窗口用作打印数据,第二个数据窗口在设置数据窗口各控件位置时要根据已经打印的表单位置放置,打印样张再重新设置,要多试几次。当第一个数据窗口输入完数据后,把数据复制到第二个数据窗口,然后用print()函数打印第二个数据窗口。 sulo_xxr的意见: 利用pri
17、nttext()、printsetspacing()、print()三个可以实现。建议你先弄清楚它们的用法之后可以方便实现。 /如何打印条形码 操作系统:win98 编程工具:PB6.5 问题:请教老师:如何在PB中打印条形码,条形码打印机如何驱动。拜托! 回答: 如果安装了Office2000,则在其Program FilesMicrosoft OfficeOfficeMsbcode9.ocx 及 Msbcode9.hlp条形码控件。 李海注:如果在目录中找不到该控件,说明安装的时候没YOU选择。可以再运行安装程序,并在Access 2000下找到Barcode控件项。安装后在Visual
18、Basic等软件中显示为Microsoft Barcode Control 9.0。Office97没YOU该控件,但Office XP中包括了这个控件,仍然为Msbcode9.ocx。 在PB7中,Insert - Control -OLE. 出现Insert Object对话框 选择Insert Control页 单击Register New 指定.officeMsbcode9.ocx 路径(或run: regsvr32 c:office2kofficeMsbcode9.ocx) (好象不重新注册不能在VB & PB. 中使) 代码: long Job Job = PrintOpen( )
19、 Ole_1.border=false ole_1.Print(Job, 500,1000) PrintClose(Job) Ole_1.border=true二PB打印机选择列表的分析与实现- Word的打印对话框中提供了一个选择打印机的下拉列表,但是我们在PowerBuilder编程中常用的是PrintSetup函数打开的 Printer Setup设置窗口,在该窗口中,我们可以在列表框中选择我们所要的打印机。然而很遗憾的是这个Printer Setup窗口是英文界面。对于我们开发的纯中文界面的应用程序,其中却YOU着这样一个很重要的然而却是英文界面的窗口,我想,大多数程序员都是不能容忍
20、的。PowerBuilder的打印控制是最难控制的,在网上见到的许多疑难问题大都与打印YOU关,但无论如何,我们的中文应用程序还是应该向用户提供这样 一个中文的打印机选择窗口。 - 做一个类Word的打印对话窗口并不复杂,PowerBuilder的example程序中YOU完整的做好的窗体,PFC中也YOU类似的内容。将上面的英文文 本及提示改为中文就行了。但该打印窗口没YOU提供象word一样的打印机选择下拉列表框。我们必须自己做一个。 - 通过对Windows 9X系统进行分析,我们能够知道Windows的打印机的信息一般存放在注册表及Win.ini文件中。这些信息分别位于系统注册表的HK
21、EY_CURRENT_CONFIGSystemCurrentControlSet ControlPrintPrinters下及win.ini的windows及Devices段下。在注册表中每一个打印机在上面的目录下 均YOU一个以打印机为名的主键条目,Win.ini的Devices也一样。在注册表上述目录下,YOUdefault字符串值指示当前的默认打印机; win.ini中的windows中device的值对也一样对应了当前的打印机。笔者通过下面几个简单的试验,判别出起决定作用的是win.ini 文件而非注册表信息。 - 试验一:将注册表中上述目录的default的打印机值对改变为其它打印机
22、,再运行printsetup函数,发现没YOU产生任何反应。而将win.ini 文件中的windows下的devices的值对改变一下(哪怕胡乱输入几字符),再运行printsetup,打印机选择列表中立即体现出了相应的 变化。 - 试验二:在注册表上述目录下添加一个主键,运行printsetup,没YOU发现打印机列表框中增加打印机,而在win.ini文件的Devices下随便增加一个,则printer setup窗口中立即增加了所输入的打印机。 - 因此,应从win.ini文件入手编制打印机选择下拉列表框。 - 可是,PowerBuilder提供了RegistryKeys能从注册表中某一主
23、键下子所YOU主键条目的列表,却没YOU提供任何函数从ini文件中取相似的 信息。当然,我们可以自己编一个,将win.ini文件内容一行一行地读入某字符串,使之与“Device”进行匹配判断,若是再继续向下读至某一行 头一个字符为“”的行并经过复杂的字符串处理以取得打印机列表(注:纯PB开发下)。但我们知道,windows增加打印机YOU专门的程序,而且,该程序 会自动地同时在注册表及win.ini文件中同时增加打印机。因此我们可以这样入手:从注册表中取得打印机的列表信息,而从win.ini文件中取得及设 置当前打印机信息。这样一来,问题就简单得多了。 - 经过以上分析论证,下面就开始做了。根
24、据一般做法,我们会将该列表框封装成一个标谁的用户对象,以后开发时,只需在某窗体中调用这一用户对象就行了。 - 步骤一:新建一可视(visual)的标准(standard)的用户对象,在Select Visual Standard Type对话框中选择DropDownListBox(下拉列表框),点击“OK”按钮进入设计画面。 - 步骤二:开始编程。 - 、定义两个实例变量 string is_windows_dirctory,is_winini_file 声明一API函数用以取windows目录 FUNCTION ulong GetWindowsDirectoryA(ref string wd
25、ir, ulong buf) LIBRARY kernel32.dll - 、定义两个函数: 函数一:ouf_get_windows_dirctory() 用途:取windows目录。 参数:无。 返回值类型:string。 函数体: string ls_WindowsDirctory ulong lu_Buf lu_Buf = 144 ls_WindowsDirctory = Space(144) GetWindowsDirectoryA(ls_WindowsDirctory,lu_Buf) return ls_WindowsDirctory 函数二:ouf_get_printer() 用途
26、:取打印机信息并增加至下拉列表框。 参数:无 返回类型:boolean 函数体: string ls_printer /定义一个字符串型数组 integer li_rtn,li_ArrayUp,li_step li_rtn = RegistryKeys(HKEY_LOCAL_MACHINESystem CurrentControlSetControlPrint Printers, ls_printer) /从注册表中取其列表 IF li_rtn = 1 THEN li_ArrayUp = UpperBound(ls_printer) /取列表数组上限 IF li_ArrayUp = 1 THE
27、N FOR li_step = 1 TO li_ArrayUp additem ( ls_Printerli_step ) /向下拉列表框中增加打印机 NEXT ELSE return false END IF ELSE return false END IF return true 3、在constructor事件下编写下列代码: boolean lb_PrinterExists string ls_printer,ls_tmp int li_point is_windows_dirctory = ouf_get_windows_dirctory ( ) is_winini_file = i
28、s_windows_dirctory + win.ini lb_PrinterExists = ouf_get_printer ( ) /向下拉列中增加打印机 IF NOT lb_PrinterExists THEN messagebox (提示!,尚未安装打印机!) ELSE ls_tmp = profilestring (is_winini_file, windows,device,) /取当前打印机信息 /由于win.ini信息中该信息还包括YOU其它参数如端口, 因此必须进行截取处理。 ls_tmp = trim (ls_tmp) li_point = pos (ls_tmp,1) l
29、s_printer = left (ls_tmp,li_point - 1) IF trim (ls_printer) AND NOT IsNull (ls_printer) THEN this.text = trim (ls_printer) /设置下拉列表框文本为当前打印机 ELSE selectitem ( 1 ) END IF END IF - 、在selectionchanged事件中输入: string ls_printer ls_printer = profilestring (is_winini_file,Devices, trim(this.text (index),) /从win.ini文件中取当 前打印机完整信息(含端口及其它) /在win.ini文件及注册表中更新当前打印机 setprofilestring (is_winini_file,windows,device, trim(this.text (index) + , +ls_printer) RegistrySet( HKEY_CURRENT_CONFIGSystem CurrentControlSetControlPrintPrinters, Default, trim(this.text) - 、最后保存该用户对象(如保存为nvo_ddlb_of_printer)即可。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1