powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Диалог Browse for Folder (Выбор папки) BIF_NEWDIALOGSTYLE вопросы.
4 сообщений из 4, страница 1 из 1
Диалог Browse for Folder (Выбор папки) BIF_NEWDIALOGSTYLE вопросы.
    #37343632
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мучаю в режиме теста.
Дабы не быть голословным, пример прилагается.
Мучаю кнопку CommandTest, т.е. ф-цию
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
Private Function GetBrowseForFolder(hwndOwner As Long) As String
   Dim bi As BROWSEINFO
   Dim pidl As Long
   
   Dim lResult As Long
   Dim sPath As String
   Dim iNull As Integer
   
   If SHGetSpecialFolderLocation(hwndOwner, _
                                 CSIDL_DRIVES, _
                                 pidl) = NOERROR Then
     'fill in the required members
      With bi
         .hOwner = hwndOwner
         '.pidlRoot = pidl
         .pszDisplayName = Space$(MAX_PATH)
         .lpszTitle = "Select a folder for routed incoming files:"
         .ulFlags = BIF_RETURNONLYFSDIRS Or BIF_NEWDIALOGSTYLE
         '.ulFlags = BIF_BROWSEFORCOMPUTER
         'If bNewDialog Then .ulFlags = .ulFlags Or BIF_NEWDIALOGSTYLE
         'If bNoNewFolder Then .ulFlags = .ulFlags Or BIF_NONEWFOLDERBUTTON
      End With
      pidl = SHBrowseForFolder(bi)
      If pidl <>  0  Then
            sPath = String$(MAX_PATH,  0 )
            lResult = SHGetPathFromIDList(pidl, sPath)
            Call CoTaskMemFree(pidl)
            iNull = InStr(sPath, vbNullChar)
            If iNull Then sPath = Left$(sPath, iNull -  1 )
      End If  'If pidl
      'If cancel was pressed, sPath = ""
      GetBrowseForFolder = sPath
   End If  'If SHGetSpecialFolderLocation
End Function

Пока определился что мне нужен стиль Or BIF_NEWDIALOGSTYLE
Вопросы мучают такие:
1) Как сделать так, чтобы при старте была выбрана(и выделена) папка "My Computer"?
CSIDL_DRIVES -это понятно
но
Код: plaintext
1.
SHGetSpecialFolderLocation(hwndOwner, CSIDL_DRIVES, pidl)
.pidlRoot = pidl
ставит "My Computer" в ROOT дерева, а мне надо только выбрать, а не менять структуру дерева.

2) Как сделать так, чтобы при старте была выбрана(и выделена) другая произвольная папка, выбранная пользователем ранее ?

3) Нужен .ulFlags = BIF_RETURNONLYFSDIRS
http://msdn.microsoft.com/en-us/library/bb762115(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/bb773205(v=vs.85).aspx
Only return file system directories. If the user selects folders that are not part of the file system, the OK button is grayed.
При использовании BIF_NEWDIALOGSTYLE
ни фига она не grayed, т.е. остается Enabled
на "невменяемых" узлах типа "Мой компьютер" и "Сетевое окружение".
Что делать?
4) Public Const MAX_PATH = 260
А если это "ну очень длинный путь"?
Забабахать =1024 или "все путем"?
Для быстрой проверки бабахнул =26, и обломался - строка обрезалась.

Есть основательное подозрение, что нужен BFFCALLBACK Function:
http://msdn.microsoft.com/en-us/library/bb762598(v=vs.85).aspx
Но тогда желателен пример на VB6, выходные честно тратить на это не охота..
...
Рейтинг: 0 / 0
Диалог Browse for Folder (Выбор папки) BIF_NEWDIALOGSTYLE вопросы.
    #37344796
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Есть основательное подозрение, что нужен BFFCALLBACK Function:
Видимо так и есть.
Дмитрий772) Как сделать так, чтобы при старте была выбрана(и выделена) другая произвольная папка, выбранная пользователем ранее ?
С этим справился
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
   lParam As String             'extra info passed back in callbacks

      With bi
...
         .lParam = InitPath
         .lpfn = GetPointer(AddressOf BFFCallback)
...
    If uMsg = BFFM_INITIALIZED Then
        Debug.Print "BFFM_INITIALIZED"
        If (lpData <>  0 ) Then
            Debug.Print "lpData <> 0"
            If (lstrlen(lpData) <>  0 ) Then
                BFFSetPath hwnd, lpData
'   Use to set the dialog's selected path from the BFF callback
'   This method uses the standard path, but a PIDL can be used
'   as well.
'
Public Sub BFFSetPath(ByVal hWndDialog As Long, ByVal Path As String)

    Call SendMessage(hWndDialog, BFFM_SETSELECTION,  1 , ByVal Path)

End Sub
Но уже вычитал про какой-то подвох с прокруткой на выделенную папку на WIN 7. Пока не проверял.

Дмитрий773) Нужен .ulFlags = BIF_RETURNONLYFSDIRS
http://msdn.microsoft.com/en-us/library/bb762115(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/bb773205(v=vs.85).aspx
Only return file system directories. If the user selects folders that are not part of the file system, the OK button is grayed.
При использовании BIF_NEWDIALOGSTYLE
ни фига она не grayed, т.е. остается Enabled
на "невменяемых" узлах типа "Мой компьютер" и "Сетевое окружение".
Что делать?

Справился, но не совсем!!!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    ElseIf uMsg = BFFM_SELCHANGED Then
        Debug.Print "BFFM_SELCHANGED" & " lparam=" & lParam
        If lParam <>  0  Then
            sPath = String$(MAX_PATH,  0 )
            lResult = SHGetPathFromIDList(lParam, sPath)
            'Call CoTaskMemFree(lParam)
            iNull = InStr(sPath, vbNullChar)
            If iNull Then sPath = Left$(sPath, iNull -  1 )
            Debug.Print "sPath=" & sPath
            BFFEnableOKButton hwnd, CBool(Len(sPath))
        End If  'If pidl
    End If
    
End Function

'   Used to enable or disable the dialog's OK button from the BFF callback
'
Public Sub BFFEnableOKButton(ByVal hWndDialog As Long, ByVal Enable As Boolean)
    Call SendMessage(hWndDialog, BFFM_ENABLEOK,  0 , ByVal Abs(Enable))
End Sub

Проблемы:
1. Работает только в IDE, но в exe почему-то кнопка OK не disable-ится. Странно
Хотя нет...фу. Заработало.
2. 'Call CoTaskMemFree(lParam) -нужна ли она здесь? Если оставить, то все гнусно рушится (системные ошибки памяти)


Дмитрий771) Как сделать так, чтобы при старте была выбрана(и выделена) папка "My Computer"? ..
А вот здесь ничего не получается,
pidl вроде находит но код что ниже не фурычит
Код: plaintext
1.
2.
                SHGetSpecialFolderLocation hwnd, CSIDL_DRIVES, pidl
                Debug.Print "pidl=" & pidl
                Call SendMessage(hwnd, BFFM_SETSELECTION,  1 , ByVal pidl)

Текущий тест прилагаю.
...
Рейтинг: 0 / 0
Диалог Browse for Folder (Выбор папки) BIF_NEWDIALOGSTYLE вопросы.
    #37344800
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри, вот пример, где выбор начальной папки работает через SendMessage, с "функцией" выбора что-то не то.
...
Рейтинг: 0 / 0
Диалог Browse for Folder (Выбор папки) BIF_NEWDIALOGSTYLE вопросы.
    #37345295
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий771) Как сделать так, чтобы при старте была выбрана(и выделена) папка "My Computer"? ..
Добил вроде. Для пидла 0 в SendMessage надо ставить + всякие нечестные игры с Long-String-Any.
+
Дмитрий77Но уже вычитал про какой-то подвох с прокруткой на выделенную папку на WIN 7...
Есть такое дело.
http://connect.microsoft.com/VisualStudio/feedback/details/518103/bffm-setselection-does-not-work-with-shbrowseforfolder-on-windows-7
Через Sleep(200)+PostMessage(дубликат) грубо лечится. Скорее всего какие-то стилевые эффекты с TreeView типа фейдера, но с этим заморачиваться здесь желания нет. Тем более эта фишка в родных Microsoft-овских прогах на Win7 глючит на хитрых путях..(проверил).

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
Private Function BFFCallback(ByVal hWnd As Long, ByVal uMsg As Long, ByVal lParam As Long, ByVal lpData As Long) As Long
    Dim sPath As String
    Dim lResult As Long
    Dim pidl As Long
    Dim iNull As Integer

    If uMsg = BFFM_INITIALIZED Then
        If (lpData <>  0 ) Then
            If (lstrlen(lpData) <>  0 ) Then
                BFFSetPath hWnd, lpData, True 'InitPath (as String)
                '(!) в случае ошибочного пути автоматически выделяется "Мои документы"
            End If
        Else
            'в случае пустого(!) пути
            SHGetSpecialFolderLocation hWnd, CSIDL_DRIVES, pidl 'получаем pidl для "My Computer"
            BFFSetPath hWnd, pidl, False '"My Computer" (pidl)
            'BFFEnableOKButton hwnd, False 'чтобы OK была сразу disabled -а надо ли?
        End If
    ElseIf uMsg = BFFM_SELCHANGED Then
        If lParam <>  0  Then
            sPath = String$(MAX_PATH,  0 )
            lResult = SHGetPathFromIDList(lParam, sPath)
            'Call CoTaskMemFree(lParam)
            iNull = InStr(sPath, vbNullChar)
            If iNull Then sPath = Left$(sPath, iNull -  1 )
            BFFEnableOKButton hWnd, CBool(Len(sPath)) 'чтобы OK была disabled для My Computer/My Network etc.
        End If
    End If
End Function

'   Used to enable or disable the dialog's OK button from the BFF callback
Public Sub BFFEnableOKButton(ByVal hWndDialog As Long, ByVal Enable As Boolean)
    Call SendMessageLong(hWndDialog, BFFM_ENABLEOK,  0 , ByVal Abs(Enable))
End Sub

'   Use to set the dialog's selected path from the BFF callback
'   This method uses the standard path, but a PIDL can be used
'   as well.
'   UseStrPath=true -реальный путь как String; UseStrPath=false -pidl виртуальной папки ("My computer")
Public Sub BFFSetPath(ByVal hWndDialog As Long, ByVal Path As String, ByVal UseStrPath As Boolean)
    Call SendMessageLong(hWndDialog, BFFM_SETSELECTION, Abs(UseStrPath), ByVal Path)
    If IsWin7 Then 'если этого не делать, то скроллинг на Win7 не гарантирован
        'http://connect.microsoft.com/VisualStudio/feedback/details/518103/bffm-setselection-does-not-work-with-shbrowseforfolder-on-windows-7
        Sleep  200 
        Call PostMessageLong(hWndDialog, BFFM_SETSELECTION, Abs(UseStrPath), ByVal Path)
    End If
End Sub

Дмитрий774) Public Const MAX_PATH = 260...
Да и бог с ним...
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Диалог Browse for Folder (Выбор папки) BIF_NEWDIALOGSTYLE вопросы.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]