用户名: 密码: 验证码: gdcode 注册

树形目录在PB中的实现与应用

时间:2007-06-15 来源: 作者: 【字体: 减小 增大点击: 收藏 | 投稿
  
1.引言

  在管理信息系统的开发中,经常需要获取本地计算机中的树形目录结构和相应的文件信息,如进行目录的选择和特殊文件的选取,在PowerBuilder(简称PB)中并没有提供专门的树形目录对象,这样就需要程序开发人员自己来实现相应的树形目录。本文针对这种情况,提供了一种用纯PB代码实现树形结构的方法。

  2.PB中树形目录的实现方法

  PB中实现树形目录可以利用Windows本身的API函数SHBrowseForFolderA(包括在shell32.dll文件中),但该API函数只能显示相应的树形目录,不能显示文件信息,而且用户对它不能进行灵活的控制。因此,如果需要进行灵活控制,就需要程序人员自己编写相应代码。

  PB中的ListBox列表框控件提供了显示目录和文件的能力。在程序中可以利用PB的树形控件TreeView动态生成树形目录结构。我们使用ListBox控件的函数DirList来实现,函数DirList以满足条件的文件名填充列表框的列表项,其使用方法如下:

财软联,盟,fs119.net



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

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

0 可读/可写文件 2 隐含文件 16 子目录 16384 驱动器 1 只读文件 4 系统文件 32 归档文件 32768 除可读/可写外所有类型
  在程序中可将几种类型的值相加以获取相应的文件或目录信息。下面结合一个实例介绍树形目录的实现方法,程序界面如图1所示。


图1树形目录实现的实例

  通过树形目录可以获取计算机中的任意目录,然后显示需要显示的文件(本例中显示浏览器可以查看的文件类型:htm,html,swf,gif,jpg,txt等)。程序中主要使用的控件如下所示: 财管家园 fs119.net

控件名 类型 说明 tv_dir TreeView 显示树形目录 lb_file ListBox 显示相应目录中的文件 ole_disp MicrosoftWeb浏览器控件 对选定文件进行浏览 lb_dir ListBox 显示驱动器信息 lb_next ListBox 显示当前目录下级目录信息

财软联,盟,fs119.net

财管家园 fs119.net

财管 家园 fs119.net


财软联.盟.fs119.net

财.软联盟.fs119.net

  程序具体实现分成以下几个步骤:

  第一步:在tv_dir的constructor事件中生成所有驱动器信息,代码如下:

//显示所有驱动器,并加入目录树中
treeviewitemltvi_new
intli_count,i
Stringls_DriverType
lb_dir.DirList("",16384)
li_count=lb_dir.totalitems()
IFli_count>0then
fori=1toli_count
ltvi_New.Label=lb_dir.Text(i)
ltvi_New.Data=i-1
ltvi_New.Children=TRUE
//根据驱动器类型设置图标
ls_DriverType=uf_drivetype(lb_dir.Text(i))
//函数uf_drivetype用来获取驱动器类型,根据类型设置图标
Choosecasels_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
ENDCHOOSE
This.InsertItemlast(0,ltvi_New)
next
This.selectitem(1)

财软联盟,fs119.net


Endif
  第二步,在tv_dir的itempopulate事件中生成相应目录的下级目录信息:

Stringls_Driver,ls_Data
Intli_level,li_num,li_i,li_new_level
TreeViewItemltvi_choose
treeviewitemltvi_new,ltvi_parent
longll_handle
//获取当前所选目录
tv_dir.GetItem(handle,ltvi_choose)
li_Level=ltvi_Choose.Level
lb_dir.dirlist("",0)
//
IFli_level=1Then//选择目录树中的驱动器
ls_Driver=Mid(ltvi_choose.label,3,1)
lb_dir.DirList(ls_Driver":\",1632768)//显示当前目录子目录信息
li_num=lb_Dir.totalitems()
Forli_i=1toli_num
ls_Data=lb_dir.Text(li_i)
IfMid(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,1632768)
iflb_next.totalitems()>1Then
ltvi_New.Children=TRUE
else
ltvi_New.Children=False
Endif
ltvi_New.PictureIndex=3
ltvi_New.SelectedPictureIndex=4 财管家园.fs119.net
tv_dir.InsertItemlast(handle,ltvi_New)
Endif
Next
EndIf

IFli_level>=2Then//选择目录树中的子目录
ls_driver=uf_get_dir(li_level,tv_dir,handle,ltvi_choose.label)
lb_dir.DirList(ls_Driver,1632768)//显示当前目录子目录信息
li_num=lb_Dir.totalitems()
Forli_i=1toli_num
ls_Data=lb_dir.Text(li_i)
IfMid(ls_data,1,1)="["andmid(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,1632768)
iflb_next.totalitems()>1Then
ltvi_New.Children=TRUE
else
ltvi_New.Children=False
Endif
ltvi_New.PictureIndex=3
ltvi_New.SelectedPictureIndex=4
tv_dir.InsertItemlast(handle,ltvi_New)
Endif
Next
EndIf

财软联 盟 fs119.net

财 软联盟 fs119.net

  第三步:当用户单击某一具体目录时,显示该目录中满足条件的文件名,代码如下:

财.管家园.fs119.net

//tv_dir中Click事件代码
Intli_num,li_i,li_long,i
TreeViewItemltvi_cur
Stringls_dir,ls_data
StringFiletype[8]
//设定需要显示的文件类型
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)
Ifltvi_cur.level=1then
 ls_dir=mid(ltvi_cur.Label,3,1)":\"
else
 ls_dir=uf_get_dir(ltvi_cur.level,this,handle,ltvi_cur.Label)
endif
is_dir=ls_dir
Lb_next.DirList(ls_dir"\*.*",012432)//显示所有文件
li_num=lb_Dir.totalitems()
lb_file.Reset()
//将指定文件显示在列表框中
Forli_i=1toli_num
 ls_Data=lb_next.Text(li_i)
 Fori=1toli_long
  ifmatch(lower(Right(ls_data,len(FileType[i]))),Filetype[i])thenlb_file.addItem(ls_data)
Next
Next

财管.家园.fs119.net

  第四步:在OLE控件中显示所选文件的内容,主要代码如下:

财软联盟,fs119.net

//显示文件内容
Stringls_filename
Iflen(is_dir)=3Then
 ls_filename=is_dirthis.text(index)
Else
 ls_filename=is_dir"\"this.text(index)
Endif
ole_disp.object.navigate(ls_filename) 财软联 盟 fs119.net

  其中程序中使用的uf_get_dir为用户自定义函数,该函数用来获取所选定目录的完整路径。

财软联,盟,fs119.net

//用户自定义函数
functionstringuf_get_dir(integerpi_level,treeviewtv_dir,longhandle,stringps_str);
 TreeViewItemltvi_parent
 Intli_new_level
 Longll_handle
 Stringls_driver
 //找到当前级别的上一级的信息
 ls_driver=ps_str
 li_new_level=pi_level
 ll_handle=handle
 dowhileli_new_level>1
  ll_handle=tv_dir.FindItem(ParentTreeItem!,ll_handle)
  tv_dir.GetItem(ll_handle,ltvi_parent)
  li_new_level=ltvi_parent.level
  ifli_new_level=1then
   ls_driver=Mid(ltvi_parent.label,3,1)":\"ls_driver
  else
   ls_driver=ltvi_parent.label"\"ls_driver
  endif
 loop
 Returnls_driver 财.管家园.fs119.net

  3.结束语

  采用上文介绍的方法可实现了树形目录结构,如信息系统的数据备份中的目录选择、照片浏览选择等,取得了较好的应用效果。本文提到的方法在实际运用可进一步完善,如可将树形目录制作成PB中的用户自定义对象,可方便地在各种地方使用。
财 软联盟 fs119.net

财软 联盟 fs119.net

财管家园,fs119.net


文章摘自网络,如有侵权,请与我们联系.
数据统计中!!
上一篇:用PowerBuilder实现多层C/S系统
下一篇:PB中用WindowsAPI制作位图菜单

精品课程推荐



用户名: 密码: 匿名? 注册