数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

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


发布日期:2021年12月28日
 
PB打印机选择列表的分析与实现

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

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

通过对Windows X系统进行分析我们能够知道Windows的打印机的信息一般存放在注册表及Winini文件中这些信息分别位于系统注册表的HKEY_CURRENT_CONFIG\System\CurrentControlSet\

Control\Print\Printers下及winini的[windows]及[Devices]段下在注册表中每一个打印机在上面的目录下均有一个以打印机为名的主键条目Winini的[Devices]也一样在注册表上述目录下有default字符串值指示当前的默认打印机winini中的[windows]中device的值对也一样对应了当前的打印机笔者通过下面几个简单的试验判别出起决定作用的是winini文件而非注册表信息

试验一将注册表中上述目录的default的打印机值对改变为其它打印机再运行printsetup函数发现没有产生任何反应而将winini文件中的[windows]下的devices的值对改变一下(哪怕胡乱输入几字符)再运行printsetup打印机选择列表中立即体现出了相应的变化

试验二在注册表上述目录下添加一个主键运行printsetup没有发现打印机列表框中增加打印机而在winini文件的[Devices]下随便增加一个则printer setup窗口中立即增加了所输入的打印机

因此应从winini文件入手编制打印机选择下拉列表框

可是PowerBuilder提供了RegistryKeys能从注册表中某一主键下子所有主键条目的列表却没有提供任何函数从ini文件中取相似的信息当然我们可以自己编一个将winini文件内容一行一行地读入某字符串使之与[Device]进行匹配判断若是再继续向下读至某一行头一个字符为[的行并经过复杂的字符串处理以取得打印机列表(注纯PB开发下)但我们知道windows增加打印机有专门的程序而且该程序会自动地同时在注册表及winini文件中同时增加打印机因此我们可以这样入手从注册表中取得打印机的列表信息而从winini文件中取得及设置当前打印机信息这样一来问题就简单得多了

经过以上分析论证下面就开始做了根据一般做法我们会将该列表框封装成一个标谁的用户对象以后开发时只需在某窗体中调用这一用户对象就行了

步骤一新建一可视(visual)的标准(standard)的用户对象在Select Visual Standard Type对话框中选择DropDownListBox(下拉列表框)点击OK按钮进入设计画面

步骤二开始编程

定义两个实例变量

string is_windows_dirctoryis_winini_file

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

FUNCTION ulong GetWindowsDirectoryA(ref

string wdir ulong buf) LIBRARY kerneldll

定义两个函数

函数一ouf_get_windows_dirctory()

用途取windows目录

参数

返回值类型string

函数体

string ls_WindowsDirctory

ulong lu_Buf

lu_Buf =

ls_WindowsDirctory = Space()

GetWindowsDirectoryA(ls_WindowsDirctorylu_Buf)

return ls_WindowsDirctory

函数二ouf_get_printer()

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

参数

返回类型boolean

函数体

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

integer li_rtnli_ArrayUpli_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_printerls_tmp

int li_point

is_windows_dirctory = ouf_get_windows_dirctory ( )

is_winini_file = is_windows_dirctory + \winini

lb_PrinterExists = ouf_get_printer ( )

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

IF NOT lb_PrinterExists THEN

messagebox (提示!尚未安装打印机!)

ELSE

ls_tmp = profilestring (is_winini_file

windowsdevice) //取当前打印机信息

//由于winini信息中该信息还包括有其它参数如端口

因此必须进行截取处理

ls_tmp = trim (ls_tmp)

li_point = pos (ls_tmp)

ls_printer = left (ls_tmpli_point )

IF trim (ls_printer) <> AND NOT

IsNull (ls_printer) THEN

thistext = trim (ls_printer)

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

ELSE

selectitem ( )

END IF

END IF

在selectionchanged事件中输入

string ls_printer

ls_printer = profilestring

(is_winini_fileDevices

trim(thistext (index))) //从winini文件中取当前打印机完整信息(含端口及其它)

//在winini文件及注册表中更新当前打印机

setprofilestring (is_winini_filewindowsdevice

trim(thistext (index)) + +ls_printer)

RegistrySet( HKEY_CURRENT_CONFIG\System

\CurrentControlSet\Control\Print\Printers

Default trim(thistext))

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

               

上一篇:MSSQLSERVER中如何快速获取表的记录总数

下一篇:云数据库技术渐热 各厂商上演多方斗法