Выбрать каталог с помощью API, OpenFileDialog

Программирование на Visual Basic for Applications
devel
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 19.02.2003 (Ср) 13:38
Откуда: Russia

Выбрать каталог с помощью API, OpenFileDialog

Сообщение devel » 22.03.2010 (Пн) 14:05

Добрый день!

Подскажите, пожалуйста, как при помощи API функций сделать так, чтобы юзеру открывалось окно проводника и он имел возможность выбрать каталог (именно, каталог, а не файл), а затем выбранное значение подставлялось в поле формы.

Через OpenFileDialog путь к файлу споконо получаю, а как сделать так, чтобы получать путь к выбранному каталогу?
Devel

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Выбрать каталог с помощью API, OpenFileDialog

Сообщение viter.alex » 22.03.2010 (Пн) 15:10

Код для функции:
Код: Выделить всё
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 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 Const BIF_RETURNONLYFSDIRS = &H1

Public Function BrowseFolder(szDialogTitle As String) As String
  Dim X As Long, bi As BROWSEINFO, dwIList As Long
  Dim szPath As String, wPos As Integer
 
    With bi
        .hOwner = Application.Hwnd
        .lpszTitle = szDialogTitle
        .ulFlags = BIF_RETURNONLYFSDIRS
    End With
   
    dwIList = SHBrowseForFolder(bi)
    szPath = Space$(512)
    X = SHGetPathFromIDList(ByVal dwIList, ByVal szPath)
   
    If X Then
        wPos = InStr(szPath, Chr(0))
        BrowseFolder = Left$(szPath, wPos - 1)
    Else
        BrowseFolder = vbNullString
    End If
End Function

Пример использования:
Код: Выделить всё
Sub test()
  MsgBox BrowseFolder("Пример диалога выбора папки")
End Sub

Только зачем использовать API если есть Application.FileDialog(msoFileDialogFolderPicker)?
Лучше день потерять — потом за пять минут долететь!

devel
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 19.02.2003 (Ср) 13:38
Откуда: Russia

Re: Выбрать каталог с помощью API, OpenFileDialog

Сообщение devel » 22.03.2010 (Пн) 15:42

Действительно работает! Большое спасибо!
Devel

MYF
Новичок
Новичок
Аватара пользователя
 
Сообщения: 44
Зарегистрирован: 12.05.2006 (Пт) 6:38
Откуда: Череповец

Сообщение MYF » 20.07.2010 (Вт) 21:47

Замечательно работает.

А где подрихтовать, чтобы диалог открывался с заранее заданной папки?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re:

Сообщение iGrok » 20.07.2010 (Вт) 23:50

MYF писал(а):Замечательно работает.

А где подрихтовать, чтобы диалог открывался с заранее заданной папки?


Кинуть в bi.lpfn адрес коллбэк-функции, которая в ответ на BFFM_INITIALIZED пошлёт обратно сообщение BFFM_SETSELECTION с нужным адресом каталога.

http://msdn.microsoft.com/en-us/library/bb762115.aspx
http://msdn.microsoft.com/en-us/library/bb773205.aspx
http://msdn.microsoft.com/en-us/library/bb762598.aspx
label:
cli
jmp label


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 56

    TopList