VB中如何通过对话框可以选择路径(文件夹)?

时间:2021-04-29 21:37:18
默认的通用对话框好象只能够选择文件,是针对某个具体文件的.但是现在有需求让用户通过通用对话框设置/确定路径(文件夹),那么这该如何实现呢?

请高手们指点一下该怎样做?

6 个解决方案

#1


补充一下,最好能用控件实现

#2



Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BROWSEINFO) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long
Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
Private 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

Private Type OPENFILENAME
     lStructSize As Long
     hwndOwner As Long
     hInstance As Long
     lpstrFilter As String
     lpstrCustomFilter As String
     nMaxCustFilter As Long
     nFilterIndex As Long
     lpstrFile As String
     nMaxFile As Long
     lpstrFileTitle As String
     nMaxFileTitle As Long
     lpstrInitialDir As String
     lpstrTitle As String
     flags As Long
     nFileOffset As Integer
     nFileExtension As Integer
     lpstrDefExt As String
     lCustData As Long
     lpfnHook As Long
     lpTemplateName As String
End Type


'=======================================
'打开文件夹
'=======================================
Public Function GetDirName() As String
    Dim bi As BROWSEINFO
    Dim r As Long
    Dim pidl As Long
    Dim path As String
    Dim pos As Integer
    bi.pidlRoot = 0&
    
    bi.lpszTitle = srtTitle
    bi.ulFlags = 1
    pidl = SHBrowseForFolder(bi)
    path = Space$(512)
    r = SHGetPathFromIDList(ByVal pidl&, ByVal path)
    If r Then
    pos = InStr(path, Chr$(0))
    GetDirName = Left(path, pos - 1)
    Else: GetDirName = ""
    End If
End Function

#3


用API函数实现文件夹列表(VB6):   http://www.zhujiangroad.com/html/soft/s3742.html

VB6中用API函数实现文件夹列表:   http://www.ipv6.in/articleview/2005-12-6/article_view_3598.htm

#4


要什么控件啊,API函数呼叫而已。
来迟了。被人抢先回答了。

#5


多谢各位高手帮忙,问题已解决,结贴!

#6


引用 2 楼 mysticboy 的回复:
VB.NET code


Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BROWSEINFO) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffe……

Vb.net 2005已经不支持TYpe了,改为structure,你这个代码是vb.net的哪个版本啊

#1


补充一下,最好能用控件实现

#2



Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BROWSEINFO) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long
Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
Private 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

Private Type OPENFILENAME
     lStructSize As Long
     hwndOwner As Long
     hInstance As Long
     lpstrFilter As String
     lpstrCustomFilter As String
     nMaxCustFilter As Long
     nFilterIndex As Long
     lpstrFile As String
     nMaxFile As Long
     lpstrFileTitle As String
     nMaxFileTitle As Long
     lpstrInitialDir As String
     lpstrTitle As String
     flags As Long
     nFileOffset As Integer
     nFileExtension As Integer
     lpstrDefExt As String
     lCustData As Long
     lpfnHook As Long
     lpTemplateName As String
End Type


'=======================================
'打开文件夹
'=======================================
Public Function GetDirName() As String
    Dim bi As BROWSEINFO
    Dim r As Long
    Dim pidl As Long
    Dim path As String
    Dim pos As Integer
    bi.pidlRoot = 0&
    
    bi.lpszTitle = srtTitle
    bi.ulFlags = 1
    pidl = SHBrowseForFolder(bi)
    path = Space$(512)
    r = SHGetPathFromIDList(ByVal pidl&, ByVal path)
    If r Then
    pos = InStr(path, Chr$(0))
    GetDirName = Left(path, pos - 1)
    Else: GetDirName = ""
    End If
End Function

#3


用API函数实现文件夹列表(VB6):   http://www.zhujiangroad.com/html/soft/s3742.html

VB6中用API函数实现文件夹列表:   http://www.ipv6.in/articleview/2005-12-6/article_view_3598.htm

#4


要什么控件啊,API函数呼叫而已。
来迟了。被人抢先回答了。

#5


多谢各位高手帮忙,问题已解决,结贴!

#6


引用 2 楼 mysticboy 的回复:
VB.NET code


Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BROWSEINFO) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffe……

Vb.net 2005已经不支持TYpe了,改为structure,你这个代码是vb.net的哪个版本啊