|
![]() |
![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() |
![]() |
To access the contents, click the chapter and section titles.
Visual Basic 6 Programming Blue Book: The Most Complete, Hands-On Resource for Writing Programs with Microsoft Visual Basic 6!
Listing 14.8 The StartSearch procedure. Private Sub StartSearch() We come here to start a search. Empty the List Box. lstFiles.Clear Clear the Halt flag. Halt = False Disable all controls except the Stop button. Command1(0).Enabled = False Command1(1).Enabled = True Command1(2).Enabled = False Drive1.Enabled = False dirStart.Enabled = False txtPattern.Enabled = False If the invisible Dir list is already pointing to the same directory as the visible Dir list, we must trigger a Change event. If not, change its Path property, which will automatically trigger a Change event. It is the dirHidden.Change event that triggers the search process. Display the hourglass mouse pointer. Screen.MousePointer = 11 If dirHidden.Path = dirStart.Path Then dirHidden_Change Else dirHidden.Path = dirStart.Path End If We reach here after the search is complete. Re-enable all controls except the Stop button. Screen.MousePointer = 0 Command1(0).Enabled = True Command1(1).Enabled = False Command1(2).Enabled = True Drive1.Enabled = True dirStart.Enabled = True txtPattern.Enabled = True End Sub As noted earlier, the search begins when the hidden DirListBoxs Change event procedure is triggered. Listing 14.9 shows the code in that procedure. The code here is really simpler than it looks. The first step is to search the current folder (the one you just changed to) for files that match the search template entered by the user. The path is placed in the List Box, then a loop obtains the names of all matching files by calling the Dir function repeatedly. These names are also added to the List Box, along with file information if the FileInfo option is selected. Note the Visual Basic functions called FileDateTime and FileLen; these are available for obtaining the desired information about the file. Once all of the files in the current folder have been processed, the attention turns to any subfolders. Remember, the DirListBoxs ListCount property will tell us the number of subfolders. By using that valueplus the controls List indexed propertyyou can loop through the list of subfolders and place them in an array. When this array is loaded with the names of any subfolders in the current folder, the rest is easy. Set up a loop that goes through the array, assigning each subfolder name (which includes the full path) to the hidden DirListBoxs Path property. Guess what? Each time you do this, you trigger another Change event procedure, repeating the entire process I have just described. Listing 14.9 The hidden DirListBoxs Change event procedure. Private Sub dirHidden_Change() Triggered when the hidden directory list changes. It is here that the actual search is performed. Dim Path As String, FileName As String Dim FileName1 As String, Path1 As String, Entry As String Dim NumDirs As Integer, X As Integer, Y As Integer Dim DirAdded As Boolean, Spaces As Integer Depth = Depth + 1 For testing as described in text, uncomment the next line. debug.Print Depth = , Depth Get the current path and add a backslash if necessary. Path = dirHidden.Path If Right(Path, 1) <> \ Then Path = Path & \ End If Create the full search pattern by combining the current path with the file pattern from the txtPattern Text Box. Path1 = Path & txtPattern.TEXT The Dir function returns an empty string if a matching file is not found, and the file name if a matching file is found. FileName = Dir(Path1) DirAdded = False Loop as long as a matching file is found. Do Until FileName = If the directory name has not already been added to the List Box, add it now. If (DirAdded = False) Then lstFiles.AddItem [ & dirHidden.Path & ] DirAdded = True End If Start building the next List Box entry. Entry = & FileName If the FileInfo check box is checked, add the files date, time, and length to the entry. If chkFileInfo.VALUE Then FileName1 = Path & FileName Spaces = 16,,Len(FileName) Entry = Entry & Space(Spaces) & FileDateTime(FileName1) Spaces = 20,,Len(FileDateTime(FileName1)) Entry = Entry & Space(Spaces) & FileLen(FileName1) End If Add the entry to the List Box. lstFiles.AddItem Entry Look for the next matching file. FileName = Dir Loop How many subdirectories are in the current directory? NumDirs = dirHidden.ListCount Put the subdirectory names in an array. ReDim DirList(NumDirs) As String For X = 0 To NumDirs-1 DirList(X) = dirHidden.List(X) Next X For each subfolder, repeat the search process. Call DoEvents to enable user to abort the search by clicking the Stop Command button. For X = 0 To NumDirs-1 dirHidden.Path = DirList(X) Y = DoEvents() If Halt Then Exit Sub End If Next X Depth = Depth-1 End Sub Exploring The Recursive AlgorithmWhen considering how recursion works, you must understand that when a function calls itselfwhich is what the Change event procedure does by changing the controls Path propertyeach call results in a completely new and separate copy of the procedure being executed. Each of these copies has its own independent array of subfolder names, as well as its own set of other local variables. Each copy of the Change event procedure sits waiting until the lower copies of the procedure have completed (by running out of subfolders to process). Then execution returns to the specific copy of the procedure and continues there until its array of subfolders is exhausted, at which time execution passes up one more level. Only when each and every subfolder below the starting subfolder has been processed does execution return to the StartSearch procedure. To get a feel for whats happening, use the debug.Print statement to display the value of the Depth variable by uncommenting the line of code near the start of the Change event procedure. Youll see a sequence of values displayed in the Debug window similar to this: 1 2 3 3 2 3 3 4 4 3 2 At each iteration, the value displayed gives us a feeling for how many layers of Change event procedures existeach with its own array of subfolders. Once you understand the basic principle behind iterative algorithms, youll probably find other programming challenges to which they can be applied. This project requires a bit more code, shown in Listing 14.10. Nothing here is too complicated. You should be able to figure out how it works from the comments in the listing. Before focusing on Listing 14.10, take a look at Figure 14.5, which shows the File Finding utility in operation. I have found the File Finding utility to be very handy. Actually, I dont often use it as a standalone program, but I have incorporated its algorithm and code into other projects. For example, you can use the three file-related controls plus the file-finding techniques presented here to create a File Open dialog box that permits the user to locate files anywhere on the disk. This project is an excellent example of using creative thinking to find a use for a Visual Basic control that its creators probably never envisioned. Many other possibilities are waiting in the Visual Basic toolbox, but remember, a working knowledge of the tools is a prerequisite for getting the most out of them. Listing 14.10 The remaining code in FINDFILE.FRM. Private Sub Drive1_Change() If the user changes drives, pass the new path to the Dir list control. dirStart.Path = Drive1.Drive End Sub Private Sub Form_Load() Halt = False txtPattern.TEXT = *.EXE lstFiles.Clear depth = 0 End Sub Private Sub Text1_GotFocus() Highlight entire contents of Text Box. txtPattern.SelStart = 0 txtPattern.SelLength = Len(txtPattern.TEXT) End Sub Private Sub txtPattern_GotFocus() Highlight Text Box contents when it gets the focus. txtPattern.SelStart = 0 txtPattern.SelLength = Len(txtPattern.TEXT) End Sub
|
![]() |
Products | Contact Us | About Us | Privacy | Ad Info | Home
Use of this site is subject to certain Terms & Conditions, Copyright © 1996-2000 EarthWeb Inc. All rights reserved. Reproduction whole or in part in any form or medium without express written permission of EarthWeb is prohibited. Read EarthWeb's privacy statement. |