|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Visual Basic Common
Control API Routines SHGetFileInfo: ListView Demo 1 - Obtaining the File Path First of four pages to create a ListView application to retrieve files from a specified folder. |
||
Posted: | Sunday March 1, 1997 | |
Updated: | Monday December 26, 2011 | |
Applies to: | VB4-32, VB5, VB6 | |
Developed with: | VB4-32, Windows 95 | |
OS restrictions: | None | |
Author: | VBnet - Randy Birch | |
Related: | SHGetFileInfo: ListView Demo 1 - Obtaining the File Path SHGetFileInfo: ListView Demo 2 - Populating the ListView SHGetFileInfo: ListView Demo 3 - Adding Sorting Functionality SHGetFileInfo: ListView Demo 4 - Adding the Associated Icons |
|
Prerequisites |
This method is intended for Visual Basic 5 or Visual Basic
6 where the Common Control library used is the MSComCtl 5 version (comctl32.ocx). Because the VB6-specific mscomctl.ocx (Common Controls 6)
is a complete implementation of comctl32.dll and not reliant on the version of comctl32.dll installed, this routine may not work when applied
to a listview created from the VB6-specific mscomctl.ocx.
Enhanced Comctl32 functionality is only available to users with comctl32.dll version 4.70 or greater installed. This dll is typically installed with IE3.x or greater. |
|
This
page details the code required to construct the base form, and the code necessary to retrieve the user's selection using the Windows Browse
dialog. When the demo is completed, the final app will retrieve the users selection and populate the listview with selected files from that folder, complete with associated icons, file name, file type, file size and created date. Begin a new project, and add the Common Controls OCX. Create Form1 and as shown in the illustration, add a combo box (Combo1) set to Style 2, and three command buttons in a control array - cmdSelect(0) "Select Folder", cmdSelect(1) "Rescan" and cmdSelect(2) "Exit"). Finally, add Label1 with the caption "Target Folder", and an empty label named DisplayName with AutoSize set to true. |
BAS Module Code |
Place the following code into the general declarations area of a bas module: |
|
Option Explicit '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Copyright ©1996-2011 VBnet/Randy Birch, All Rights Reserved. ' Some pages may also contain other copyrights by the author. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Distribution: You can freely use this code in your own ' applications, but you may not reproduce ' or publish this code on any web site, ' online service, or distribute as source ' on any media without express permission. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Public Const BIF_RETURNONLYFSDIRS = &H1 Public Const MAX_PATH As Long = 260 Public Type SHITEMID cb As Long abID As Byte End Type Public Type ITEMIDLIST mkid As SHITEMID End Type Public Type BROWSEINFO hOwner As Long pidlRoot As Long pszDisplayName As String lpszTitle As String ulFlags As Long lpfn As Long lParam As Long iImage As Long End Type Public Declare Function SHGetPathFromIDList Lib "shell32" _ Alias "SHGetPathFromIDListA" _ (ByVal pidl As Long, _ ByVal pszPath As String) As Long Public Declare Function SHBrowseForFolder Lib "shell32" _ Alias "SHBrowseForFolderA" _ (lpBrowseInfo As BROWSEINFO) As Long Public Declare Sub CoTaskMemFree Lib "ole32" (ByVal pv As Long) |
Form Code |
To the form, add the following code: |
|
Option Explicit Dim fPath As String Private Sub Form_Load() Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2 With Combo1 .AddItem "All Files and Folders (*.*)" .AddItem "Applications (*.exe)" .AddItem "Device Drivers (*.drv)" .AddItem "Documents (*.doc)" .AddItem "Dynamic Link Libraries (*.dll)" .AddItem "Rich Text Format Documents (*.rtf)" .AddItem "System Files (*.sys)" .AddItem "Visual Basic Modules (*.bas)" .AddItem "Visual Basic Forms (*.frm)" .AddItem "Visual Basic 3 Projects (*.mak)" .AddItem "Visual Basic 4 Projects (*.vbp)" .AddItem "Postscript Printer Font Metrics (*.pfm)" .AddItem "Text Files (*.txt)" .AddItem "True Type Fonts (*.ttf)" .AddItem "Windows Help Files (*.hlp)" .AddItem "Windows Shortcuts (*.lnk)" .ListIndex = 0 End With End Sub Private Sub cmdSelect_Click(index As Integer) Dim fExt As String Select Case index Case 0: fPath = vbGetBrowseDirectory() fExt = vbGetComboFileSpec() If Len(fPath) > 0 And Len(fExt) > 0 Then DisplayName = fPath & fExt End If Case 2: Unload Me End Select End Sub Private Sub Combo1_Click() cmdSelect(1).Enabled = Len(fPath) > 0 End Sub Private Function ValidateDir(tmpPath As String) As String If Right$(tmpPath, 1) = "\" Then ValidateDir = tmpPath Else ValidateDir = tmpPath & "\" End If End Function Private Function vbGetBrowseDirectory() As String Dim bi As BROWSEINFO Dim IDL As ITEMIDLIST Dim pidl As Long Dim tmpPath As String Dim pos As Integer bi.hOwner = Form1.hWnd bi.pidlRoot = 0& bi.lpszTitle = "Select the search directory for " & vbGetComboTargetType$() & "." bi.ulFlags = BIF_RETURNONLYFSDIRS 'get the folder pidl = SHBrowseForFolder(bi) tmpPath = Space$(MAX_PATH) If SHGetPathFromIDList(ByVal pidl, ByVal tmpPath) Then pos = InStr(tmpPath, Chr$(0)) tmpPath = Left(tmpPath, pos - 1) vbGetBrowseDirectory = ValidateDir(tmpPath) Else vbGetBrowseDirectory = "" End If Call CoTaskMemFree(pidl) End Function Private Function vbGetComboFileSpec() As String Dim pos As Integer Dim lpos As Integer Dim item As String item = Combo1.List(Combo1.ListIndex) pos = InStr(item, "(") + 1 lpos = InStr(item, ")") - pos vbGetComboFileSpec = Mid$(item, pos, lpos) End Function Private Function vbGetComboTargetType() As String Dim pos As Integer Dim item As String item = Combo1.List(Combo1.ListIndex) pos = InStr(item, "(") - 2 vbGetComboTargetType = Left$(item, pos) End Function |
Comments |
Run
the project, and click the Select Folder button. Browse to any folder, and hit OK. The folder selected and the file type from the combo box
should be returned in the DisplayName label as a fully-qualified path and filespec. Move to SHGetFileInfo: ListView Demo 2 - Populating the ListView. |
|
|
|
|||||
|
|||||
|
|||||
Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved. |