递归过程在VB中的应用实例

王朝厨房·作者佚名  2007-01-04
宽屏版  字体: |||超大  

作者: 邓世学

来源:www.ccw.com.cn

Windows的资源管理器具有界面直观、 操作简便的特点,深受广大电脑爱好者的欢迎和喜爱。

利用VB提供的TreeView控件完全可以把磁盘上的目录(包括子目录)放入Node对象中,其界面具有资源管理器的特点。把磁盘上的目录放入Node对象有多种方法,应该说采用递归方法是比较简洁的。

递归过程实现的思路:

简言之,递归过程就是子程序自己调用自己。由于磁盘上的目录是树形结构,而树形的节点和节点级数是不受限定的,仅把目录名放入一维或多维数组中难度较大,不易实现。编一子程序,给定目录,并建立当前节点,加入Node对象中,根据Dir1控件判断给定目录下是否有下级目录,如有,添加下级节点,并加入Node对象中如无则退出子程序。即子程序的功能是:如给定目录有子目录,则展开当前目录求子目录。如果在给定目录展开完成后,把下级目录当成给定目录,并调用子程序进行展开,即可把给定目录下的数级子目录全部展开完毕。下面就举例说明,为简便起见,TreeView控件只放入目录,文件名省略。

实现的过程:

1、 添加TreeView控件到窗体中:单击—“工程”—“部件”,选择Microsoft Windows Common Control 6.0”(文件路径为\WinNT\System32\Mscomctl.ocx)复选框,单击—“确定“按钮,TreeView控件即可出现在工具箱中并添加。

2、 在窗体中添加Drive、DirListBox、ImageList控件。

3、 控件名及主要属性如下:

控件及窗体名 主要属性值 备注

===============================================================================

Form Name=Form1:Caption=”测试窗体”

TreeView Name=TreeView1

Drive Name=Drive1:Visible=False 获得当前电脑磁盘的盘符

DirListBox Name=Dir1:Visible=False

ImageList Name=ImageList1 给TreeView1的Node对象图标

在应用程序当前目录下,放入一16X16的位图文件123.bmp,供TreeView1控件显示用。

实现的源程序如下:

Option Explicit ’必须进行变量声明

Dim nodx As Node

Private Sub Form_Load()

On Error Resume Next

’控件与窗体一样大

TreeView1.Height = Form1.ScaleHeight

TreeView1.Width = Form1.ScaleWidth

’在 ImageList 控件中添加一个图象,该图像用于显示在TreeView1控件上。

Dim imgX As ListImage

’调入图形文件

Set imgX = ImageList1.ListImages.Add(, , LoadPicture("123.bmp"))

TreeView1.ImageList = ImageList1 ’初始化ImageList。

TreeView1.LineStyle = tvwRootLines

TreeView1.Style = tvwTreelinesPlusMinusPictureText

Dim DriverCount As Integer

Dim GivePath As String

’创建根节点

Set nodx = TreeView1.Nodes.Add(, , "本人电脑", "本人电脑", 1)

For DriverCount = 0 To Drive1.ListCount - 1

GivePath = Left(Drive1.List(DriverCount), 2) + "\"

Set nodx = TreeView1.Nodes.Add("本人电脑", tvwChild, GivePath, GivePath, 1)

SSplitNode GivePath ’把各盘的文件夹进行展开放于TreeView1控件中

Next DriverCount

End Sub

Sub SSplitNode(sGivePath As String) ’子过程

’把给定目录下的子目录全部加入Node对象中

Dim SDI As Integer

Dim SDCount As Integer

’用于存放给定目录的下级子目录,该变量数组随递归过程调用而发生变化

Dim GivePathSubDir() As String

’如有则展开目录并放入TreeView1控件中

Dir1.Path = sGivePath

SDCount = Dir1.ListCount

If SDCount <> 0 Then

ReDim GivePathSubDir(SDCount - 1)

’把下级目录放入变量数组GivePathSubDir中

SubSaveSubDir sGivePath, GivePathSubDir, SDCount

End If

If SDCount = 0 Then Exit Sub

’即为递归出口。否则会形成死循环。

For SDI = 0 To SDCount - 1

Set nodx = TreeView1.Nodes.Add(sGivePath, tvwChild, _

GivePathSubDir(SDI), FOnlyPath(GivePathSubDir(SDI)), 1)

Next SDI

’调用递归(子程序自己调用自己)

For SDI = 0 To SDCount - 1

sGivePath = GivePathSubDir(SDI)

SSplitNode sGivePath

Next SDI

End Sub

Sub SubSaveSubDir(fGivePath As String, fGivePathSubDir() As String, fSDCount As Integer)

’fGivePath 给定目录串

’fGivePathSubDir 用于存放子目录

’fSDCount 子目录数

Dim i As Integer: Dim t As Integer

Dir1.Path = fGivePath

t = Dir1.ListCount

For i = 0 To t - 1

fGivePathSubDir(i) = Dir1.List(i)

Next i

fSDCount = t

End Sub

Function FOnlyPath(DString As String) As String

’功能是去掉上级目录,只留下当前目录名

’DString为给定的全路径目录名

If DString = "" Then Exit Function

Dim DLength As Integer

DLength = Len(DString)

Dim DD As Integer

For DD = DLength To 1 Step -1

If Mid(DString, DD, 1) = "\" Then Exit For

Next DD

FOnlyPath = Mid(DString, DD + 1)

End Function

Private Sub Form_Resize()

’控件与窗体一样大

TreeView1.Height = Form1.ScaleHeight

TreeView1.Width = Form1.ScaleWidth

End Sub

本程序在Win2000,VB6.0中文版下通过。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有