明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

樹形目錄在PB中的完成與應(yīng)用

[摘要]摘要: 本文結(jié)合具體的實(shí)際應(yīng)用,介紹PB中實(shí)現(xiàn)樹形目錄的實(shí)現(xiàn)機(jī)制,并給出了具體的實(shí)現(xiàn)過程。  1.引言  在管理信息系統(tǒng)的開發(fā)中,經(jīng)常需要獲取本地計(jì)算機(jī)中的樹形目錄結(jié)構(gòu)和相應(yīng)的文件信息,如進(jìn)行目錄的選擇和特殊文件的選取,在PowerBuilder(簡稱PB)中并沒有提供專門的樹形目錄對(duì)象,這樣就需...
摘要: 本文結(jié)合具體的實(shí)際應(yīng)用,介紹PB中實(shí)現(xiàn)樹形目錄的實(shí)現(xiàn)機(jī)制,并給出了具體的實(shí)現(xiàn)過程。
  1.引言

  在管理信息系統(tǒng)的開發(fā)中,經(jīng)常需要獲取本地計(jì)算機(jī)中的樹形目錄結(jié)構(gòu)和相應(yīng)的文件信息,如進(jìn)行目錄的選擇和特殊文件的選取,在PowerBuilder(簡稱PB)中并沒有提供專門的樹形目錄對(duì)象,這樣就需要程序開發(fā)人員自己來實(shí)現(xiàn)相應(yīng)的樹形目錄。本文針對(duì)這種情況,提供了一種用純PB代碼實(shí)現(xiàn)樹形結(jié)構(gòu)的方法。

  2.PB中樹形目錄的實(shí)現(xiàn)方法

  PB中實(shí)現(xiàn)樹形目錄可以利用Windows本身的API函數(shù)SHBrowseForFolderA(包括在shell32.dll文件中),但該API函數(shù)只能顯示相應(yīng)的樹形目錄,不能顯示文件信息,而且用戶對(duì)它不能進(jìn)行靈活的控制。因此,如果需要進(jìn)行靈活控制,就需要程序人員自己編寫相應(yīng)代碼。

  PB中的ListBox列表框控件提供了顯示目錄和文件的能力。在程序中可以利用PB的樹形控件TreeView動(dòng)態(tài)生成樹形目錄結(jié)構(gòu)。我們使用ListBox控件的函數(shù)DirList來實(shí)現(xiàn),函數(shù)DirList以滿足條件的文件名填充列表框的列表項(xiàng),其使用方法如下:

listboxname.DirList(文件模式,文件類型)

  其中文件類型的值如下所示:

0 可讀/可寫文件2 隱含文件16 子目錄16384 驅(qū)動(dòng)器
1 只讀文件4 系統(tǒng)文件32歸檔文件32768除可讀/可寫外所有類型

  在程序中可將幾種類型的值相加以獲取相應(yīng)的文件或目錄信息。下面結(jié)合一個(gè)實(shí)例介紹樹形目錄的實(shí)現(xiàn)方法,程序界面如圖1所示。

圖1 樹形目錄實(shí)現(xiàn)的實(shí)例

  通過樹形目錄可以獲取計(jì)算機(jī)中的任意目錄,然后顯示需要顯示的文件(本例中顯示瀏覽器可以查看的文件類型:htm,html,swf,gif,jpg,txt等)。程序中主要使用的控件如下所示:

控件名類型說明
tv_dirTreeView 顯示樹形目錄
lb_file ListBox顯示相應(yīng)目錄中的文件
ole_dispMicrosoft Web瀏覽器控件對(duì)選定文件進(jìn)行瀏覽
lb_dirListBox顯示驅(qū)動(dòng)器信息
lb_nextListBox顯示當(dāng)前目錄下級(jí)目錄信息

  程序具體實(shí)現(xiàn)分成以下幾個(gè)步驟:

  第一步:在tv_dir的constructor事件中生成所有驅(qū)動(dòng)器信息,代碼如下:

//顯示所有驅(qū)動(dòng)器,并加入目錄樹中
treeviewitem ltvi_new
int li_count, i
String ls_DriverType
lb_dir.DirList("",16384)
li_count = lb_dir.totalitems()
IF li_count > 0 then
for i = 1 to li_count
ltvi_New.Label = lb_dir.Text(i)
ltvi_New.Data = i -1
ltvi_New.Children = TRUE
//根據(jù)驅(qū)動(dòng)器類型設(shè)置圖標(biāo)
ls_DriverType=uf_drivetype(lb_dir.Text(i))
//函數(shù)uf_drivetype用來獲取驅(qū)動(dòng)器類型,根據(jù)類型設(shè)置圖標(biāo)
Choose case ls_DriverType
case "REMOVABLE"
ltvi_New.PictureIndex = 5
ltvi_New.SelectedPictureIndex =5
CASE "FIXED"
ltvi_New.PictureIndex = 1
ltvi_New.SelectedPictureIndex =2
CASE "CDROM"
ltvi_New.PictureIndex = 6
ltvi_New.SelectedPictureIndex =6
END CHOOSE
This.InsertItemlast(0, ltvi_New)
next
This.selectitem(1)
End if

  第二步,在tv_dir的itempopulate事件中生成相應(yīng)目錄的下級(jí)目錄信息:

String ls_Driver,ls_Data
Int li_level,li_num,li_i,li_new_level
TreeViewItem ltvi_choose
treeviewitem ltvi_new,ltvi_parent
long ll_handle
//獲取當(dāng)前所選目錄
tv_dir.GetItem(handle,ltvi_choose)
li_Level = ltvi_Choose.Level
lb_dir.dirlist("",0)
//
IF li_level=1 Then //選擇目錄樹中的驅(qū)動(dòng)器
ls_Driver=Mid(ltvi_choose.label,3,1)
lb_dir.DirList(ls_Driver+":",16+32768) //顯示當(dāng)前目錄子目錄信息
li_num=lb_Dir.totalitems()
For li_i=1 to li_num
ls_Data=lb_dir.Text(li_i)
If Mid(ls_data,1,1)="[" Then
ltvi_New.Label =mid(ls_data,2,len(ls_data) -2 )
ltvi_New.Data = 1
LB_next.dirlist(ls_driver+":"+ltvi_New.Label,16+32768)
if lb_next.totalitems()>1 Then
ltvi_New.Children = TRUE
else
ltvi_New.Children = False
End if
ltvi_New.PictureIndex = 3
ltvi_New.SelectedPictureIndex =4
tv_dir.InsertItemlast(handle, ltvi_New)
End if
Next
End If

IF li_level>=2 Then //選擇目錄樹中的子目錄
ls_driver=uf_get_dir(li_level,tv_dir,handle,ltvi_choose.label)
lb_dir.DirList(ls_Driver,16+32768) //顯示當(dāng)前目錄子目錄信息
li_num=lb_Dir.totalitems()
For li_i=1 to li_num
ls_Data=lb_dir.Text(li_i)
If Mid(ls_data,1,1)="[" and mid(ls_data,2,2)<>".." Then
ltvi_New.Label =mid(ls_data,2,len(ls_data) -2 )
ltvi_New.Data = 1
LB_next.dirlist(ls_driver+""+ltvi_New.Label,16+32768)
if lb_next.totalitems()>1 Then
ltvi_New.Children = TRUE
else
ltvi_New.Children = False
End if
ltvi_New.PictureIndex = 3
ltvi_New.SelectedPictureIndex =4
tv_dir.InsertItemlast(handle, ltvi_New)
End if
Next
End If

  第三步:當(dāng)用戶單擊某一具體目錄時(shí),顯示該目錄中滿足條件的文件名,代碼如下:

//tv_dir中Click事件代碼
Int li_num,li_i,li_long,i
TreeViewItem ltvi_cur
String ls_dir,ls_data
String Filetype[8]
//設(shè)定需要顯示的文件類型
filetype[1]=".htm"
filetype[2]=".html"
filetype[4]=".swf"
filetype[5]=".gif"
filetype[6]=".jpg"
filetype[7]=".shtml"
filetype[8]=".txt"
li_long=8
this.GetItem(handle,ltvi_cur)
If ltvi_cur.level=1 then
 ls_dir=mid(ltvi_cur.Label,3,1)+":"
else
 ls_dir=uf_get_dir(ltvi_cur.level,this,handle,ltvi_cur.Label)
end if
is_dir=ls_dir
Lb_next.DirList(ls_dir+"*.*",0+1+2+4+32) //顯示所有文件
li_num=lb_Dir.totalitems()
lb_file.Reset()
//將指定文件顯示在列表框中
For li_i=1 to li_num
 ls_Data=lb_next.Text(li_i)
 For i=1 to li_long
  if match(lower(Right(ls_data,len(FileType[i]))),Filetype[i]) then lb_file.addItem(ls_data)
Next
Next

  第四步:在OLE控件中顯示所選文件的內(nèi)容,主要代碼如下:

//顯示文件內(nèi)容
String ls_filename
If len(is_dir)=3 Then
 ls_filename=is_dir+this.text(index)
Else
 ls_filename=is_dir+""+this.text(index)
End if
ole_disp.object.navigate(ls_filename)

  其中程序中使用的uf_get_dir為用戶自定義函數(shù),該函數(shù)用來獲取所選定目錄的完整路徑。

//用戶自定義函數(shù)
function string uf_get_dir (integer pi_level, treeview tv_dir, long handle, string ps_str);
 TreeViewItem ltvi_parent
 Int li_new_level
 Long ll_handle
 String ls_driver
 //找到當(dāng)前級(jí)別的上一級(jí)的信息
 ls_driver=ps_str
 li_new_level=pi_level
 ll_handle=handle
 do while li_new_level>1
  ll_handle=tv_dir.FindItem(ParentTreeItem!,ll_handle)
  tv_dir.GetItem(ll_handle,ltvi_parent)
  li_new_level=ltvi_parent.level
  if li_new_level=1 then
   ls_driver=Mid(ltvi_parent.label,3,1)+":"+ls_driver
  else
   ls_driver=ltvi_parent.label+""+ls_driver
  end if
 loop
 Return ls_driver

  3.結(jié)束語

  采用上文介紹的方法可實(shí)現(xiàn)了樹形目錄結(jié)構(gòu),如信息系統(tǒng)的數(shù)據(jù)備份中的目錄選擇、照片瀏覽選擇等,取得了較好的應(yīng)用效果。本文提到的方法在實(shí)際運(yùn)用可進(jìn)一步完善,如可將樹形目錄制作成PB中的用戶自定義對(duì)象,可方便地在各種地方使用。