Как в CommonDialog открыть папку? - VB

Узнай цену своей работы

Формулировка задачи:

Хочу узнать как можно в CommonDialog открыть папку (Указать её путь). Я оттолкнулся от CommonDialog.FileName программно отбросил имя открывамого файла и таким образом получил путь к папке.
Листинг программы
  1. Private Sub Command3_Click()
  2. Dim prob As String: otbras As Integer: nach_schet As Integer
  3. Dim prob1 As String: probila As String
  4. Dim prob2 As String
  5. Dim chisla As Integer: Dim vseti As String
  6. prob = ':'
  7. probila = ' ': vseti = '\ '
  8. nach_schet = 0: chisla = 1
  9. On Error GoTo ErrorHandler
  10. CommonDialog1.ShowOpen
  11. If ShowOpen = 0 Then prob1 = CommonDialog1.FileName
  12. Do Until prob = Left(prob2, 1) ' Ищет значёк :
  13. If probila = Left(prob2, 1) Then nach_schet = 1 ' Ищет значёк (длину файла)
  14. If vseti = Left(prob2, 2) Then otbras = otbras - 1: Exit Do 'Исли открываем по сети то опрашиваем \
  15. otbras = otbras + nach_schet
  16. prob2 = Right(prob1, chisla)
  17. chisla = chisla + 1
  18. Loop
  19. Text1 = Left(prob1, otbras + 1) 'Отбрасывает в пути ******** те. имя файла
  20. Exit Sub
  21. ErrorHandler:
  22. End Sub
Но это всё реальный геморрой. Подскажите как сократить код. Или какую-то функцию. А может заменить CommonDialog чем либо другим. p.s.Воспользовался CommonDialog потому что есть доступ к сети. А к примеру DriveListBox видит только ситевые диски, а не рабочую группу.

Решение задачи: «Как в CommonDialog открыть папку?»

textual
Листинг программы
  1. Private Type BrowseInfo
  2. hWndOwner As Long
  3. pIDLRoot As Long
  4. pszDisplayName As Long
  5. lpszTitle As Long
  6. ulFlags As Long
  7. lpfnCallback As Long
  8. lParam As Long
  9. iImage As Long
  10. End Type
  11.  
  12. Public Enum BrowseType
  13. BrowseForFolders = &H1
  14. BrowseForComputers = &H1000
  15. BrowseForPrinters = &H2000
  16. BrowseForEverything = &H4000
  17. End Enum
  18.  
  19. Public Enum FolderType
  20. CSIDL_BITBUCKET = 10
  21. CSIDL_CONTROLS = 3
  22. CSIDL_DESKTOP = 0
  23. CSIDL_DRIVES = 17
  24. CSIDL_FONTS = 20
  25. CSIDL_NETHOOD = 18
  26. CSIDL_NETWORK = 19
  27. CSIDL_PERSONAL = 5
  28. CSIDL_PRINTERS = 4
  29. CSIDL_PROGRAMS = 2
  30. CSIDL_RECENT = 8
  31. CSIDL_SENDTO = 9
  32. CSIDL_STARTMENU = 11
  33. End Enum
  34.  
  35. Private Const MAX_PATH = 260
  36.  
  37. Private Declare Sub CoTaskMemFree Lib 'ole32.dll' (ByVal hMem As Long)
  38. Private Declare Function lstrcat Lib 'kernel32.dll' Alias 'lstrcatA' (ByVal lpString1 As String, ByVal lpString2 As String) As Long
  39. Private Declare Function SHBrowseForFolder Lib 'shell32.dll' (lpbi As BrowseInfo) As Long
  40. Private Declare Function SHGetPathFromIDList Lib 'shell32.dll' (ByVal pidList As Long, ByVal lpBuffer As String) As Long
  41. Private Declare Function SHGetSpecialFolderLocation Lib 'shell32.dll' (ByVal hWndOwner As Long, ByVal nFolder As Long, ListId As Long) As Long
  42.  
  43. Public Function BrowseFolders(hWndOwner As Long, sMessage As String, Browse As BrowseType, ByVal RootFolder As FolderType) As String
  44. Dim Nullpos As Integer
  45. Dim lpIDList As Long
  46. Dim res As Long
  47. Dim sPath As String
  48. Dim BInfo As BrowseInfo
  49. Dim RootID As Long
  50. SHGetSpecialFolderLocation hWndOwner, RootFolder, RootID
  51. BInfo.hWndOwner = hWndOwner
  52. BInfo.lpszTitle = lstrcat(sMessage, '')
  53. BInfo.ulFlags = Browse
  54. If RootID <> 0 Then BInfo.pIDLRoot = RootID
  55. lpIDList = SHBrowseForFolder(BInfo)
  56. If lpIDList <> 0 Then
  57. sPath = String(MAX_PATH, 0)
  58. res = SHGetPathFromIDList(lpIDList, sPath)
  59. Call CoTaskMemFree(lpIDList)
  60. Nullpos = InStr(sPath, vbNullChar)
  61. If Nullpos <> 0 Then
  62. sPath = Left(sPath, Nullpos - 1)
  63. End If
  64. End If
  65. BrowseFolders = sPath
  66. End Function
  67.  
  68. Private Sub Command1_Click()
  69. 'следующие вызовы функции сработали нормально
  70. MsgBox BrowseFolders(hWnd, 'Select a Folder', BrowseForFolders, CSIDL_DESKTOP) '+весь компьютер
  71. 'MsgBox BrowseFolders(hWnd, 'Select a Folder', BrowseForFolders, CSIDL_DRIVES) '+только устройства
  72. 'MsgBox BrowseFolders(hWnd, 'Select a Folder', BrowseForFolders, CSIDL_NETHOOD) '+только сеть
  73. 'MsgBox BrowseFolders(hWnd, 'Select a Folder', BrowseForFolders, CSIDL_PROGRAMS) '+папка Программы
  74. 'MsgBox BrowseFolders(hWnd, 'Select a Folder', BrowseForFolders, CSIDL_STARTMENU) '+Главное меню
  75.  
  76. 'результат действия следующих кодов вызвал недоумение...
  77. 'MsgBox BrowseFolders(hWnd, 'Select a Folder', BrowseForFolders, CSIDL_BITBUCKET) '-корзина
  78. 'MsgBox BrowseFolders(hWnd, 'Select a Folder', BrowseForFolders, CSIDL_CONTROLS) '-панель управления
  79. 'MsgBox BrowseFolders(hWnd, 'Select a Folder', BrowseForFolders, CSIDL_FONTS) '-папка со шрифтами
  80. 'MsgBox BrowseFolders(hWnd, 'Select a Folder', BrowseForFolders, CSIDL_NETWORK) '-NetHood

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.889 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут