递归过程在VB中的应用实例
简而言之,递归过程就是一个子程序调用自己。有时候递归编程往往能事半功倍。
win 95的资源管理器具有界面直观、操作简便的特点,深受计算机爱好者的喜爱。
下面是模拟Windows的资源管理器的递归过程。
递归过程实现的思路:
由于磁盘上的目录是树形结构,而且树中的节点和节点数是无限的,所以很难把目录名放入一维或多维数组中,不容易实现。如果采用VB中TreeView控件的Node对象,会更方便。编译一个子程序,给出目录,建立当前节点,添加到Node对象中。根据Dir1控件,判断给定目录下是否有下级目录,如果有,则添加下级节点并添加到节点对象中;如果没有,退出子程序。即子程序的作用是:如果给定目录下有子目录,则展开当前目录查找子目录。如果给定目录扩展完成后,将下级目录作为给定目录,调用子程序进行扩展,则可以扩展给定目录下的所有子目录。
使用VB提供的TreeView控件,可以将磁盘上的目录(包括子目录)完全放到Node对象中,其界面具有资源管理器的特点。有许多方法可以将磁盘上的目录放到节点对象中。应该说递归的方法更简洁。
实现过程:
1。在表单中添加TreeView控件:点击-工程-零件,选中Microsoft Windows
Common Control 5.0的复选框,点击-确定按钮,TreeView控件就会出现在工具箱中。
2。在窗体中添加Drive、DirListBox和ImageList控件。
3。控件名称和主要属性如下:
控件和窗体名称属性设置值说明
formname form 1
treeview name treeview
drivenamedrive 1获取当前计算机的驱动器号
dirlistboxnamedir 1
image。
实现的源程序如下:
Dim nodx As Node
Private Sub Form_Load()
’在 ImageList 控件中添加一个图象。
Dim imgX As ListImage
’ TreeView1.ImageList = ImageList1 ’初始化ImageList。
Set imgX = ImageList1.ListImages.Add(, , _
LoadPicture("c:\my documents\072.bmp"))
TreeView1.ImageList = ImageList1 ’初始化ImageList。
TreeView1.LineStyle = tvwRootLines
TreeView1.Style = tvwTreelinesPlusMinusPictureText
Dim DriverCount As Integer
Dim GivePath As String
On Error Resume Next
’创建根节点
Set nodx = TreeView1.Nodes.Add(, , "本人电脑", "本人电脑", 1)
For DriverCount = 0 To Drive1.ListCount - 1
Set nodx = TreeView1.Nodes.Add("本人电脑", tvwChild, _
Drive1.List(DriverCount) + "\", _
Drive1.List(DriverCount), 1)
GivePath = Drive1.List(DriverCount) + "\"
Call SSplitNode(GivePath)
Next DriverCount
End Sub
Sub SSplitNode(GivePath As String) ‘子过程
’把给定目录下的子目录全部加入Node对象中
Dim SDI As Integer
Dim SDCount As Integer
Dim DString(1000) As String
‘以下为展开给定目录的下级子目录
Dir1.Path = GivePath ‘给定目录
SDCount = Dir1.ListCount ‘利用Dir1控件判断是否有下级目录
If SDCount = 0 Then Exit Sub
‘如无同退出子程序,即为递归出口。否则会形成死循环。
For SDI = 0 To SDCount - 1
DString(SDI) = Dir1.List(SDI)
Set nodx = TreeView1.Nodes.Add(GivePath, tvwChild, _
DString(SDI), FOnlyPath(DString(SDI)), 1)
Next SDI
‘调用递归(子程序自己调用自己)
For SDI = 0 To SDCount - 1
Call SSplitNode(DString(SDI))
Next SDI
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 源程序如下:
Dim Nodx AS Node
Private Subform _ Load()
'在ImageList控件中添加图像。
dimimgx as list image
' treeview 1。' ImageList = imagelist1 '初始化ImageList。
setimgx = ImageList 1 . list images . add(,_
load picture(" C:\ my documents \ 072 . BMP "))
treeview 1 . imagelist = imagelist 1 '初始化imagelist。
树视图1。line style = tvwRootLines
treeview 1。style = tvwTreelinesPlusMinusPictureText
Dim driver count As Integer
Dim在出错时以字符串形式给出路径
resume next
'创建根节点
set nodex = treeview 1 . nodes . add(,,"我的电脑","我的电脑",1)
for driver count = 0 to drive 1 . list count-1
set nodex = treeview 1 . nodes . add("我的电脑",tvwchild,_)List(DriverCount),1)
GivePath = Drive1。list(driver Count)+" \ "
callssplitNode(give path)[/Br/]next driver Count[/Br/]end sub[/Br/]subssplitNode(give path as String)' subprocess[/Br/]将给定目录中的所有子目录添加到node对象[/Br/]Dim SDI as integer[/Br/]Dim SD Count as integer[/Br/]Dim D String(1000)as String[/Br/]'以下是子目录[/Br/]否则会形成死循环。
对于SDI = 0至SD count-1
DString(SDI)= dir 1。list(SDI)
Set nodx = treeview 1。Nodes.Add(GivePath,tvwChild,_
DString(SDI),FOnlyPath(DString(SDI)),1)
NextSDI
'调用递归(子例程调用自身)
ForSDI = 0 tosd count-1
calls splitnode(DString(SDI))
NextSDI
End sub[function FOnlyPath(d string as string)as string
'函数是 只保留当前目录名
'DString作为给定的完整路径目录名
if d string = " "然后退出函数
Dim d length As Integer
d length = len(d string)
Dim DD As Integer
For DD = d length To 1 Step-1
If Mid(d string,DD,1) = "\ "然后退出For
Next DD
FOnlyPath = Mid(d string,DD +
这个程序是在中文版Win 95和VB 5.0下通过的。
位律师回复
0条评论