mlcktmguy
asked on
Allow user to select a directory
In my VB6.0 app I have used CommonDialog boxes to allow users to select a particular file to take action on. I have added new functionailty to the app and I now want the user to select a directory on their local drive. I will place some app related files in the directory they choose.
I tried doing this with CommonDialog but it doesn't stop at the directory level, it wants the user to enter or select a file name. Is there a parameter to allow the user to select a directory in the CommonDialog?
I noticed DirListBox and thought it might be the one but it seems very limited in what it displays. It doesn't show the entire local drive, only some directories relative to where the app is running. There doesn't seem to be any built in mechanism for going up the directory structure. Also I couldn't figure how the app knows which directory the user clicked on.
Any help gettiing either of these controls (or another control) to function as I want would be greatly appreciated.
I suspect i could do this by loading the directory structure into a 'treeview' control but I'm hoping there is a more efficient (less coding) way of getting this done.
I tried doing this with CommonDialog but it doesn't stop at the directory level, it wants the user to enter or select a file name. Is there a parameter to allow the user to select a directory in the CommonDialog?
I noticed DirListBox and thought it might be the one but it seems very limited in what it displays. It doesn't show the entire local drive, only some directories relative to where the app is running. There doesn't seem to be any built in mechanism for going up the directory structure. Also I couldn't figure how the app knows which directory the user clicked on.
Any help gettiing either of these controls (or another control) to function as I want would be greatly appreciated.
I suspect i could do this by loading the directory structure into a 'treeview' control but I'm hoping there is a more efficient (less coding) way of getting this done.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
I am trying the suggestions in order.
mvidas , i tried your first suggestion that uses a minimum of code
I get a 'Variable not defined' compile error on the statement:
If shFolder Is Nothing Then WScript.Quit
WScript is highlighted
mvidas , i tried your first suggestion that uses a minimum of code
I get a 'Variable not defined' compile error on the statement:
If shFolder Is Nothing Then WScript.Quit
WScript is highlighted
Hi,
I'm sorry, I copied that from a vbscript file I have, where wscript.quit is used to exit the script. Replace the line with
If shFolder Is Nothing Then Exit Sub
Change 'sub' to 'function' as needed.
Matt
I'm sorry, I copied that from a vbscript file I have, where wscript.quit is used to exit the script. Replace the line with
If shFolder Is Nothing Then Exit Sub
Change 'sub' to 'function' as needed.
Matt
ASKER
That got me past that statement. Now I am getting the same error on:
Set shFolderItem = shFolder.Items.Item
shFolderItem is higlighted
Set shFolderItem = shFolder.Items.Item
shFolderItem is higlighted
I'm doing 0 for 2 here! Very sorry
Add to the Dim statement:
Dim ShellApp As Object, shFolder As Object, folderName As String, shFolderItem As Object
Add to the Dim statement:
Dim ShellApp As Object, shFolder As Object, folderName As String, shFolderItem As Object
Private Declare Function SHBrowseForFolder Lib "shell32" Alias "SHBrowseForFolderA" (lpbi As BrowseInfo) As Long
Private Type BrowseInfo
hWndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As String
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long
Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)
Private Sub Form_Load()
SelectDir "Select a dir"
End Sub
Private Function SelectDir(Optional Title As String) As String
Dim iNull As Integer, lpIDList As Long
Dim sPath As String, udtBI As BrowseInfo
Const BIF_RETURNONLYFSDIRS = 1
With udtBI
'Set the owner window
.hWndOwner = Me.hWnd
'lstrcat appends the two strings and returns the memory address
.lpszTitle = Title
'Return only if the user selected a directory
.ulFlags = BIF_RETURNONLYFSDIRS
End With
lpIDList = SHBrowseForFolder(udtBI)
If lpIDList Then
sPath = String$(1024, 0)
'Get the path from the IDList
SHGetPathFromIDList lpIDList, sPath
'free the block of memory
CoTaskMemFree lpIDList
iNull = InStr(sPath, vbNullChar)
If iNull Then
SelectDir = Left$(sPath, iNull - 1)
End If
End If
End Function