PB打印機選擇下文的區分與完成
發表時間:2023-08-18 來源:明輝站整理相關軟件相關文章人氣:
[摘要]江蘇省姜堰市第五中學 李中華 ---- Word的打印對話框中提供了一個選擇打印機的下拉列表,但是我們在PowerBuilder編程中常用的是PrintSetup函數打開的Printer Setup...
江蘇省姜堰市第五中學 李中華
---- 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)即可。