遞歸過程在VB中的應(yīng)用實例

字號:

簡言之,遞歸過程就是子程序自己調(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中文版下通過。