Страница: 1 | 2 |
Вопрос: Как запустить окно диалога выбора каталогов (пути)
Добавлено: 17.08.08 19:01
Автор вопроса: Павел
Можно ли с помощью OpenFileDialog (VB7) выбирать не файлы, а папки? Если да - то как? Если нет - то подскажите другой способ запуска окна диалога выбора папки.
Ответы
Всего ответов: 16
Номер ответа: 1
Автор ответа:
Серёга
ICQ: 262809473
Вопросов: 17
Ответов: 561
Web-сайт:
Профиль | | #1
Добавлено: 17.08.08 20:51
Ничего не знаю про VB7, поэтому даю код для VB6 (может пригодится)
hWndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type
Private Const MAX_PATH = 260
Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
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 Function ShowDialogBrouseFolder(Title As String) As String
Dim iNull As Integer, lpIDList As Long, lResult As Long
Dim sPath As String, udtBI As BrowseInfo
With udtBI
.hWndOwner = Me.hWnd
.lpszTitle = lstrcat(Title, ""
.ulFlags = BIF_RETURNONLYFSDIRS
End With
lpIDList = SHBrowseForFolder(udtBI)
If lpIDList Then
sPath = String$(MAX_PATH, 0)
SHGetPathFromIDList lpIDList, sPath
CoTaskMemFree lpIDList
iNull = InStr(sPath, vbNullChar)
If iNull Then
sPath = Left$(sPath, iNull - 1)
End If
End If
ShowDialogBrouseFolder = sPath
End Function
Private Sub Command1_Click()
MsgBox ShowDialogBrouseFolder("select folder"
End Sub
Номер ответа: 2
Автор ответа:
Павел
Вопросов: 9
Ответов: 15
Профиль | | #2
Добавлено: 17.08.08 21:53
Спасибо. Код работает нормально (после переделки в VB7), но при открытии диалог начинается с "мой компьютер" а хотелось бы с определенной папки или хотя бы с текущей папки.
Номер ответа: 3
Автор ответа:
Smith
ICQ: adamis@list.ru
Вопросов: 153
Ответов: 3632
Профиль | | #3
Добавлено: 17.08.08 23:35
'всё необходимое для выбора папки
Private Type BrowseInfo
hWndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type
Private Enum BrowseType
BrowseForFolders = &H1
BrowseForComputers = &H1000
BrowseForPrinters = &H2000
BrowseForEverything = &H4000
End Enum
Private Enum FolderType
CSIDL_BITBUCKET = 10
CSIDL_CONTROLS = 3
CSIDL_DESKTOP = 0
CSIDL_DRIVES = 17
CSIDL_FONTS = 20
CSIDL_NETHOOD = 18
CSIDL_NETWORK = 19
CSIDL_PERSONAL = 5
CSIDL_PRINTERS = 4
CSIDL_PROGRAMS = 2
CSIDL_RECENT = 8
CSIDL_SENDTO = 9
CSIDL_STARTMENU = 11
End Enum
Private Const MAX_PATH = 260
Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)
Private Declare Function lstrcat Lib "kernel32.dll" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
Private Declare Function SHBrowseForFolder Lib "shell32.dll" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" (ByVal pidList As Long, ByVal lpBuffer As String) As Long
Private Declare Function SHGetSpecialFolderLocation Lib "shell32.dll" (ByVal hWndOwner As Long, ByVal nFolder As Long, ListId As Long) As Long
' функция выбора папки
Private Function BrowseFolders(hWndOwner As Long, sMessage As String, Browse As BrowseType, ByVal RootFolder As FolderType) As String
Dim Nullpos As Integer
Dim lpIDList As Long
Dim res As Long
Dim sPath As String
Dim BInfo As BrowseInfo
Dim RootID As Long
SHGetSpecialFolderLocation hWndOwner, RootFolder, RootID
BInfo.hWndOwner = hWndOwner
BInfo.lpszTitle = lstrcat(sMessage, ""
BInfo.ulFlags = Browse
If RootID <> 0 Then BInfo.pIDLRoot = RootID
lpIDList = SHBrowseForFolder(BInfo)
If lpIDList <> 0 Then
sPath = String(MAX_PATH, 0)
res = SHGetPathFromIDList(lpIDList, sPath)
Call CoTaskMemFree(lpIDList)
Nullpos = InStr(sPath, vbNullChar)
If Nullpos <> 0 Then
sPath = Left(sPath, Nullpos - 1)
End If
End If
BrowseFolders = sPath
End Function
Номер ответа: 4
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #4
Добавлено: 18.08.08 02:17
насколько я вижу, нужно посылать сообщение
SendMessage hWnd, BFFM_SETSELECTION, 1, ByVal strInitDir
где strInitDir - нужная папка
hWnd видимо хендл диалога выбора папок
Номер ответа: 5
Автор ответа:
Павел
Вопросов: 9
Ответов: 15
Профиль | | #5
Добавлено: 18.08.08 07:12
Извиняюсь за торможение, но в каком месте программы приведенной выше (от Smith-а) можно конкретно вставить путь для открытия диалога именно с этой папке
Номер ответа: 6
Автор ответа:
Smith
ICQ: adamis@list.ru
Вопросов: 153
Ответов: 3632
Профиль | | #6
Добавлено: 18.08.08 08:31
Я просто дал более полный вариант тойже функции что и у Серёги, но в коде нет готового решения.
Кстати почему всётаки не попробовать ответ Winanda?
Я бы поступил именно так.
Номер ответа: 7
Автор ответа:
GDK
Вопросов: 13
Ответов: 348
Профиль | | #7
Добавлено: 18.08.08 13:54
Есть проверенный код. Только внешний вид кривоватый и папки выбираются как в "проводнике". Проверялось в VBA6. Если всё ещё надо - могу скопировать сюда.
Номер ответа: 8
Автор ответа:
Smith
ICQ: adamis@list.ru
Вопросов: 153
Ответов: 3632
Профиль | | #8
Добавлено: 18.08.08 15:13
Кидай. Не помешает.
Номер ответа: 9
Автор ответа:
Павел
Вопросов: 9
Ответов: 15
Профиль | | #9
Добавлено: 18.08.08 15:19
GDK скопируй сюда пожалуйста, а что касается подсказки Winanda я не соображу в каком месте кода надо послать это сообщение и что такое
Номер ответа: 10
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #10
Добавлено: 18.08.08 16:06
это константа
а sendmessage - это апи-функция.
Попробуй это:
http://www.vbforums.com/showthread.php?t=179025
Номер ответа: 11
Автор ответа:
Серёга
ICQ: 262809473
Вопросов: 17
Ответов: 561
Web-сайт:
Профиль | | #11
Добавлено: 18.08.08 17:24
- интересная фигня ))
Спасибо за наводку!
Номер ответа: 12
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #12
Добавлено: 18.08.08 20:59
Стоп, а чем не подходит класс FolderBrowserDialog?
Номер ответа: 13
Автор ответа:
Павел
Вопросов: 9
Ответов: 15
Профиль | | #13
Добавлено: 19.08.08 18:41
Winand спасибо за ссылку это по моему решение моего вопроса (только нужно время что бы разобраться и перевести его на VB7), а вот что предложил Steel Brand это то о чем я мечтал только не знаю где (или как) взять этот класс FolderBrowserDialog. Подскажите, пожалуйста.
Номер ответа: 14
Автор ответа:
Павел
Вопросов: 9
Ответов: 15
Профиль | | #14
Добавлено: 20.08.08 13:01
Оказывается у меня установлена старая версия Framework и VB.NET. Замена их на новые позволит использовать класс FolderBrowserDialog, который решит мою проблему. Спасибо всем за помощь - думаю, мой вопрос будет исчерпан.
Номер ответа: 15
Автор ответа:
Павел
Вопросов: 9
Ответов: 15
Профиль | | #15
Добавлено: 20.08.08 14:23
Установил Framework более поздней версии. Теперь FolderBrowserDialog работает. Это то что мне нужно. Спасибо всем.