前往Shuct.Net首页

Shudepb PB反编译专家长时间以来,为业内同类软件事实上的唯一选择.细节,彰显专业.态度,决定品质.

关于PowerBuilder的搜索

pb中怎样设置打印自定义纸张(在线等待.......)谢谢-CSDN论坛-CSDN.NET-中国最大的IT技术社区 --> 首页 论坛帮助 论坛牛人 论坛地图 CSDN > CSDN论坛 > PowerBuilder > 基础类 管理菜单 置顶 推荐 锁定 移动 编辑 删除 帖子加分 帖子高亮 结帖 发帖 回复 t_xz pb中怎样设置打印自定义纸张(在线等待.......)谢谢 [问题点数:20分,结帖人t_xz] 不显示删除回复 显示所有回复 显示星级回复 显示得分回复 只显示楼主 收藏 t_xz t_xz 等级: 结帖率:100% 楼主 发表于: 2002-11-19 14:03:13 如上 更多 分享到: 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 回复次数:2 djniulihao djniulihao 等级: 结帖率:100% #1 得分:10 回复于: 2002-11-19 14:41:46 PB打印机选择列表的分析与实现 ---- Word的打印对话框中提供了一个选择打印机的下拉列表,但是我们在PowerBuilder编程中常用的是PrintSetup函数打开的Printer Setup设置窗口,在该窗口中,我们可以在列表框中选择我们所要的打印机。然而很遗憾的是这个Printer Setup窗口是英文界面。对于我们开发的纯中文界面的应用程序,其中却有着这样一个很重要的然而却是英文界面的窗口,我想,大多数程序员都是不能容忍的。PowerBuilder的打印控制是最难控制的,在网上见到的许多疑难问题大都与打印有关,但无论如何,我们的中文应用程序还是应该向用户提供这样一个中文的打印机选择窗口。 ---- 做一个类Word的打印对话窗口并不复杂,PowerBuilder的example程序中有完整的做好的窗体,PFC中也有类似的内容。将上面的英文文本及提示改为中文就行了。但该打印窗口没有提供象word一样的打印机选择下拉列表框。我们必须自己做一个。 ---- 通过对Windows 9X系统进行分析,我们能够知道Windows的打印机的信息一般存放在注册表及Win.ini文件中。这些信息分别位于系统注册表的HKEY_CURRENT_CONFIG\System\CurrentControlSet\ Control\Print\Printers下及win.ini的[windows]及[Devices]段下。在注册表中每一个打印机在上面的目录下均有一个以打印机为名的主键条目,Win.ini的[Devices]也一样。在注册表上述目录下,有default字符串值指示当前的默认打印机;win.ini中的[windows]中device的值对也一样对应了当前的打印机。笔者通过下面几个简单的试验,判别出起决定作用的是win.ini文件而非注册表信息。 ---- 试验一:将注册表中上述目录的default的打印机值对改变为其它打印机,再运行printsetup函数,发现没有产生任何反应。而将win.ini文件中的[windows]下的devices的值对改变一下(哪怕胡乱输入几字符),再运行printsetup,打印机选择列表中立即体现出了相应的变化。 ---- 试验二:在注册表上述目录下添加一个主键,运行printsetup,没有发现打印机列表框中增加打印机,而在win.ini文件的[Devices]下随便增加一个,则printer setup窗口中立即增加了所输入的打印机。 ---- 因此,应从win.ini文件入手编制打印机选择下拉列表框。 ---- 可是,PowerBuilder提供了RegistryKeys能从注册表中某一主键下子所有主键条目的列表,却没有提供任何函数从ini文件中取相似的信息。当然,我们可以自己编一个,将win.ini文件内容一行一行地读入某字符串,使之与“[Device]”进行匹配判断,若是再继续向下读至某一行头一个字符为“[”的行并经过复杂的字符串处理以取得打印机列表(注:纯PB开发下)。但我们知道,windows增加打印机有专门的程序,而且,该程序会自动地同时在注册表及win.ini文件中同时增加打印机。因此我们可以这样入手:从注册表中取得打印机的列表信息,而从win.ini文件中取得及设置当前打印机信息。这样一来,问题就简单得多了。 ---- 经过以上分析论证,下面就开始做了。根据一般做法,我们会将该列表框封装成一个标谁的用户对象,以后开发时,只需在某窗体中调用这一用户对象就行了。 ---- 步骤一:新建一可视(visual)的标准(standard)的用户对象,在Select Visual Standard Type对话框中选择DropDownListBox(下拉列表框),点击“OK”按钮进入设计画面。 ---- 步骤二:开始编程。 ---- 1、定义两个实例变量 string is_windows_dirctory,is_winini_file 声明一API函数用以取windows目录 FUNCTION ulong GetWindowsDirectoryA(ref string wdir, ulong buf) LIBRARY "kernel32.dll" ---- 2、定义两个函数: 函数一: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() 用途:取打印机信息并增加至下拉列表框。 参数:无 返回类型:boolean 函数体: string ls_printer[] //定义一个字符串型数组 integer li_rtn,li_ArrayUp,li_step li_rtn = RegistryKeys("HKEY_LOCAL_MACHINE\System \CurrentControlSet\Control\Print\ Printers", ls_printer) //从注册表中取其列表 IF li_rtn = 1 THEN li_ArrayUp = UpperBound(ls_printer) //取列表数组上限 IF li_ArrayUp >= 1 THEN FOR li_step = 1 TO li_ArrayUp additem ( ls_Printer[li_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 = is_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信息中该信息还包括有其它参数如端口, 因此必须进行截取处理。 ls_tmp = trim (ls_tmp) li_point = pos (ls_tmp,",",1) ls_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 ---- 4、在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_CONFIG\System \CurrentControlSet\Control\Print\Printers", "Default", trim(this.text)) ---- 5、最后保存该用户对象(如保存为nvo_ddlb_of_printer)即可。 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 balloonman2002 balloonman2002 等级: 结帖率:97.37% 833 #2 得分:10 回复于: 2002-11-19 16:23:16 见: http://pbhome.net/bbs/bbs.asp?titleid=935&forumid=1 http://pbhome.net/bbs/bbs.asp?titleid=855&forumid=1 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 --> --> --> --> --> --> 管理菜单 置顶 推荐 锁定 移动 编辑 删除 帖子加分 帖子高亮 结帖 发帖 回复 写出你眼中的IE11 赢取新年好礼! 勇敢写出你的爱 赢莫文蔚签名大礼 2014年4月微软MVP申请开始了! 陈勇- 敏捷开发现状及发展之路 CSDN高校俱乐部 高校全新改版邀你来学习和挑战 本帖子已过去太久远了,不再提供回复功能。 核心技术类目 全部主题 Java VPN Android iOS ERP IE10 Eclipse CRM JavaScript Ubuntu NFC WAP jQuery 数据库 BI HTML5 Spring Apache Hadoop .NET API HTML SDK IIS Fedora XML LBS Unity Splashtop UML components Windows Mobile Rails QEMU KDE Cassandra CloudStack FTC coremail OPhone CouchBase 云计算 iOS6 Rackspace [关闭] [关闭]