当前位置:编程学习 > VB >>

CommonDialog怎么选择目录?诚信结贴不食言

CommonDialog怎么选择目录?
不想要其他的对话框,因为现在的用户不熟悉别的对话框,只熟悉CommonDialog,但CommonDialog只能选择文件,想只选择目录,点里面的“确定”就可以
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

Const BIF_RETURNONLYFSDIRS = &H1
Private pidl As Long
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long
Private Declare Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long


Private Sub cmdSearch_Click()
    Dim bi As BROWSEINFO
    Dim r As Long
    Dim pidl As Long
    Dim path As String
    Dim pos As Integer
    '句柄
    bi.hOwner = Me.hwnd
    '展开根目录
    bi.pidlRoot = 0&
    '列表框标题
    bi.lpszTitle = "请选择文件导出目录:"
    '规定只能选择文件夹,其他无效
    bi.ulFlags = BIF_RETURNONLYFSDIRS
    '调用API函数显示列表框
    pidl = SHBrowseForFolder(bi)
    
    '利用API函数获取返回的路径
    path = Space$(512)
    r = SHGetPathFromIDList(ByVal pidl&, ByVal path)
    If r Then
        pos = InStr(path, Chr$(0))
        txtcFilePath.Text = Left(path, pos - 1)
    Else
        txtcFilePath.Text = ""
    End If
End Sub
前面说了"现在的用户不熟悉别的对话框,只熟悉CommonDialog"
你这个代码随便一搜索哪都有
与CommonDialog没什么关系吧


引用 1 楼 leftie 的回复:
VB code
Private Type BROWSEINFO
    hOwner          As Long
    pidlRoot        As Long
    pszDisplayName  As String
    lpszTitle       As String
    ulFlags         As Long
    lpfn         ……

Private Sub Command1_Click()
    CommonDialog1.FileName = ""
    CommonDialog1.InitDir = "c:\windows"
    CommonDialog1.ShowOpen
End Sub

Private Sub Command2_Click()
    CommonDialog1.FileName = ""
    CommonDialog1.InitDir = "c:\program files"
    CommonDialog1.ShowOpen
End Sub


Option Explicit

Private Sub Command1_Click()
    Dim strFileName As String
    CommonDialog1.FileName = ""
    CommonDialog1.ShowOpen
    strFileName = CommonDialog1.FileName
End Sub

Private Sub Form_Load()
    With CommonDialog1
        .Filter = "文本文件|*.txt"
        .InitDir = App.Path
        .DialogTitle = "打开文本文件"
    End With
End Sub
引用 5 楼 veron_04 的回复:
VB code

Option Explicit

Private Sub Command1_Click()
    Dim strFileName As String
    CommonDialog1.FileName = ""
    CommonDialog1.ShowOpen
    strFileName = CommonDialog1.FileName
End Sub

Priv……
+1 楼主需要的是保存选择的目录吧

'添加一个命令按钮Command1
Private Sub Command1_Click()
  On Error GoTo errCancel
  Dim DirPath As String
  With CommonDialog1
    .CancelError = True
    .InitDir = App.Path
    .DialogTitle = "选择目录"
    .Filter = "选择目录|:"
    .FileName = "选择目录"
    .ShowSave
    DirPath = CurDir()
    MsgBox DirPath
  End With
errCancel:
End Sub

有一个BUG就是不能把文件名“选择目录”删除,否则怎么也不能进行下去。
实在不会设置CommonDialog1.Flags属性了,找不到禁止更改文件名的方法...
应该是有办法的。以前见过有这么做的。
但是ls的回答都不是官方的办法。
挂钩CommonDialog应该可以做到。

但是推荐 BrowseForFolder 的办法。 用DriverListBox和DirListBox控件自己搭一个也蛮简单的. 都VB默认控件 "不想要其他的对话框"....
路过帮顶 我给你一个暂时的方法先:
下载 http://download.csdn.net/source/1601550
里面有 ShellCombo ShellListView,配合 Toolbar,可以比较像的模仿出 OpenFileDialg。 Option Explicit
Dim SelPath$, spShell, spFolder, spFolderItem
Private Sub Command1_Click()
    On Error GoTo errhandler '有错误或选择取消返回32755的错误代号,执行错误处理副程序
    Set spShell = CreateObject("Shell.Application") '创建对像
    Set spFolder = spShell.BrowseForFolder(0, "选择目录:", 0, "") '定义spFolder=定义对像展开目录
    Set spFolderItem = spFolder.Self '定义spFolderItem
    SelPath = spFolderItem.Path 'SelPath=选中的spFolderItem文件夹路径
    If Right(SelPath, 1) <> "\" Then SelPath = SelPath & "\" '选择的路径最后面加上\
    MsgBox SelPath
errhandler:      '错误处理副程序
    If Err > 0 Then Exit Sub '有错误或按了取消即退出这个sub
End Sub 我顶上去 画个form模拟下吧 标题写得很清楚,CommonDialog。。。

引用 12 楼 cbm666 的回复:
Option Explicit
Dim SelPath$, spShell, spFolder, spFolderItem
Private Sub Command1_Click()
  On Error GoTo errhandler '有错误或选择取消返回32755的错误代号,执行错误处理副程序
  Set spShell = CreateObject("Shell.Applicatio……
引用 15 楼 za050z 的回复:
标题写得很清楚,CommonDialog。。。



呵呵....我相信我看得懂中文.

Commondialog原始设计的主要目的是用来 "选择文件" 不是用来 "选择目录夹", 虽然可以用另种方式来达到目的, 当然也可行, 就如被单 原来是睡觉用的, 但是不反对你用被单来当 窗帘

12F 的代码只是告诉你另种更方便的思路 这个代码只要见过CommonDialog  只要用过Windows系统的人, 这个代码的界面 也是大家所熟悉的 用户不熟悉别的对话框 用户应该不会如你所想的那么笨吧? “只要用过Windows系统的人, 这个代码的界面 也是大家所熟悉的”
这结论下得太武断了吧?
“用户不熟悉别的对话框 用户应该不会如你所想的那么笨吧?”
用户如果都如你那样不笨,还需要别人做软件么?
用户可以在QQ,Word,Excel这些常用的软件中熟悉CommonDialog,这些常用软件中没有你的代码出现那个界面吧?


引用 17 楼 cbm666 的回复:
引用 15 楼 za050z 的回复:
标题写得很清楚,CommonDialog。。。




呵呵....我相信我看得懂中文.

Commondialog原始设计的主要目的是用来 "选择文件" 不是用来 "选择目录夹", 虽然可以用另种方式来达到目的, 当然也可行, 就如被单 原来是睡觉用的, 但是不反对你用被单来当 窗帘

12F 的代码只是告诉你另种更方便的思路 这个代码……
你这段代码的界面网上到处都是。
LZ应该不会如你所想的那么笨吧?


引用 17 楼 cbm666 的回复:
引用 15 楼 za050z 的回复:
标题写得很清楚,CommonDialog。。。




呵呵....我相信我看得懂中文.

Commondialog原始设计的主要目的是用来 "选择文件" 不是用来 "选择目录夹", 虽然可以用另种方式来达到目的, 当然也可行, 就如被单 原来是睡觉用的, 但是不反对你用被单来当 窗帘

12F 的代码只是告诉你另种更方便的思路 这个代码……
呵呵。。。看来最笨的人还是我

多此一举 当我没来过吧 人家迅雷的保存地址 不也是用的 那个对话框么 BrowseForFolder  用迅雷的人必然会用QQ,反之未必
见#18楼

引用 21 楼 vvsxr 的回复:
人家迅雷的保存地址 不也是用的 那个对话框么 BrowseForFolder
补充:VB ,  API
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,