Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/26: Рейтинг темы: голосов - 26, средняя оценка - 4.92
Заблокирован
1

Обзор папок, вспомнить прежную открытую папку

08.01.2014, 12:00. Показов 5193. Ответов 55
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Сейчас делаю отдельный компонент который бы при нажатии кнопки
показывал папки в отдельном окне

часть информации собрал на англо-язычных сайтах

там в архиве некоторые коментарии переведены
и читаются ужасно, но понять можно

сам то я вот что хочу выяснить
куда записать значение пути чтоб при повторном вызове окна обзора

эта папка была уже открыта, а корневая папка так-же оставалась бы
рабочим столом
ниже текст + архив прилагаю:

код в архиве
Visual Basic
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
Option Explicit
'При нажатии на кнопку вы получите доступ ко всем папкам и файлам
'компьютера. Вы можете ограничить возможность выбирать только папки.
'Наличие BIF-констант в вызываемой функции и определяет такие возможности
'по выбору.
 
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 WhatBrowse
    BIF_RETURNONLYFSDIRS = 1 'Только вернуться каталоги файловой системы.  Если пользователь выбирает папки, которые не являются частью файловой системы, кнопка ОК будет недоступна. // Примечание Кнопка ОК остается включенным для "\ \ сервер" предметов, а также "\ \ сервер \ акцию" и предметов каталога.  Однако, если пользователь выбирает пункт "\ \ сервер", попутный PIDL возвращаемый SHBrowseForFolder , чтобы SHGetPathFromIDList не удается.
    BIF_DONTGOBELOWDOMAIN = 2 'Не включайте сетевые папки ниже уровня домена в управления иерархического диалогового окна.
    BIF_STATUSTEXT = 4 'Включите область состояния в диалоговом окне.  Функция обратного вызова можно установить текст состояния, посылая сообщения в диалоговое окно.  Этот флаг не поддерживается, если BIF_NEWDIALOGSTYLE указан.
    BIF_RETURNFSANCESTORS = 8 'Только вернуться файловой системы предков.  Предком является вложенной, что это под корневой папке в иерархии пространства имен.  Если пользователь выбирает предка корневой папке, что не является частью файловой системы, кнопка ОК будет недоступна.
    BIF_EDITBOX = 16 'Включите элемент управления редактирования в диалоговом окне просмотра, что позволяет пользователю ввести имя элемента.
    BIF_VALIDATE = 32 'Если пользователь недопустимое имя в поле редактирования, диалоговое окно просмотра называет приложения BrowseCallbackProc с сообщением BFFM_VALIDATEFAILED.  Этот флаг игнорируется, если BIF_EDITBOX не уточняется.
    BIF_NEWDIALOGSTYLE = 64 'Используйте новый пользовательский интерфейс.  Установка этого флага предоставляет пользователю с большим диалоговом окне может быть изменен.  Диалоговое окно имеет несколько новых возможностей, в том числе: возможность перетащить и падение в диалоговом окне, изменения порядка, контекстных меню, новые папки, удалять и других команд контекстного меню. // Примечание Если COM инициализируется через CoInitializeEx с COINIT_MULTITHREADED установленным флагом, SHBrowseForFolder терпит неудачу, если BIF_NEWDIALOGSTYLE передается.
    BIF_USENEWUI = 80 'Используйте новый пользовательский интерфейс, в том числе в поле ввода.  Этот флаг эквивалентен BIF_EDITBOX | BIF_NEWDIALOGSTYLE. // Примечание Если COM инициализируется через CoInitializeEx с COINIT_MULTITHREADED установленным флагом, SHBrowseForFolder терпит неудачу, если BIF_USENEWUI передается.
    BIF_BROWSEINCLUDEURLS = 128 'Диалоговое окно просмотра может отображать URL.  Флаги BIF_USENEWUI и BIF_BROWSEINCLUDEFILES также должен быть установлен.  Если любой из этих трех флагов не установлен, то в диалоговом окне Браузер отвергает URL.  Даже когда эти флаги установлены, диалоговое окно обзора отображает URL-адреса, только если папка, которая содержит выбранный элемент поддерживает URL.  Когда папка в IShellFolder :: GetAttributesOf метод называется запросить атрибуты выбранного элемента, папка должна установить флаг атрибута SFGAO_FOLDER.  В противном случае, диалоговое окно просмотра не будет отображать URL.
    BIF_UAHINT = 256 'В сочетании с BIF_NEWDIALOGSTYLE, добавляет намек использования в диалоговое окно, вместо окне редактирования.  BIF_EDITBOX отменяет этот флаг.
    BIF_NONEWFOLDERBUTTON = 512 'Не включайте кнопку New Folder в диалоговом окне просмотра
    BIF_NOTRANSLATETARGETS = 1024 'Если выбранный элемент является сокращением, вернуть PIDL самого ярлыка, а не его цель.
    BIF_BROWSEFORCOMPUTER = 2048 'Только вернуть компьютеры.  Если пользователь выбирает ничего, кроме компьютера, кнопка ОК будет недоступна.
    BIF_BROWSEFORPRINTER = 4096 'Только позвольте выбор принтеров.  Если пользователь выбирает ничего, кроме принтера, кнопка ОК будет недоступна.
    BIF_BROWSEINCLUDEFILES = 8192 'Диалоговое окно просмотра отображает файлы, а также папки.
    BIF_SHAREABLE = 16384 'Диалоговое окно просмотра может отображать совместно используемых ресурсов на удаленных системах.  Это предназначено для приложений, которые хотят выставить удаленных акций на локальной системе.  Флаг BIF_NEWDIALOGSTYLE также должен быть установлен.
    BIF_BROWSEFILEJUNCTIONS = 32768 'Windows 7 и выше.  Разрешить папки переходов, таких как библиотеки или сжатый файл с расширением. Имя архива, чтобы можно просматривать.
End Enum
 
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
 
Public Function fBrowseForFolder(hWndOwner As Long, sPrompt As String, WhatBr) As String
    Dim iNull As Integer
    Dim lpIDList As Long
    Dim lResult As Long
    Dim sPath As String
    Dim udtBI As BrowseInfo
 
    With udtBI
        .hWndOwner = hWndOwner
        .lpszTitle = lstrcat(sPrompt, "")
        .ulFlags = WhatBr
    End With
    lpIDList = SHBrowseForFolder(udtBI)
 
    If lpIDList Then
        sPath = String$(MAX_PATH, 0)
        lResult = SHGetPathFromIDList(lpIDList, sPath)
        Call CoTaskMemFree(lpIDList)
        iNull = InStr(sPath, vbNullChar)
        If iNull Then sPath = Left$(sPath, iNull - 1)
    End If
 
    fBrowseForFolder = sPath
End Function
 
Private Sub Command1_Click()
    Dim sStr As String
    'вместо входящего параметра BIF_BROWSEINCLUDEFILES вы можете использовать одну из
    'BIF-констант, описанных строчкой Private Enum WhatBrowse (смотри в разделе General_Declarations)
    sStr = fBrowseForFolder(hWnd, "Выберите папку, файл, принтер или компьютер", 1 + BIF_EDITBOX)
    Text1.Text = sStr
End Sub
Вложения
Тип файла: rar Обзор папок.rar (3.7 Кб, 47 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.01.2014, 12:00
Ответы с готовыми решениями:

Закрыть папку открытую в проводнике
Подскажите, кто может, как программно закрыть папку открытую в проводнике

Обзор папок
Всем доброго времени суток. Решил установить себе тему на свой Windows, но разочаровавшись...

Обзор папок(в формах)
Нужно добавить в форму обзор папок, на примере. Как это организовать?

Кнопка обзор папок
У меня в окне текстовое поле и кнорка обзор. При нажатии мне нужно реализовать обзор всех папок и...

55
Заблокирован
11.01.2014, 23:28  [ТС] 41
Author24 — интернет-сервис помощи студентам
LSet я так делал, в такой последовательности

но после использования lset пробелы вместо vbNullChar

Добавлено через 1 минуту
привет !

Добавлено через 3 минуты
Цитата Сообщение от The trick Посмотреть сообщение
У тебя весь буфер должен быть MAX_PATH
но глюков то нет!
наверное после задания MAX_PATH внутри процедуры всё обрезается как надо

Добавлено через 4 минуты
вообщето я так делал
Visual Basic
1
2
        .lpstrFile = String$(MAX_PATH, vbNullChar)
        LSet .lpstrFile = FileName$
Добавлено через 1 минуту
и это не работало, вот...

Добавлено через 1 минуту
моя модификация

.lpstrFile = Left(FileName$ & String$(MAX_PATH, 0), MAX_PATH)
1
Модератор
9724 / 3685 / 871
Регистрация: 22.02.2013
Сообщений: 5,530
Записей в блоге: 78
12.01.2014, 00:12 42
Visual Basic
1
LSet ofn.lpstrFile = "D:\Temp\Script8.txt" & vbNullChar
Добавлено через 12 минут
Либо так еще можно
Visual Basic
1
2
    ofn.lpstrFile = String(MAX_PATH - 1, vbNullChar)
    LSet ofn.lpstrFile = "D:\Temp\Script8.txt"
0
Заблокирован
12.01.2014, 13:00  [ТС] 43
The trick
не подскажете
а где можно обновить API мененжер, чтоб
сделать модификацию

GetOpenFileName
на
GetOpenFileNameW

Добавлено через 40 секунд
GetOpenFileNameW
я у себя не нашол

Добавлено через 5 минут
это надо для поддержки юникодных имён
0
Модератор
9724 / 3685 / 871
Регистрация: 22.02.2013
Сообщений: 5,530
Записей в блоге: 78
12.01.2014, 13:11 44
Замени в Alias A на W, и все строки передавай в StrPtr
1
Заблокирован
12.01.2014, 13:15  [ТС] 45
это я понял, что теперь придётся и структуру менять, сейчас залью картинку
какой глюк получился )
Миниатюры
Обзор папок, вспомнить прежную открытую папку  
0
Модератор
9724 / 3685 / 871
Регистрация: 22.02.2013
Сообщений: 5,530
Записей в блоге: 78
12.01.2014, 13:26 46
Что не получаеться? Что-то неправильно делаешь
Visual Basic
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
Option Explicit
 
Private Type OPENFILENAME
  lStructSize As Long
  hwndOwner As Long
  hInstance As Long
  lpstrFilter As Long 'String
  lpstrCustomFilter As Long 'String
  nMaxCustFilter As Long
  nFilterIndex As Long
  lpstrFile As Long 'String
  nMaxFile As Long
  lpstrFileTitle As Long 'String
  nMaxFileTitle As Long
  lpstrInitialDir As Long 'String
  lpstrTitle As Long 'String
  flags As Long
  nFileOffset As Integer
  nFileExtension As Integer
  lpstrDefExt As Long 'String
  lCustData As Long
  lpfnHook As Long
  lpTemplateName As Long 'String
End Type
Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameW" (pOpenfilename As OPENFILENAME) As Long
 
Private Sub Form_Load()
    Dim ofn As OPENFILENAME
    Dim Title As String, Out As String
    Dim Filter As String
    
    
    ofn.nMaxFile = 260  ' Äëÿ òåñòà
    Out = String(260, vbNullChar)
    Title = "Îòêðûòü ôàéë"
    Filter = "Êàðòèíêè" & vbNullChar & "*.jpg;*.bmp" & vbNullChar
    ofn.hwndOwner = Me.hWnd
    ofn.lpstrTitle = StrPtr(Title)
    ofn.lpstrFile = StrPtr(Out)
    ofn.lStructSize = Len(ofn)
    ofn.lpstrFilter = StrPtr(Filter)
    GetOpenFileName ofn
End Sub
1
Заблокирован
12.01.2014, 13:45  [ТС] 47
да спасибо, меняю, у меня скоро мозоли на пальцах, от переделок велезут )

Добавлено через 9 минут
а как получить возвращаемое значение, ведь теперь это число ?
0
Модератор
9724 / 3685 / 871
Регистрация: 22.02.2013
Сообщений: 5,530
Записей в блоге: 78
12.01.2014, 13:46 48
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
а как получить возвращаемое значение, ведь теперь это число ?
Ты же передал StrPtr, значит в эту переменную возвратится путь
0
Заблокирован
12.01.2014, 13:52  [ТС] 49
Как текст получить ?
0
Модератор
9724 / 3685 / 871
Регистрация: 22.02.2013
Сообщений: 5,530
Записей в блоге: 78
12.01.2014, 13:59 50
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
Как текст получить ?
В моем примере после вызова функции поставь
Visual Basic
1
MsgBox Out
Добавлено через 4 минуты
А точнее
Visual Basic
1
Out = Left$(Out, InStr(1, Out, vbNullChar) - 1)
1
Заблокирован
12.01.2014, 14:02  [ТС] 51
Получилось ! там я добавил Out в процедуру

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Function ShowOpen$(hwnd&, OFNFlags&)
    Dim out$
    With OFN
        out = String(MAX_PATH, vbNullChar)
        .lStructSize = Len(OFN)
        .hInstance = App.hInstance
        .flags = OFNFlags
        .lpstrFile = StrPtr(out)
'        .lpstrFile = StrPtr(String$(MAX_PATH, 0))
        .hwndOwner = hwnd
        .nMaxFile = MAX_PATH
        .lpstrFileTitle = StrPtr(String$(MAX_PATH, 0))
        .nMaxFileTitle = MAX_PATH
        GetOpenFileName OFN
        MsgBox out '=============
1
Заблокирован
12.01.2014, 19:47  [ТС] 52
И вот что вышло !

всё работает четко
скомпилировал у себя

компилировать лучше проекты по отдельности

в любом случае прилагаю исходники всегда можно сделать по своему

вот он, мой шедевр !
Миниатюры
Обзор папок, вспомнить прежную открытую папку  
Вложения
Тип файла: zip Файловые контролы.zip (67.8 Кб, 13 просмотров)
1
Заблокирован
12.01.2014, 20:01  [ТС] 53
Теперь я буду делать дополнительные диалоги
такие как цвет, шрифт, найти-заменить, и тд ....
0
Заблокирован
12.01.2014, 22:24  [ТС] 54
Если проект не запустится вот архивчик
с файлом командного сценария .CMD
просто переместите его в папку FileControls и запустите

забыл сразу туда его положить )

вот эта запчасть с инструкцией...
Вложения
Тип файла: zip регистрация контрола.zip (664 байт, 7 просмотров)
1
Заблокирован
13.01.2014, 05:36  [ТС] 55
в будущем обязательно предусмотрю этот нюанс )
0
Заблокирован
16.01.2014, 22:57  [ТС] 56

Ну вот, всё готово!
весь комплекс я выложил здесь
не прошло и пол года )

в следующих релизах сделаю справку
0
16.01.2014, 22:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.01.2014, 22:57
Помогаю со студенческими работами здесь

Как можно создать древесный обзор папок в своём окне?
Как можно создать древесный обзор папок в своём окне, на подобию того из Windows Explorer или...

Убрать появление окна "Обзор папок" при запуске Лазаруса
Уважаемые форумчане, вопрос такой, при запуске Лазарус вылетает окно "Обзор папок", сильно это не...

Открыть диалог "обзор папок"
Вопрос не совсем имеет отношение к cmd\bat, но все же спрошу здесь: как через rundll32 открыть...

Найти папку с наибольшим числом папок
Помогите, пожалуйста, в универе задали следующее: "Найти папку с наибольшим числом папок...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
56
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru