|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Visual Basic Common
Control API Routines SHGetFileInfo: ListView Demo 2 - Populating the ListView Second 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 |
SHGetFileInfo: ListView Demo 1 - Obtaining the File Path |
|
This
page details the code required to populate the listview control with files matching the selected file spec using the APIs FindFirstFile,
FindNextFile and the WIN32_FIND_DATA type. 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. To the project constructed in Demo 1, add a ListView control as shown in the illustration. In its Custom Properties, set: View = 3 - Report LabelEdit = 1 - Manual Add the column headers as: Column 1 - Name - size=1700 Column 2 - Size - size=900 Column 3 - Type - size=1800 Column 4 - Created - size=900 Set column 2 and column 4 to right alignment. Do not assign an imagelist to the control. |
BAS Module Code |
To the bas module, make the following modifications and additions: |
|
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. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' To the Constant declarations add: Public Const SHGFI_DISPLAYNAME = &H200 Public Const SHGFI_EXETYPE = &H2000 Public Const SHGFI_SYSICONINDEX = &H4000 'system icon index Public Const SHGFI_LARGEICON = &H0 'large icon Public Const SHGFI_SMALLICON = &H1 'small icon Public Const ILD_TRANSPARENT = &H1 'display transparent Public Const SHGFI_SHELLICONSIZE = &H4 Public Const SHGFI_TYPENAME = &H400 Public Const BASIC_SHGFI_FLAGS = SHGFI_TYPENAME Or _ SHGFI_SHELLICONSIZE Or SHGFI_SYSICONINDEX Or _ SHGFI_DISPLAYNAME Or SHGFI_EXETYPE Public Const MAX_PATH As Long = 260 To the Type area, add: Public Type SHFILEINFO hIcon As Long iIcon As Long dwAttributes As Long szDisplayName As String * MAX_PATH szTypeName As String * 80 End Type Public shinfo As SHFILEINFO Public Type FILETIME dwLowDateTime As Long dwHighDateTime As Long End Type Public Type SYSTEMTIME wYear As Integer wMonth As Integer wDayOfWeek As Integer wDay As Integer wHour As Integer wMinute As Integer wSecond As Integer wMilliseconds As Integer End Type Public Type WIN32_FIND_DATA dwFileAttributes As Long ftCreationTime As FILETIME ftLastAccessTime As FILETIME ftLastWriteTime As FILETIME nFileSizeHigh As Long nFileSizeLow As Long dwReserved0 As Long dwReserved1 As Long cFileName As String * MAX_PATH cAlternate As String * 14 End Type In the API declaration area, add: Public Declare Function FindFirstFile Lib "kernel32" _ Alias "FindFirstFileA" _ (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long Public Declare Function FindNextFile Lib "kernel32" _ Alias "FindNextFileA" _ (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long Public Declare Function FindClose Lib "kernel32" _ (ByVal hFindFile As Long) As Long Public Declare Function FileTimeToSystemTime Lib "kernel32" _ (lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME) As Long Public Declare Function UpdateWindow Lib "user32" _ (ByVal hwnd As Long) As Long Public Declare Function ImageList_Draw Lib "comctl32" _ (ByVal himl&, _ ByVal i&, _ ByVal hDCDest&, _ ByVal x&, _ ByVal y&, _ ByVal flags&) As Long Public Declare Function SHGetFileInfo Lib "shell32" _ Alias "SHGetFileInfoA" _ (ByVal pszPath As String, _ ByVal dwFileAttributes As Long, _ psfi As SHFILEINFO, _ ByVal cbSizeFileInfo As Long, _ ByVal uFlags As Long) As Long |
Form Code |
Make the following additions to the form code: |
|
Option Explicit In the form's general declarations, add: Dim UpdateFrequency As Integer In the form code, make the following bolded changes: 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 With ListView1 .SortKey = 0 End With UpdateFrequency = 25 End Sub Private Sub cmdSelect_Click(index As Integer) Select Case index Case 0: fPath$ = vbGetBrowseDirectory$() If Len(fPath$) > 0 Then vbGetFileList Case 1: If Len(fPath$) > 0 Then vbGetFileList Case 2: Unload Me End Select End Sub Add the following new code to the form: Private Function TrimNull(item As String) As String Dim pos As Integer pos = InStr(item, Chr$(0)) If pos Then item = Left$(item, pos - 1) TrimNull = item End Function Private Sub vbGetFileList() Dim hFile As Long Dim fName As String Dim fExt As String Dim counter As Integer Dim WFD As WIN32_FIND_DATA Me.MousePointer = vbArrowHourglass DoEvents fExt = vbGetComboFileSpec() If Len(fPath) > 0 And Len(fExt) > 0 Then fName = fPath & fExt DisplayName = fName DoEvents ListView1.ListItems.Clear DoEvents hFile = FindFirstFile(fName, WFD) If hFile > 0 Then counter = 1 vbAddFileItemView WFD While FindNextFile(hFile, WFD) counter = counter + 1 vbAddFileItemView WFD If counter = UpdateFrequency Then Call UpdateWindow(ListView1.hwnd) counter = 0 End If Wend End If FindClose hFile End If cmdSelect(1).Enabled = False Me.MousePointer = vbDefault End Sub Private Sub vbAddFileItemView(WFD As WIN32_FIND_DATA) Dim sFileName As String Dim ListImgKey As String Dim fType As String sFileName = TrimNull(WFD.cFileName) If sFileName <> "." And sFileName <> ".." Then Dim hInfo As Long Dim tExeType As Long Dim itmX As ListItem hInfo = SHGetFileInfo(fPath & sFileName, 0&, shinfo, Len(shinfo), BASIC_SHGFI_FLAGS) fType = LCase$(TrimNull(shinfo.szTypeName)) Set itmX = ListView1.ListItems.Add(, , LCase$(sFileName)) itmX.SubItems(1) = vbGetFileSizeKBStr(WFD.nFileSizeHigh + WFD.nFileSizeLow) itmX.SubItems(2) = fType itmX.SubItems(3) = vbGetFileDate$(WFD.ftCreationTime) End If End Sub Private Function vbGetFileDate(CT As FILETIME) As String Dim ST As SYSTEMTIME Dim ds As Single If FileTimeToSystemTime(CT, ST) Then ds = DateSerial(ST.wYear, ST.wMonth, ST.wDay) vbGetFileDate$ = Format$(ds, "Short Date") Else vbGetFileDate$ = "" End If End Function Private Function vbGetFileSizeKBStr(fsize As Long) As String vbGetFileSizeKBStr = Format$(((fsize) / 1000) + 0.5, "#,###,###") & "kb" 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. In addition, the listview should populate with all the
files in the selected directory matching the selected file type. Move to SHGetFileInfo: ListView Demo 3 - Adding Sorting Functionality. |
|
|
|
|||||
|
|||||
|
|||||
Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved. |