PB中数据窗口的精确页面打印技术.docx

上传人:b****5 文档编号:6605988 上传时间:2023-01-08 格式:DOCX 页数:10 大小:22.26KB
下载 相关 举报
PB中数据窗口的精确页面打印技术.docx_第1页
第1页 / 共10页
PB中数据窗口的精确页面打印技术.docx_第2页
第2页 / 共10页
PB中数据窗口的精确页面打印技术.docx_第3页
第3页 / 共10页
PB中数据窗口的精确页面打印技术.docx_第4页
第4页 / 共10页
PB中数据窗口的精确页面打印技术.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

PB中数据窗口的精确页面打印技术.docx

《PB中数据窗口的精确页面打印技术.docx》由会员分享,可在线阅读,更多相关《PB中数据窗口的精确页面打印技术.docx(10页珍藏版)》请在冰豆网上搜索。

PB中数据窗口的精确页面打印技术.docx

PB中数据窗口的精确页面打印技术

窗口的精确页面打印技术

 1.引言

 自PowerBuild4.0问世以来,以其简洁高效的集成开发环境、强大的数据窗口技术、(几乎)无所不能的数据库访问能力,越来越受到编程人员的青睐。

据Sybase自己的统计,目前全球YOU60万程序员和系统分析人员在使用他们的Powerbuilder和S-designer,进行各种类型的应用程序开发。

最新发布的PowerBuilder6.0族系列开发工具,直接支持ActiveX技术、ServerPush技术,对分布式计算模型的定义更加明确,实现更为简便,并可以利用数据窗口直接生成HTML格式文件,等等。

所以,PowerBuilder已成为C/S模式应用和基于InterNet模式应用的主要开发工具之一。

 数据窗口(DataWindow)是PowerBuilder的专利,也是PowerBuilder应用程序的核心和精华所在.PowerBuilder通过丰富的属性和函数来控制数据窗口的显示和数据操纵,但对数据窗口的打印支持似乎过于简单,只YOU一个Print()窗口函数和一个PrintDataWindowPowerScript函数,并且这两个函数的功能几乎都是一样,都只简单地将选定数据窗口原样送入打印队列,本身不具备页面控制功能。

为此很多程序员抱怨这是PowerBuilder的一个缺陷,其实,PowerBuilder对打印功能的支持一样十分周到全面,只不过应用场合不同,需要用户自行加以选择。

  以下是对PowerBuilder打印控制功能的详尽分析,并介绍一个实用的数据窗口页面控制程序。

  2.Powerbuilder实现动态页面控制的途径

  PowerBuilder数据窗口YOU一对函数Describe和Modify,用于动态描述和修改数据窗口结构,与其它相关函数结合可以完成动态生成数据窗口、任意改变数据窗口显示方式、修改打印属性等。

这两个函数是控制与修改数据窗口的核心函数,其使用方法如下:

  1)Describe获取数据窗口特定属性值

 语法:

dwcontrol.Describe(propertylist)

  参数:

dwcontrol数据窗口(或datastore)控件名。

  propertylist用字符串表示的数据窗口属性。

  返回值:

返回一个表示属性的字符串。

  数据窗口属性值也可以用dwcontrol.object.Datawindow.property来完成直接取得。

 2)Modify修改数据窗口特定属性

  语法:

dwcontrol.Modify(modstring)

  参数:

dwcontroldwcontrol数据窗口(或datastore)控件名。

  modstring用字符串表示的数据窗口属性。

  返回值:

如果函数执行成功返回“1”。

  与Describe类似,修改数据窗口属性可以用:

  dwcontrol.object.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函数设置好这些属性后,即可实现动态修改数据窗口的目的,再调用datawindow.print()函数,完成最后的打印输出。

  一个通用Datawindow打印控制程序

  将数据窗口中的报表在打印机上输出是PowerBuilder应用程序开发过程中必不可少的功能,作为例子,这里提供一个使用上述方法研制的通用打印控制窗口,用以替代Prompt属性所提供的Print窗口,实现汉化界面,并且可被自行修改扩充。

为了书写简单,程序中采用直接赋值的方式修改属性。

 实例变量:

datawindowdw_print

stringprintername,name,port

 窗口open事件脚本:

dw_print=Message.PowerObjectParm

printername=dw_print.Object.Datawindow.Printer

name=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事件脚本

Integercode

Code=printSetup()

Ifcode=1then

printername=dw_print.Object.Datawindow.Printer

name=left(printername,pos(printername,"on")-1)

port=right(printername,len(printername)-pos(printername,"on")-1)

plb_printername.additem(name,1)

st_portname.text=port

endif

  打印范围组中“全部”选择钮clicked事件脚本

dw_print.object.DataWindow.Print.Range=''

sle_1.enabled=false

sle_2.enabled=false

sle_3.enabled=false

“页数”栏后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.Object.DataWindow.Print.Page.Rangeinclude=0

  “奇数”选择钮Cliecked事件脚本

  dw_print.Object.DataWindow.Print.Page.Rangeinclude=1

  “偶数”选择钮Cliecked事件脚本

  dw_print.Object.DataWindow.Print.Page.Rangeinclude=2

  “确认”命令按钮Clicked事件脚本

longjob

ifIsValid(dw_print)then

job=PrintOpen()

PrintDataWindow(job,dw_print)

PrintClose(job)

close(parent)

endif

  “取消”命令按钮Clicked事件脚本

  close(parent)

  窗口调用方法:

在其它带YOU数据窗口的窗口中,使用OpenWithParm(w_print_set,dwname)即可,其中w_print_set为本窗口名,dwname为要打印的数据窗口。

该程序是一个通用打印控制程序,可在任何版本的PowerBuilder应用中使用。

打印问题

/PB中如何使用带孔打印纸

操作系统:

win98

编程工具:

pb70

问题:

在pb中,数据窗口打印时,常常需要用带孔打印纸,我的办法是,在数据窗口的打印属性中选择

“default(0)”,然后在打印机属性中,设置自定义纸张(3800×2800),这才可能打印。

在使用中,如果YOU

窄行、宽行多种自定义纸张,就需要在多者之间选来选出,实在是麻烦。

请问能否用命令去设置自定义

纸张,而又不用去设置打印机属性,我现在一个项目只YOU这个问题,其他已经完成,很急用,在这里我

万分感谢,!

请帮帮我吧!

请赐教?

水平:

中级

回答:

s_w_y的意见:

数据对象窗口YOU此属性:

dw_control.Object.DataWindow.Print.Paper.Size可以通过设置此属性来实现

自定义打印纸张大小。

ZWD的意见:

我YOU一个很笨的办法不知是否可行。

在打印机列表中增加一个打印机的多个驱动,分别设置各种自定义纸

的大小,在打印时只要选择打印机就可以了。

彭定友的意见:

请查看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分别表示纸张大小)

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如何控制打印指定某页或某几页

操作系统:

Windows98oem

编程工具:

PowerBuilder6.0

问题:

在PB开发应用软件中,能否像WORD打印那样控制打印指定某页,或某几页范围(因为打印机问题

等而打坏了某页,需要这样做)。

在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()设置。

//PB在一些已YOU格式和文字的表单上打印

编程工具:

powerbuilder

操作系统:

windows98

初接触PB,想用它为朋友编一个表单的打印程序,即在一些已打印好格式和文字的表单上,打印相应

数据。

不知用PB好实现不,及如何实现?

谢谢。

回答:

可以实现,用两个数据窗口(DataWindow),一个数据窗口用作数据输入,第二个数据窗口用作

打印数据,第二个数据窗口在设置数据窗口各控件位置时要根据已经打印的表单位置放置,打印样张再

重新设置,要多试几次。

当第一个数据窗口输入完数据后,把数据复制到第二个数据窗口,然后用

print()函数打印第二个数据窗口。

sulo_xxr的意见:

利用printtext()、printsetspacing()、print()三个可以实现。

建议你先弄清楚它们的用法之后可以

方便实现。

//如何打印条形码

操作系统:

win98

编程工具:

PB6.5

问题:

请教老师:

如何在PB中打印条形码,条形码打印机如何驱动。

拜托!

回答:

如果安装了Office2000,则在其ProgramFilesMicrosoftOfficeOfficeMsbcode9.ocx及Msbcode9.hlp

条形码控件。

李海注:

如果在目录中找不到该控件,说明安装的时候没YOU选择。

可以再运行安装程序,并在Access

2000下找到Barcode控件项。

安装后在VisualBasic等软件中显示为MicrosoftBarcodeControl9.0。

Office97没YOU该控件,但OfficeXP中包括了这个控件,仍然为Msbcode9.ocx。

在PB7中,Insert->Control->OLE...

出现InsertObject对话框选择InsertControl页单击RegisterNew指定..officeMsbcode9.ocx路径

(或run:

regsvr32c:

office2kofficeMsbcode9.ocx)(好象不重新注册不能在VB&PB...中使)

代码:

longJob

Job=PrintOpen()

Ole_1.border=false

ole_1.Print(Job,500,1000)

PrintClose(Job)

Ole_1.border=true

二PB打印机选择列表的分析与实现

----Word的打印对话框中提供了一个选择打印机的下拉列表,但是我们在PowerBuilder编程中常用的是PrintSetup函数打开的PrinterSetup设置窗口,在该窗口中,我们可以在列表框中选择我们所要的打印机。

然而很遗憾的是这个PrinterSetup窗口是英文界面。

对于我们开发的纯中文界面的应用程序,其中却YOU着这样一个很重要的然而却是英文界面的窗口,我想,大多数程序员都是不能容忍的。

PowerBuilder的打印控制是最难控制的,在网上见到的许多疑难问题大都与打印YOU关,但无论如何,我们的中文应用程序还是应该向用户提供这样一个中文的打印机选择窗口。

----做一个类Word的打印对话窗口并不复杂,PowerBuilder的example程序中YOU完整的做好的窗体,PFC中也YOU类似的内容。

将上面的英文文本及提示改为中文就行了。

但该打印窗口没YOU提供象word一样的打印机选择下拉列表框。

我们必须自己做一个。

----通过对Windows9X系统进行分析,我们能够知道Windows的打印机的信息一般存放在注册表及Win.ini文件中。

这些信息分别位于系统注册表的HKEY_CURRENT_CONFIG\System\CurrentControlSet\

Control\Print\Printers下及win.ini的[windows]及[Devices]段下。

在注册表中每一个打印机在上面的目录下均YOU一个以打印机为名的主键条目,Win.ini的[Devices]也一样。

在注册表上述目录下,YOUdefault字符串值指示当前的默认打印机;win.ini中的[windows]中device的值对也一样对应了当前的打印机。

笔者通过下面几个简单的试验,判别出起决定作用的是win.ini文件而非注册表信息。

----试验一:

将注册表中上述目录的default的打印机值对改变为其它打印机,再运行printsetup函数,发现没YOU产生任何反应。

而将win.ini文件中的[windows]下的devices的值对改变一下(哪怕胡乱输入几字符),再运行printsetup,打印机选择列表中立即体现出了相应的变化。

----试验二:

在注册表上述目录下添加一个主键,运行printsetup,没YOU发现打印机列表框中增加打印机,而在win.ini文件的[Devices]下随便增加一个,则printersetup窗口中立即增加了所输入的打印机。

----因此,应从win.ini文件入手编制打印机选择下拉列表框。

----可是,PowerBuilder提供了RegistryKeys能从注册表中某一主键下子所YOU主键条目的列表,却没YOU提供任何函数从ini文件中取相似的信息。

当然,我们可以自己编一个,将win.ini文件内容一行一行地读入某字符串,使之与“[Device]”进行匹配判断,若是再继续向下读至某一行头一个字符为“[”的行并经过复杂的字符串处理以取得打印机列表(注:

纯PB开发下)。

但我们知道,windows增加打印机YOU专门的程序,而且,该程序会自动地同时在注册表及win.ini文件中同时增加打印机。

因此我们可以这样入手:

从注册表中取得打印机的列表信息,而从win.ini文件中取得及设置当前打印机信息。

这样一来,问题就简单得多了。

----经过以上分析论证,下面就开始做了。

根据一般做法,我们会将该列表框封装成一个标谁的用户对象,以后开发时,只需在某窗体中调用这一用户对象就行了。

----步骤一:

新建一可视(visual)的标准(standard)的用户对象,在SelectVisualStandardType对话框中选择DropDownListBox(下拉列表框),点击“OK”按钮进入设计画面。

----步骤二:

开始编程。

----1、定义两个实例变量

stringis_windows_dirctory,is_winini_file

声明一API函数用以取windows目录

FUNCTIONulongGetWindowsDirectoryA(ref

stringwdir,ulongbuf)LIBRARY"kernel32.dll"

----2、定义两个函数:

函数一:

ouf_get_windows_dirctory()

用途:

取windows目录。

参数:

无。

返回值类型:

string。

函数体:

stringls_WindowsDirctory

ulonglu_Buf

lu_Buf=144

ls_WindowsDirctory=Space(144)

GetWindowsDirectoryA(ls_WindowsDirctory,lu_Buf)

returnls_WindowsDirctory

函数二:

ouf_get_printer()

用途:

取打印机信息并增加至下拉列表框。

参数:

返回类型:

boolean

函数体:

stringls_printer[]//定义一个字符串型数组

integerli_rtn,li_ArrayUp,li_step

li_rtn=RegistryKeys("HKEY_LOCAL_MACHINE\System

\CurrentControlSet\Control\Print\

Printers",ls_printer)//从注册表中取其列表

IFli_rtn=1THEN

li_ArrayUp=UpperBound(ls_printer)

//取列表数组上限

IFli_ArrayUp>=1THEN

FORli_step=1TOli_ArrayUp

additem(ls_Printer[li_step])

//向下拉列表框中增加打印机

NEXT

ELSE

returnfalse

ENDIF

ELSE

returnfalse

ENDIF

returntrue

3、在constructor事件下编写下列代码:

booleanlb_PrinterExists

stringls_printer,ls_tmp

intli_point

is_windows_dirctory=ouf_get_windows_dirctory()

is_winini_file=is_windows_dirctory+"\win.ini"

lb_PrinterExists=ouf_get_printer()

//向下拉列中增加打印机

IFNOTlb_PrinterExistsTHEN

messagebox("提示!

","尚未安装打印机!

")

ELSE

ls_tmp=profilestring(is_winini_file,

"windows","device","")//取当前打印机信息

//由于win.ini信息中该信息还包括YOU其它参数如端口,

因此必须进行截取处理。

ls_tmp=trim(ls_tmp)

li_point=pos(ls_tmp,",",1)

ls_printer=left(ls_tmp,li_point-1)

IFtrim(ls_printer)<>""ANDNOT

IsNull(ls_printer)THEN

this.text=trim(ls_printer)

//设置下拉列表框文本为当前打印机

ELSE

selectitem

(1)

ENDIF

ENDIF

----4、在selectionchanged事件中输入:

stringls_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_CONFIG\System

\CurrentControlSet\Control\Print\Printers",

"Default",trim(this.text))

----5、最后保存该用户对象(如保存为nvo_ddlb_of_printer)即可。

<

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1