自定义打印纸长度的问题

nlock 2003-08-25 11:59:37
每次收款时明细表中的项目条数都不同,准备在打印到每次定义的纸张的长度时停止。
我用的打印机型号是“STAR AR-3200II”打印纸用的是连续纸。
请各位大虾指教!
...全文
340 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
bkqdd 2003-08-29
  • 打赏
  • 举报
回复
我也遇到同样的问题,你如果解决了,请与我联系daixianrong@163.net,谢谢!
我看到另外的思路,你可以参考,看能否解决这个问题



摘 要: 一种动态设置打印机参数的方法。在程序中运用此方法,用户在打印时只需在打印机中放入合适的纸张,而不用考虑打印机的设置。
关键词: 打印机 注册表 动态设置

1 问题的提出

  在许多应用系统中,常常需要打印各式各样的票据和报表,它们经常是没有统一的格式,所需的打印纸也就大小不一,有的甚至有专用的格式。因此,如果我们不对打印机的设置进行有效的控制,就要求用户在运行这些系统时不断地更改打印机设置,以适应系统的需要。一般情况下,用户会觉得用这样的软件很麻烦,并且经常会出现错误。一种比较简单的解决办法就是对同一台物理打印机在WINDOWS中安装几台逻辑打印机,每台逻辑打印机对应一种票据或报表格式,在打印某一票据或报表时就选择与之对应的逻辑打印机。这种方法的缺点是每次打印时还要去选择1个逻辑打印机,增加了操作人员的操作步骤。基于此,本文给出了一种比较自动和通用的解决方法。运用此方法开发打印程序,打印时用户只需往打印机中加入适当的纸张即可打印出正确的报表。

2 动态设置打印机

  在WINDOWS 95环境下,与计算机设置有关的信息全部记录在注册表(REGISTRY)中。WINDOWS 95在用到某一设备或程序时,它就到注册表中取出有关这一设备或程序的设置信息。当增加1台设备时,WINDOWS 95就会在注册表中增加相应的项目;当修改某一设备的设置时,WINDOWS 95也会对有关这一设备的注册项目进行修改。所以我们可以通过动态修改注册表中的有关打印机设置的信息来达到动态设置打印机的目的。
  经研究发现,与打印机有关的主要设置有二项,其中第1项为当前默认打印机,其注册表入口为:HKEY_LOCAL_MACHINE\Config\0001\System\CurrentControlSet\Control\Print\Printers,设置值存放在default项中的字符串,即我们可以通过这一注册表的这一分支的default项得到WINDOWS的当前默认打印机。第2项为打印纸设置有关的项目,其注册表入口为:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Print\Printers\SETPRINTER,其中的SETPRINTER要替换为你所安装的打印机的名字,如Epson LQ-1600K等,这一分支有许多个项,最关键的项(也是与打印纸张设置有关的项)是Default DevMode,此项的设置值为1个二进制串,其中主要的几个参数的偏移地址和意义见表1。

表1 打印机参数表

设置项目 偏移量 字节数 说明
纸张设置 0x2F 2 打印机纸张类型,256为用户自定义纸张,小于256的数值为该打印机能打印的标准纸张的编号,随打印机类型改变。
纸张长度 0x31 2 当纸张设置为256(即用户自定义纸张)时才有用,意义为要设置的打印纸的长度(以0.1毫米为单位)。
纸张宽度 0x33 2 当纸张设置为256(即用户自定义纸张)时才有用,意义为要设置的打印纸的宽度(以0.1毫米为单位)。
打印方向 0x2D 2 0x01-纵向打印,0x02-横向打印。
进纸方式 0x39 2 0x04-手动送纸,0x08-传纸器。

下面我们给出这种动态设置方法在PowerBuilder(PB)中的实现方法。在PB中我们可以定义2个全局函数:gf_PrnSetting(),gf_PrnSettingBack()。具体应用时,可以用第1个函数将打印设置为我们需要的状态,并将打印机的原状态保存起来,再用第2个函数将打印机状态恢复。这2个函数的具体实现如下所示。
//函数功能:用自定义参数设置打印机
//输入参数:al_Lengn-打印纸长度,al_Width-打印纸宽度
//     ai_PaperSource-进纸方式,ai_PrintDirection-
//打印方向输出参数:ablb_setvalue-打印机的原参数
//返回值:1-成功,0-不成功
Gf_PrnSetting(long al_Lengh,long al_Width,int ai_PaperSource,int ai_PrintDirection,blob ablb_setvalue)
constant string cls_valuename=″Default DevMode″
constant uint clu_pos_width=51
constant uint clu_pos_length=49
constant uint clu_pos_papersize=47
constant uint clu_pos_papersource=57
constant uint clu_pos_printdirection=45
constant uint clu_usersizepaper=256
blob lb_value,newvalue
string ls_key,ls_printer
int li_ret
li ret=RegistryGet(″HKEY_LOCAL_MACHINE\Config\0001\
        System\CurrentControlSet″+&″\Control\Print\
        Printers″,′default′,RegString!,ls_printer)
IF li_ret<>1 THEN
  MESSAGEBOX(″系统提示″,″打印机未设置!″,Excla- mation!)
  RETURN 0
END IF
ls_key=″HKEY_LOCAL_MACHINE\System\CurrentControlSet\
     control\Print\Printers\″+ls_printer
RegistryGet(is_key,cls_valuename,RegBinary!,lb_value)
ablb_setvalue=lb_value
lb_newvalue=blobmid(lb_value,1,clu_pos_papersize-1)+
       blobmid(lb_value,clu_pos_width+2)
blobedit(lb_newvalue,clu_pos_papersize,clu_usersizepaper)
blobedit(lb_newvalue,clu_pos_length,al_Length)
blobedit(lb_newvalue,clu_pos_width,al_Width)
lb_value=lb_newvalue
lb_newvalue=blobmid(lb_value,1,clu_pos_papersource-1)
       +blobmid(lb_value,clu_pos_papersource+1)+
       & blobmid(lb_value,1,clu_pos_printdirec-
       tion-1)+blobmid(lb_value,clu_pos_printdi-
       rection+1)
blobedit(lb_newvalue,clu_pos_papersource,ai_papersource)
blobedit(lb_newvalue,clu_pos_printdirection,ai_printdirection)
ls_key=″HKEY_LOCAL_MACHINE\System\CurrentControlSet\
     Control\Printers\″+ls_printer
li_ret=RegistrySet(ls_key,cls_valuename,RegBinary!,lb_newvalue)
IF ii_r<>1 THEN
  MESSAGEBOX(″系统提示″,″打印机设置失败!″,Exclamation!)
  RETURN 0
END IF
RETURN 1
//函数功能:恢复原打印机设置
//输入参数:ablb_setvalue-打印机原设置串
//输出参数:无
//返回值:1-成功,0-不成功
Gf_PrnSettingBack(blob ablb_setvalue)
int li_ret
string ls_printer,ls_key
constant string cls_valuename=″Default DevMode″
li_ret=RegistryGet(″HKEY_LOCAL_MACHINE\Config\0001\
     System\CurrentControlSet″+&″\Control\Print-
     ers″,′default′,RegString!,ls_printer)
IF li_ret<>1 THEN
  MESSAGEBOX(″系统提示″,″打印机未设置!″, Exclamation!)
  RETURN 0
END IF
ls_key=″HKEY_LOCAL_MACHINE\System\CurrentControlSet\
     Control\Print\Printers\″+ls_printer
li_ret=RegistrySet(ls_key,cls_valuename,RegBinary!,
     lb_newvalue)
if li_ret<>1 then return 0
return 1

  本文所提供的程序在1台内装WINDOWS 95操作系统的PentiumⅡ266计算机上用PowerBuilder 6.0和Epson LQ-1600K打印机调试通过,并在我们开发的MRP/ERP系统中得到应用,效果良好。对于其它开发工具及其它打印机型号,其实现方法和上面给出的相类似。

铁治欣(杭州浙江大学计算机科学与工程系310027)
陈奇(杭州浙江大学计算机科学与工程系310027)
俞瑞钊(杭州浙江大学计算机科学与工程系310027)

收稿日期:1999-07-21




首页 - 关于泡吧 - 加盟机会 - 广告服务 - 版权声明 - 您请留言

nlock 2003-08-26
  • 打赏
  • 举报
回复
我是想自定义纸张长度,并不是数据窗口
incats 2003-08-26
  • 打赏
  • 举报
回复
更正:
pagecount = dw_1.rowcount() / perpage
incats 2003-08-26
  • 打赏
  • 举报
回复
可以.
1. 增加一计算列(不显示), 让其=getrow()
2. 假设自定义的纸张要求每页打印10条记录或5条记录

perpage = 10
pagecount = dw_1.rowcount() / pagecount
if pagecount <> round(pagecount) then pagecount ++

for pageindex = 1 to pagecount
dw_1. SetFilter(某列 属于 [ (pageindex - 1) * perpage])
dw_1. Print()
next
qiyousyc 2003-08-26
  • 打赏
  • 举报
回复
用数据窗口可以实现自定义纸张,但你可能计算不出数据窗口的长度。
利用PrintText函数实现dos打印。
nlock 2003-08-26
  • 打赏
  • 举报
回复
没人能够解决吗?
nlock 2003-08-25
  • 打赏
  • 举报
回复
不行呀!
xisat 2003-08-25
  • 打赏
  • 举报
回复
http://www.pdriver.com/display.asp?key_id=1537
看看有用吗?
nlock 2003-08-25
  • 打赏
  • 举报
回复
说详细点好吗?
如果用数据窗口就不能实现自定义纸张吗?
qiyousyc 2003-08-25
  • 打赏
  • 举报
回复
收款的打印是不用数据窗口的,是直接利用行模式发送到打印机的(就是dos打印)。

609

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder DataWindow
社区管理员
  • DataWindow社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧