PB打印機(jī)選擇下文的區(qū)分與完成
發(fā)表時(shí)間:2023-08-18 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]江蘇省姜堰市第五中學(xué) 李中華 ---- Word的打印對(duì)話框中提供了一個(gè)選擇打印機(jī)的下拉列表,但是我們?cè)赑owerBuilder編程中常用的是PrintSetup函數(shù)打開的Printer Setup...
江蘇省姜堰市第五中學(xué) 李中華
---- Word的打印對(duì)話框中提供了一個(gè)選擇打印機(jī)的下拉列表,但是我們?cè)赑owerBuilder編程中常用的是PrintSetup函數(shù)打開的Printer Setup設(shè)置窗口,在該窗口中,我們可以在列表框中選擇我們所要的打印機(jī)。然而很遺憾的是這個(gè)Printer Setup窗口是英文界面。對(duì)于我們開發(fā)的純中文界面的應(yīng)用程序,其中卻有著這樣一個(gè)很重要的然而卻是英文界面的窗口,我想,大多數(shù)程序員都是不能容忍的。PowerBuilder的打印控制是最難控制的,在網(wǎng)上見到的許多疑難問題大都與打印有關(guān),但無論如何,我們的中文應(yīng)用程序還是應(yīng)該向用戶提供這樣一個(gè)中文的打印機(jī)選擇窗口。
---- 做一個(gè)類Word的打印對(duì)話窗口并不復(fù)雜,PowerBuilder的example程序中有完整的做好的窗體,PFC中也有類似的內(nèi)容。將上面的英文文本及提示改為中文就行了。但該打印窗口沒有提供象word一樣的打印機(jī)選擇下拉列表框。我們必須自己做一個(gè)。
---- 通過對(duì)Windows 9X系統(tǒng)進(jìn)行分析,我們能夠知道Windows的打印機(jī)的信息一般存放在注冊(cè)表及Win.ini文件中。這些信息分別位于系統(tǒng)注冊(cè)表的HKEY_CURRENT_CONFIG\System\CurrentControlSet\
Control\Print\Printers下及win.ini的[windows]及[Devices]段下。在注冊(cè)表中每一個(gè)打印機(jī)在上面的目錄下均有一個(gè)以打印機(jī)為名的主鍵條目,Win.ini的[Devices]也一樣。在注冊(cè)表上述目錄下,有default字符串值指示當(dāng)前的默認(rèn)打印機(jī);win.ini中的[windows]中device的值對(duì)也一樣對(duì)應(yīng)了當(dāng)前的打印機(jī)。筆者通過下面幾個(gè)簡(jiǎn)單的試驗(yàn),判別出起決定作用的是win.ini文件而非注冊(cè)表信息。
---- 試驗(yàn)一:將注冊(cè)表中上述目錄的default的打印機(jī)值對(duì)改變?yōu)槠渌蛴C(jī),再運(yùn)行printsetup函數(shù),發(fā)現(xiàn)沒有產(chǎn)生任何反應(yīng)。而將win.ini文件中的[windows]下的devices的值對(duì)改變一下(哪怕胡亂輸入幾字符),再運(yùn)行printsetup,打印機(jī)選擇列表中立即體現(xiàn)出了相應(yīng)的變化。
---- 試驗(yàn)二:在注冊(cè)表上述目錄下添加一個(gè)主鍵,運(yùn)行printsetup,沒有發(fā)現(xiàn)打印機(jī)列表框中增加打印機(jī),而在win.ini文件的[Devices]下隨便增加一個(gè),則printer setup窗口中立即增加了所輸入的打印機(jī)。
---- 因此,應(yīng)從win.ini文件入手編制打印機(jī)選擇下拉列表框。
---- 可是,PowerBuilder提供了RegistryKeys能從注冊(cè)表中某一主鍵下子所有主鍵條目的列表,卻沒有提供任何函數(shù)從ini文件中取相似的信息。當(dāng)然,我們可以自己編一個(gè),將win.ini文件內(nèi)容一行一行地讀入某字符串,使之與“[Device]”進(jìn)行匹配判斷,若是再繼續(xù)向下讀至某一行頭一個(gè)字符為“[”的行并經(jīng)過復(fù)雜的字符串處理以取得打印機(jī)列表(注:純PB開發(fā)下)。但我們知道,windows增加打印機(jī)有專門的程序,而且,該程序會(huì)自動(dòng)地同時(shí)在注冊(cè)表及win.ini文件中同時(shí)增加打印機(jī)。因此我們可以這樣入手:從注冊(cè)表中取得打印機(jī)的列表信息,而從win.ini文件中取得及設(shè)置當(dāng)前打印機(jī)信息。這樣一來,問題就簡(jiǎn)單得多了。
---- 經(jīng)過以上分析論證,下面就開始做了。根據(jù)一般做法,我們會(huì)將該列表框封裝成一個(gè)標(biāo)誰的用戶對(duì)象,以后開發(fā)時(shí),只需在某窗體中調(diào)用這一用戶對(duì)象就行了。
---- 步驟一:新建一可視(visual)的標(biāo)準(zhǔn)(standard)的用戶對(duì)象,在Select Visual Standard Type對(duì)話框中選擇DropDownListBox(下拉列表框),點(diǎn)擊“OK”按鈕進(jìn)入設(shè)計(jì)畫面。
---- 步驟二:開始編程。
---- 1、定義兩個(gè)實(shí)例變量
string is_windows_dirctory,is_winini_file
聲明一API函數(shù)用以取windows目錄
FUNCTION ulong GetWindowsDirectoryA(ref
string wdir, ulong buf) LIBRARY "kernel32.dll"
---- 2、定義兩個(gè)函數(shù):
函數(shù)一:ouf_get_windows_dirctory()
用途:取windows目錄。
參數(shù):無。
返回值類型:string。
函數(shù)體:
string ls_WindowsDirctory
ulong lu_Buf
lu_Buf = 144
ls_WindowsDirctory = Space(144)
GetWindowsDirectoryA(ls_WindowsDirctory,lu_Buf)
return ls_WindowsDirctory
函數(shù)二:ouf_get_printer()
用途:取打印機(jī)信息并增加至下拉列表框。
參數(shù):無
返回類型:boolean
函數(shù)體:
string ls_printer[] //定義一個(gè)字符串型數(shù)組
integer li_rtn,li_ArrayUp,li_step
li_rtn = RegistryKeys("HKEY_LOCAL_MACHINE\System
\CurrentControlSet\Control\Print\
Printers", ls_printer) //從注冊(cè)表中取其列表
IF li_rtn = 1 THEN
li_ArrayUp = UpperBound(ls_printer)
//取列表數(shù)組上限
IF li_ArrayUp >= 1 THEN
FOR li_step = 1 TO li_ArrayUp
additem ( ls_Printer[li_step] )
//向下拉列表框中增加打印機(jī)
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 ( )
//向下拉列中增加打印機(jī)
IF NOT lb_PrinterExists THEN
messagebox ("提示!","尚未安裝打印機(jī)!")
ELSE
ls_tmp = profilestring (is_winini_file,
"windows","device","") //取當(dāng)前打印機(jī)信息
//由于win.ini信息中該信息還包括有其它參數(shù)如端口,
因此必須進(jìn)行截取處理。
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)
//設(shè)置下拉列表框文本為當(dāng)前打印機(jī)
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文件中取當(dāng)
前打印機(jī)完整信息(含端口及其它)
//在win.ini文件及注冊(cè)表中更新當(dāng)前打印機(jī)
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、最后保存該用戶對(duì)象(如保存為nvo_ddlb_of_printer)即可。