知识大全 PB打印机选择列表的分析与实现

Posted

篇首语:登山则情满于山,观海则意溢于海。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 PB打印机选择列表的分析与实现相关的知识,希望对你有一定的参考价值。

PB打印机选择列表的分析与实现  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  Word的打印对话框中提供了一个选择打印机的下拉列表 但是我们在PowerBuilder编程中常用的是PrintSetup函数打开的Printer Setup设置窗口 在该窗口中 我们可以在列表框中选择我们所要的打印机 然而很遗憾的是这个Printer Setup窗口是英文界面 对于我们开发的纯中文界面的应用程序 其中却有着这样一个很重要的然而却是英文界面的窗口 我想 大多数程序员都是不能容忍的 PowerBuilder的打印控制是最难控制的 在网上见到的许多疑难问题大都与打印有关 但无论如何 我们的中文应用程序还是应该向用户提供这样一个中文的打印机选择窗口

  做一个类Word的打印对话窗口并不复杂 PowerBuilder的example程序中有完整的做好的窗体 PFC中也有类似的内容 将上面的英文文本及提示改为中文就行了 但该打印窗口没有提供象word一样的打印机选择下拉列表框 我们必须自己做一个

  通过对Windows X系统进行分析 我们能够知道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 kernel dll

  2 定义两个函数 函数一 ouf_get_windows_dirctory() 用途 取windows目录 参数 无 返回值类型 string 函数体 string ls_WindowsDirctory ulong lu_Buf

lu_Buf = ls_WindowsDirctory = Space( ) 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 = THEN li_ArrayUp = UpperBound(ls_printer) //取列表数组上限 IF li_ArrayUp >= THEN FOR li_step = TO li_ArrayUp additem ( ls_Printer[li_step] ) //向下拉列表框中增加打印机 NEXT ELSE return false END IF ELSE return false END IF return true

   在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 ) ls_printer = left (ls_tmp li_point ) IF trim (ls_printer) <> AND NOT IsNull (ls_printer) THEN this text = trim (ls_printer) //设置下拉列表框文本为当前打印机 ELSE selectitem ( ) 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))

cha138/Article/program/SQL/201311/16341

相关参考

知识大全 列表排序代码分析

Java编程技巧:列表排序代码分析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在JavaCo

知识大全 为PB的TreeView实现同步选择

为PB的TreeView实现同步选择  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  TreeVi

分析仪器选购注意事项有哪些?

  1、根据实际需求进行选购,产品的实用性格外重要,如测试分析仪器最好选择准确快速的,如果是用于来料检验,则最好选择能够打印测试报告的。如果是用于成品检验,那么仪器的权威性就很重要了。尽管专业性的仪器

分析仪器选购注意事项有哪些?

  1、根据实际需求进行选购,产品的实用性格外重要,如测试分析仪器最好选择准确快速的,如果是用于来料检验,则最好选择能够打印测试报告的。如果是用于成品检验,那么仪器的权威性就很重要了。尽管专业性的仪器

知识大全 如何把选择的文件图标显示在列表中

    ——此文章摘自《Delphi开发经验技巧宝典》定价¥ 特价¥购买>>//tracklinktechcn/?m_id=dangdang&

知识大全 PB中数据窗口的多表更新[1]

PB中数据窗口的多表更新[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  原理分析  数据窗

知识大全 php curl选项列表(超详细)

本篇文章是对php中的curl选项列表进行了详细的分析介绍需要的朋友参考下   第一类对于下面的这些option的可选参数value应该被设置一个bool类型的值选项可选value值备注CU

知识大全 Win32 API 与PB编程[1]

Win32API与PB编程[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  如何使PB窗口总

知识大全 Win32 API 与PB编程[2]

Win32API与PB编程[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  控制由Run运行

缴税业务对账不符挂账返还的流程是什么?

1、经办柜员查询“清算交易列表查询-对账不符差错挂账登记簿”中“已挂账”项目,并打印报表。  2、经办柜员逐笔选中挂账记录,逐笔查询出挂账明细,并把挂账明细打印在内部通用凭证上。  3、经办柜员根据打