樹形目錄在PB中的完成與應(yīng)用 發(fā)表時間:2024-05-16 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣: [摘要]摘要: 本文結(jié)合具體的實際應(yīng)用,介紹PB中實現(xiàn)樹形目錄的實現(xiàn)機制,并給出了具體的實現(xiàn)過程! 1.引言 在管理信息系統(tǒng)的開發(fā)中,經(jīng)常需要獲取本地計算機中的樹形目錄結(jié)構(gòu)和相應(yīng)的文件信息,如進行目錄的選擇和特殊文件的選取,在PowerBuilder(簡稱PB)中并沒有提供專門的樹形目錄對象,這樣就需... 摘要: 本文結(jié)合具體的實際應(yīng)用,介紹PB中實現(xiàn)樹形目錄的實現(xiàn)機制,并給出了具體的實現(xiàn)過程。 1.引言 在管理信息系統(tǒng)的開發(fā)中,經(jīng)常需要獲取本地計算機中的樹形目錄結(jié)構(gòu)和相應(yīng)的文件信息,如進行目錄的選擇和特殊文件的選取,在PowerBuilder(簡稱PB)中并沒有提供專門的樹形目錄對象,這樣就需要程序開發(fā)人員自己來實現(xiàn)相應(yīng)的樹形目錄。本文針對這種情況,提供了一種用純PB代碼實現(xiàn)樹形結(jié)構(gòu)的方法。 2.PB中樹形目錄的實現(xiàn)方法 PB中實現(xiàn)樹形目錄可以利用Windows本身的API函數(shù)SHBrowseForFolderA(包括在shell32.dll文件中),但該API函數(shù)只能顯示相應(yīng)的樹形目錄,不能顯示文件信息,而且用戶對它不能進行靈活的控制。因此,如果需要進行靈活控制,就需要程序人員自己編寫相應(yīng)代碼。 PB中的ListBox列表框控件提供了顯示目錄和文件的能力。在程序中可以利用PB的樹形控件TreeView動態(tài)生成樹形目錄結(jié)構(gòu)。我們使用ListBox控件的函數(shù)DirList來實現(xiàn),函數(shù)DirList以滿足條件的文件名填充列表框的列表項,其使用方法如下: listboxname.DirList(文件模式,文件類型) 其中文件類型的值如下所示: 0 | 可讀/可寫文件 | 2 | 隱含文件 | 16 | 子目錄 | 16384 | 驅(qū)動器 | 1 | 只讀文件 | 4 | 系統(tǒng)文件 | 32 | 歸檔文件 | 32768 | 除可讀/可寫外所有類型 |
在程序中可將幾種類型的值相加以獲取相應(yīng)的文件或目錄信息。下面結(jié)合一個實例介紹樹形目錄的實現(xiàn)方法,程序界面如圖1所示。
圖1 樹形目錄實現(xiàn)的實例
通過樹形目錄可以獲取計算機中的任意目錄,然后顯示需要顯示的文件(本例中顯示瀏覽器可以查看的文件類型:htm,html,swf,gif,jpg,txt等)。程序中主要使用的控件如下所示:
控件名 | 類型 | 說明 | tv_dir | TreeView | 顯示樹形目錄 | lb_file | ListBox | 顯示相應(yīng)目錄中的文件 | ole_disp | Microsoft Web瀏覽器控件 | 對選定文件進行瀏覽 | lb_dir | ListBox | 顯示驅(qū)動器信息 | lb_next | ListBox | 顯示當(dāng)前目錄下級目錄信息 |
程序具體實現(xiàn)分成以下幾個步驟:
第一步:在tv_dir的constructor事件中生成所有驅(qū)動器信息,代碼如下:
//顯示所有驅(qū)動器,并加入目錄樹中 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ū)動器類型設(shè)置圖標(biāo) ls_DriverType=uf_drivetype(lb_dir.Text(i)) //函數(shù)uf_drivetype用來獲取驅(qū)動器類型,根據(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)目錄的下級目錄信息:
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ū)動器 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)用戶單擊某一具體目錄時,顯示該目錄中滿足條件的文件名,代碼如下:
//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)前級別的上一級的信息 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é)束語
采用上文介紹的方法可實現(xiàn)了樹形目錄結(jié)構(gòu),如信息系統(tǒng)的數(shù)據(jù)備份中的目錄選擇、照片瀏覽選擇等,取得了較好的應(yīng)用效果。本文提到的方法在實際運用可進一步完善,如可將樹形目錄制作成PB中的用戶自定義對象,可方便地在各種地方使用。 | |