簡言之,遞歸過程就是子程序自己調(diào)用自己。在編程有時采用遞歸的思路進(jìn)行編程往往能夠起到事半功倍的作用。
Win95的資源管理器具有界面直觀、 操作簡便的特點,深受廣大電腦愛好者的歡迎和喜愛。
下面就采用遞歸過程模擬Windows的資源管理器。
遞歸過程實現(xiàn)的思路:
由于磁盤上的目錄是樹形結(jié)構(gòu),而樹形的節(jié)點和節(jié)點級數(shù)是不受限定的,如把目錄名放入一維或多維數(shù)組中則難度較大,不易實現(xiàn)。如采用VB的TreeView控件的Node對象,那就比較方便了。編一子程序,給定目錄,并建立當(dāng)前節(jié)點,加入Node對象中,根據(jù)Dir1控件判斷給定目錄下是否有下級目錄,如有,添加下級節(jié)點,并加入Node對象中;如無則退出子程序。即子程序的功能是:如給定目錄有子目錄存在,則展開當(dāng)前目錄求子目錄。如果在給定目錄展開完成后,把下級目錄當(dāng)成給定目錄,并調(diào)用子程序進(jìn)行展開,即可把給定目錄下的數(shù)級子目錄全部展開完畢。
利用VB提供的TreeView控件完全可以把磁盤上的目錄(包括子目錄)放入Node對象中,其界面具有資源管理器的特點。把磁盤上的目錄放入Node對象有多種方法,應(yīng)該說采用遞歸方法是比較簡潔的。
實現(xiàn)的過程:
1、 添加TreeView控件到窗體中:單擊—“工程”—“部件”,選擇Microsoft Windows
Common Control 5.0”復(fù)選框,單擊—“確定“按鈕,TreeView控件即可出現(xiàn)在工具箱中。
2、 在窗體中添加Drive、DirListBox、ImageList控件。
3、 控件名及主要屬性如下:
控件及窗體名屬性設(shè)置值備注
FormNameForm1
TreeViewNameTreeView
DriveNameDrive1獲得當(dāng)前電腦的盤符
DirListBoxNameDir1
ImageListNameImageList給TreeView1的Node對象圖標(biāo)
實現(xiàn)的源程序如下:
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
’創(chuàng)建根節(jié)點
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
‘如無同退出子程序,即為遞歸出口。否則會形成死循環(huán)。
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
‘調(diào)用遞歸(子程序自己調(diào)用自己)
For SDI = 0 To SDCount - 1
Call SSplitNode(DString(SDI))
Next SDI
End Sub
Function FOnlyPath(DString As String) As String
’功能是去掉上級目錄,只留下當(dāng)前目錄名
’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
本程序在Win95,VB5.0中文版下通過。
Win95的資源管理器具有界面直觀、 操作簡便的特點,深受廣大電腦愛好者的歡迎和喜愛。
下面就采用遞歸過程模擬Windows的資源管理器。
遞歸過程實現(xiàn)的思路:
由于磁盤上的目錄是樹形結(jié)構(gòu),而樹形的節(jié)點和節(jié)點級數(shù)是不受限定的,如把目錄名放入一維或多維數(shù)組中則難度較大,不易實現(xiàn)。如采用VB的TreeView控件的Node對象,那就比較方便了。編一子程序,給定目錄,并建立當(dāng)前節(jié)點,加入Node對象中,根據(jù)Dir1控件判斷給定目錄下是否有下級目錄,如有,添加下級節(jié)點,并加入Node對象中;如無則退出子程序。即子程序的功能是:如給定目錄有子目錄存在,則展開當(dāng)前目錄求子目錄。如果在給定目錄展開完成后,把下級目錄當(dāng)成給定目錄,并調(diào)用子程序進(jìn)行展開,即可把給定目錄下的數(shù)級子目錄全部展開完畢。
利用VB提供的TreeView控件完全可以把磁盤上的目錄(包括子目錄)放入Node對象中,其界面具有資源管理器的特點。把磁盤上的目錄放入Node對象有多種方法,應(yīng)該說采用遞歸方法是比較簡潔的。
實現(xiàn)的過程:
1、 添加TreeView控件到窗體中:單擊—“工程”—“部件”,選擇Microsoft Windows
Common Control 5.0”復(fù)選框,單擊—“確定“按鈕,TreeView控件即可出現(xiàn)在工具箱中。
2、 在窗體中添加Drive、DirListBox、ImageList控件。
3、 控件名及主要屬性如下:
控件及窗體名屬性設(shè)置值備注
FormNameForm1
TreeViewNameTreeView
DriveNameDrive1獲得當(dāng)前電腦的盤符
DirListBoxNameDir1
ImageListNameImageList給TreeView1的Node對象圖標(biāo)
實現(xiàn)的源程序如下:
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
’創(chuàng)建根節(jié)點
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
‘如無同退出子程序,即為遞歸出口。否則會形成死循環(huán)。
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
‘調(diào)用遞歸(子程序自己調(diào)用自己)
For SDI = 0 To SDCount - 1
Call SSplitNode(DString(SDI))
Next SDI
End Sub
Function FOnlyPath(DString As String) As String
’功能是去掉上級目錄,只留下當(dāng)前目錄名
’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
本程序在Win95,VB5.0中文版下通過。