Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Как запустить окно диалога выбора каталогов (пути) Добавлено: 17.08.08 19:01  

Автор вопроса:  Павел
Можно ли с помощью OpenFileDialog (VB7) выбирать не файлы, а папки? Если да - то как? Если нет - то подскажите другой способ запуска окна диалога выбора папки.

Ответить

  Ответы Всего ответов: 16  

Номер ответа: 1
Автор ответа:
 Серёга



ICQ: 262809473 

Вопросов: 17
Ответов: 561
 Web-сайт: houselab.narod.ru
 Профиль | | #1
Добавлено: 17.08.08 20:51
Ничего не знаю про VB7, поэтому даю код для VB6 (может пригодится)
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 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-сайт: winandfx.narod.ru
 Профиль | | #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 я не соображу в каком месте кода надо послать это сообщение и что такое
BFFM_SETSELECTION

Ответить

Номер ответа: 10
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #10
Добавлено: 18.08.08 16:06
это константа
а sendmessage - это апи-функция.
Попробуй это:
http://www.vbforums.com/showthread.php?t=179025

Ответить

Номер ответа: 11
Автор ответа:
 Серёга



ICQ: 262809473 

Вопросов: 17
Ответов: 561
 Web-сайт: houselab.narod.ru
 Профиль | | #11
Добавлено: 18.08.08 17:24
http://www.vbforums.com/showthread.php?t=179025

- интересная фигня :)))

Спасибо за наводку!

Ответить

Номер ответа: 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 работает. Это то что мне нужно. Спасибо всем.

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам