Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/92: Рейтинг темы: голосов - 92, средняя оценка - 4.64
 Аватар для Bati4eli
617 / 17 / 8
Регистрация: 05.05.2012
Сообщений: 221
Записей в блоге: 11

Окно выбора директории (папки)

30.08.2013, 10:32. Показов 19650. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Давно ищу в интернете нормальное диалоговое окно выбора директории (по типа того что предоставляет CommonDialog для выбора файлов). Кстати на VBA такая вещь присутствует!
Вот пример на VBA :
Кликните здесь для просмотра всего текста

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
Public Enum SpecialFolderIDs
    sfidDESKTOP = &H0   'рабочий стол
    sfidPROGRAMS = &H2
    sfidPERSONAL = &H5
    sfidFAVORITES = &H6
    sfidSTARTUP = &H7
    sfidRECENT = &H8
    sfidSENDTO = &H9
    sfidSTARTMENU = &HB
    sfidDESKTOPDIRECTORY = &H10
    sfidNETHOOD = &H13
    sfidFONTS = &H14
    sfidTEMPLATES = &H15
    sfidCOMMON_STARTMENU = &H16
    sfidCOMMON_PROGRAMS = &H17
    sfidCOMMON_STARTUP = &H18
    sfidCOMMON_DESKTOPDIRECTORY = &H19
    sfidAPPDATA = &H1A
    sfidPRINTHOOD = &H1B
    sfidProgramFiles = &H10000
    sfidCommonFiles = &H10001
End Enum
Private Declare Function SHGetSpecialFolderLocation Lib "shell32" (ByVal hwndOwner As Long, ByVal nFolder As SpecialFolderIDs, ByRef pIdl As Long) As Long
Private Declare Function SHGetPathFromIDListA Lib "shell32" (ByVal pIdl As Long, ByVal pszPath As String) As Long
Const NOERROR = 0
Dim sPath As String
Dim IDL As Long
Dim strPath As String
Dim lngPos As Long
 
 
Public Function GetFolderPath(Optional ByVal Title As String = "Выберите папку", Optional ByVal InitialPath As String = "c:\") As String
' функция выводит диалоговое окно выбора папки с заголовком Title,
' начиная обзор диска с папки InitialPath
' возвращает полный путь к выбранной папке, или пустую строку в случае отказа от выбора
Dim PS As String: PS = Application.PathSeparator
With Application.FileDialog(msoFileDialogFolderPicker)
    If Not Right$(InitialPath, 1) = PS Then InitialPath = InitialPath & PS
    .ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
    If .Show <> -1 Then Exit Function
    GetFolderPath = .SelectedItems(1)
    If Not Right$(GetFolderPath, 1) = PS Then GetFolderPath = GetFolderPath & PS
End With
End Function
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.08.2013, 10:32
Ответы с готовыми решениями:

Как открыть окно для выбора папки?
Можно ли из программы открыть окно с содержимым определённой папки? Нужно обычное окно папки, а не запустить Проводник.

Стандартный диалог выбора директории
Подскажите по сабжу плиз. Есть ли оный в ВБ 6.0??? и как его вызвать если он есть? или надо писать свой?

Окно выбора директории и файлов
Здравствуйте, уважаемые форумчане. Подскажите пожалуйста, есть ли в VBA подобные объекты? ...

17
 Аватар для Апострофф
9908 / 3924 / 742
Регистрация: 11.10.2011
Сообщений: 5,904
30.08.2013, 11:04
Посмотрите -
Вложения
Тип файла: zip SHBrowseForFolder.zip (6.2 Кб, 271 просмотров)
3
 Аватар для Bati4eli
617 / 17 / 8
Регистрация: 05.05.2012
Сообщений: 221
Записей в блоге: 11
30.08.2013, 11:28  [ТС]
Апострофф,
Конечно лучше чем то, что находится в интернете. Но у данного метода выбора папки есть существенные минусы:
1) Неудобство выбора папки из-за древовидного отображения
2) Невозможно пройти в скрытые папки.
Вот идеальный вариант диалогового окна:
Миниатюры
Окно выбора директории (папки)  
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38168 / 21103 / 4307
Регистрация: 12.02.2012
Сообщений: 34,692
Записей в блоге: 14
30.08.2013, 12:28
Цитата Сообщение от Bati4eli Посмотреть сообщение
Кстати на VBA такая вещь присутствует!
- кто же мешает использовать это в VB6?
0
 Аватар для Bati4eli
617 / 17 / 8
Регистрация: 05.05.2012
Сообщений: 221
Записей в блоге: 11
30.08.2013, 12:59  [ТС]
Catstail,
если бы вы посмотрели спойлер в первом посте, то увидели бы что там вызов такого диалога реализуется с помощью встроенных ресурсов офисного приложения :
With Application.FileDialog( ...
0
30.08.2013, 15:49

Не по теме:

Bati4eli, завел в заблуждение. Там каламбур Application.FileDialog вместе с API-функциями :jokingly:

Апострофф, умммм. Фига се функция =)

0
 Аватар для Bati4eli
617 / 17 / 8
Регистрация: 05.05.2012
Сообщений: 221
Записей в блоге: 11
30.08.2013, 16:22  [ТС]
Dragokas,
если честно я в "тупую" копировал по-быстрому часть кода из модуля.. и даже не смотрел используются ли эти APi функции.
Так что извеняюсь, если ввел в заблуждение. Просто выложил как пример того, чего хотелось бы видеть в своей проге на VB.

Кстати как-то совсем давно .. я нашел в интернете исходник диалогового окна выбора директорий или файла. Там использовалась куча модулей, классов и выглядило окно один в один как виндовское (даже панелька "избранное" работала).. но поскольку я тогда был абсолютным нубом в вопросах программирования и не понимал всю ценность попавшего мне в руки VB проекта .. я бессердечно удалил это творение
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
30.08.2013, 16:35
Если кого-нибудь вдохновит:

Из всего, что нашел быстрым поиском это:

Кликните здесь для просмотра всего текста
SHBrowseForFolder is the CRAPPIEST AND MOST ANNOYING system dialog in all Windows and should be shot!
It's a nightmare to navigate especially if you have many folders, you can't type in a path, no Back or Up buttons, can't create new folder. Also it always starts from the root of the file system, and often freezes while it enumerates all drives and shell extensions to display their icons. It's really hard to get it to start from another folder. The few programs I've seen doing it do it by manually unfolding the tree view.

That's said, here is another solution
Step 1: Initialize your OPENFILENAME structure with the parameters you want - title, initial folder, etc. Use a weird file mask - for example "Folders Only\0zzzzzzzzz.zzzzzzzzzzzzzzzzzzzzzz\0 ". This will filter out any files and will leave in only the folders.

Step 2: Create a hook procedure. Inside it trap the WM_INITDIALOG message and:
Hide controls stc2, cmb1 and edt1 with the CDM_HIDECONTROL message
Change the text of stc3 from "File name" to "Folder name" with the CDM_SETCONTROLTEXT message
Subclass the dialog
Note that the dialog is the parent of the hwnd you get in the hook procedure. stc2, cmb1, etc. are child of that dialog (the control ids for them are defined in Dlgs.h)

Step 3: In the subclass procedure trap the WM_COMMAND for IDOK and:
if (uMsg==WM_COMMAND && HIWORD(wParam)==BN_CLICKED && LOWORD(wParam)==IDOK) {
HWND list=GetDlgItem(GetDlgItem(hWnd,lst2),1) ; // the listview control
if (list && ListView_GetSelectedCount(list)==0) {
SendMessage(hWnd,CDM_GETFOLDERPATH,_MAX_ PATH,(LPARAM)g_Path);
EndDialog(hWnd,IDOK);
}
}
If no items (folders) are selected and the user pressed IDOK, then he wants to select the current folder. So just get the current folder with CDM_GETFOLDERPATH into a global variable and close the dialog.

Step 4: When GetOpenFileName returns with TRUE the selected path will be in g_Path.

Ivo


И код реализации на C++ (не очень то простой) (работу не проверял). Мож кому интересно - в личку.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38168 / 21103 / 4307
Регистрация: 12.02.2012
Сообщений: 34,692
Записей в блоге: 14
30.08.2013, 16:57
Вот этот код пойдет? Он будет работать и в VB6.
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
Attribute VB_Name = "Shell"
Option Explicit
Option Base 1
 
Const BIF_RETURNONLYFSDIRS = 1
Const BIF_DONTGOBELOWDOMAIN = 2
Const MAX_PATH = 260
 
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 Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
                                        
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
 
'Вызывает стандартное диалоговое окно "Обзор" и возвращает выбранный путь
Function GetPath(hwnd As Long) As String
  Dim lpIDList As Long
  Dim sBuffer As String
  Dim szTitle As String
  Dim tBrowseInfo As BrowseInfo
    
  szTitle = "Выберите каталог:"
  With tBrowseInfo
    .hWndOwner = hwnd
    .lpszTitle = lstrcat(szTitle, "")
    .ulFlags = BIF_RETURNONLYFSDIRS + BIF_DONTGOBELOWDOMAIN
  End With
  
  'Показываем окно "Обзор"
  lpIDList = SHBrowseForFolder(tBrowseInfo)
 
  'Получаем строку выбранного пути
  If (lpIDList) Then
    sBuffer = Space(MAX_PATH)
    SHGetPathFromIDList lpIDList, sBuffer
    sBuffer = Left(sBuffer, InStr(sBuffer, vbNullChar) - 1)
    GetPath = sBuffer
  Else
    GetPath = ""
  End If
End Function
2
 Аватар для radlif
44 / 44 / 3
Регистрация: 18.12.2011
Сообщений: 577
31.08.2013, 10:13
Апострофф,

Не по теме:

Не по теме, как использовать спойлер в своих приложениях?)

0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
31.08.2013, 15:58
Лучший ответ Сообщение было отмечено как решение

Решение

Можно модифицировать стандартный диалог открытия файла.
Что-то типа этого:
Кликните здесь для просмотра всего текста
Модуль:
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
Option Explicit
 
Private Type OPENFILENAME
    lStructSize As Long
    hwndOwner As Long
    hInstance As Long
    lpstrFilter As String
    lpstrCustomFilter As String
    nMaxCustFilter As Long
    nFilterIndex As Long
    lpstrFile As String
    nMaxFile As Long
    lpstrFileTitle As String
    nMaxFileTitle As Long
    lpstrInitialDir As String
    lpstrTitle As String
    Flags As Long
    nFileOffset As Integer
    nFileExtension As Integer
    lpstrDefExt As String
    lCustData As Long
    lpfnHook As Long
    lpTemplateName As String
    pvReserved As Long
    dwReserved As Long
    FlagsEx As Long
End Type
Public Enum CdlgExt_Flags
    OFNAllowMultiselect = &H200
    OFNCreatePrompt = &H2000
    OFNexplorer = &H80000
    OFNEnableHook = &H20
    OFNExtensionDifferent = &H400
    OFNFileMustExist = &H1000
    OFNHelpButton = &H10
    OFNHideReadOnly = &H4
    OFNLongNames = &H200000
    OFNNoChangeDir = &H8
    OFNNoDereferenceLinks = &H100000
    OFNNoLongNames = &H40000
    OFNNoReadOnlyReturn = &H8000
    OFNNoValidate = &H100
    OFNOverwritePrompt = &H2
    OFNPathMustExist = &H800
    OFNReadOnly = &H1
    OFNShareAware = &H4000
End Enum
Private Type NMHDR
    hwndFrom As Long
    idfrom As Long
    code As Long
End Type
Private Type LVITEM
    mask As Long
    iItem As Long
    iSubItem As Long
    state As Long
    stateMask As Long
    pszText As String
    cchTextMax As Long
    iImage As Long
    lParam As Long
    iIndent As Long
End Type
 
Private Const GWL_WNDPROC = (-4)
 
Private Const WM_INITDIALOG = &H110
Private Const WM_DESTROY = &H2
Private Const WM_NOTIFY = &H4E
Private Const WM_USER = &H400
Private Const WM_COMMAND = &H111
 
Private Const CDN_FIRST = -601&
Private Const CDN_INITDONE = (CDN_FIRST - 0&)
Private Const CDN_FILEOK = (CDN_FIRST - 5&)
 
Private Const CDM_FIRST = (WM_USER + 100)
Private Const CDM_HIDECONTROL = (CDM_FIRST + &H5)
Private Const CDM_SETCONTROLTEXT = (CDM_FIRST + &H4)
Private Const CDM_GETFOLDERPATH = (CDM_FIRST + &H2)
 
Private Const BN_CLICKED As Long = &H0
 
Private Const MAX_PATH = 260
 
Private Const IDOK = 1
Private Const IDFILETYPECOMBO = &H470
Private Const IDFILETYPESTATIC = &H441      ' Files of Type
Private Const IDFILENAMESTATIC = &H442      ' File Name
Private Const IDFILELIST = &H460            ' Listbox
 
Private Const LVM_FIRST = &H1000&
Private Const LVM_GETSELECTEDCOUNT = LVM_FIRST + 50
Private Const LVM_GETNEXTITEM = (LVM_FIRST + 12)
Private Const LVM_GETITEMTEXT = LVM_FIRST + 45
 
Private Const LVIS_SELECTED = &H2&
 
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetDlgItem Lib "user32" (ByVal hDlg As Long, ByVal nIDDlgItem As Long) As Long
Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenFilename As OPENFILENAME) As Long
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, lpvSource As Any, ByVal Count As Long)
Private Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long
 
Dim OFN As OPENFILENAME
Dim OldWndProc As Long
Dim hwndDlg As Long
Dim mFolders As Collection
Dim mPath As String
 
Public Property Get Folders() As Collection
    Set Folders = mFolders
End Property
Public Property Get Path() As String
    Path = mPath
End Property
 
Public Function PickFolder() As String
 
    If mFolders Is Nothing Then Set mFolders = New Collection
    
    Do While mFolders.Count: mFolders.Remove (1): Loop
    
    With OFN
        .lStructSize = Len(OFN)
        .hInstance = App.hInstance
        .lpfnHook = lHookAddress(AddressOf DialogHookFunction)
        .Flags = OFNexplorer Or OFNNoChangeDir Or OFNEnableHook Or OFNHideReadOnly Or OFNAllowMultiselect
        .lpstrFile = String$(MAX_PATH, 0)
        .nMaxFile = MAX_PATH
        .lpstrFileTitle = String$(MAX_PATH, 0)
        .nMaxFileTitle = MAX_PATH
        .lpstrFilter = "Folders" & Chr$(0) & "*.ЛЮБОЕ НЕСУЩЕСТВУЮЩЕЕ РАСШИРЕНИЕ" & String$(2, Chr$(0))
        .lpstrTitle = "Pick folders"
        .nFilterIndex = 0
    End With
    GetOpenFileName OFN
End Function
 
Private Function lHookAddress(lPtr As Long) As Long
    lHookAddress = lPtr
End Function
Private Function DialogHookFunction(ByVal hDlg As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Select Case wMsg
        Case WM_INITDIALOG
            hwndDlg = GetParent(hDlg)
            OldWndProc = SetWindowLong(hwndDlg, GWL_WNDPROC, AddressOf DlgWndProc)
        Case WM_NOTIFY
            Dim tNMH As NMHDR
            CopyMemory tNMH, ByVal lParam, Len(tNMH)
            Select Case tNMH.code
            Case CDN_INITDONE
                SendMessage hwndDlg, CDM_SETCONTROLTEXT, IDOK, ByVal "Pick folder"
                SendMessage hwndDlg, CDM_SETCONTROLTEXT, IDFILENAMESTATIC, ByVal "Folder name"
                SendMessage hwndDlg, CDM_HIDECONTROL, IDFILETYPECOMBO, ByVal 0&
                SendMessage hwndDlg, CDM_HIDECONTROL, IDFILETYPESTATIC, ByVal 0&
            End Select
        Case WM_DESTROY
        Case Else
    End Select
End Function
Private Function DlgWndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Select Case Msg
    Case WM_COMMAND
        If HiWord(wParam) = BN_CLICKED Then
            Dim hwndPick As Long
                        
            hwndPick = GetDlgItem(hwndDlg, IDOK)
                        
            If lParam = hwndPick Then
                Dim hwndLVParent As Long, hwndLV As Long
                Dim Pos As Long, Itm As LVITEM, txtLen As Long
                
                hwndLVParent = FindWindowEx(hwndDlg, ByVal 0&, "SHELLDLL_DefView", vbNullString)
                hwndLV = FindWindowEx(hwndLVParent, ByVal 0&, "SysListView32", vbNullString)
 
                Pos = SendMessage(hwndLV, LVM_GETNEXTITEM, -1, ByVal LVIS_SELECTED)
                
                If Pos >= 0 Then
                    
                    Itm.cchTextMax = MAX_PATH
                    Itm.pszText = String(MAX_PATH, 0)
                    
                    txtLen = SendMessage(hwndLV, LVM_GETITEMTEXT, Pos, Itm)
                    
                    mFolders.Add Left(Itm.pszText, txtLen)
                    
                    Do Until Pos = -1
                        Pos = SendMessage(hwndLV, LVM_GETNEXTITEM, Pos, ByVal LVIS_SELECTED)
                        txtLen = SendMessage(hwndLV, LVM_GETITEMTEXT, Pos, Itm)
                        If Pos >= 0 Then mFolders.Add Left(Itm.pszText, txtLen)
                    Loop
                    
                    mPath = String(MAX_PATH, 0)
                    txtLen = SendMessage(hwndDlg, CDM_GETFOLDERPATH, MAX_PATH, ByVal mPath)
                    mPath = Left(mPath, txtLen - 1)
                    DestroyWindow hwndDlg
                End If
            Else
                DlgWndProc = CallWindowProc(OldWndProc, hwnd, Msg, wParam, lParam)
            End If
        End If
    Case Else
        DlgWndProc = CallWindowProc(OldWndProc, hwnd, Msg, wParam, lParam)
    End Select
End Function
 
Private Function LoWord(ByVal LongIn As Long) As Integer
    Call CopyMemory(LoWord, LongIn, 2)
End Function
Private Function HiWord(ByVal LongIn As Long) As Integer
    Call CopyMemory(HiWord, ByVal (VarPtr(LongIn) + 2), 2)
End Function
Вызов:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub cmdPick_Click()
    Dim Fld As Variant, Ret As String
    
    modGetOpenFolder.PickFolder
    
    Ret = "Parent dir: " & modGetOpenFolder.Path & vbNewLine & "Selected dir: " & vbNewLine
    For Each Fld In modGetOpenFolder.Folders
        Ret = Ret & "\" & Fld & vbNewLine
    Next
    
    MsgBox Ret
End Sub

Или для стандартного диалога открытия папки, только без множественного выбора:
Кликните здесь для просмотра всего текста
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
Option Explicit
 
 
Const BIF_RETURNONLYFSDIRS = &H1&
Const BIF_EDITBOX = &H10&
Const BIF_NEWDIALOGSTYLE = &H40&
Const BIF_USENEWUI = BIF_EDITBOX Or BIF_NEWDIALOGSTYLE
Const BIF_NONEWFOLDERBUTTON = &H200&
Const BIF_SHAREABLE = &H8000&
 
Private Sub Command1_Click()
    Dim Folder As Object
    
    With CreateObject("Shell.Application")
        Set Folder = .BrowseForFolder(hWnd, "Pick a folder", BIF_RETURNONLYFSDIRS _
                                                          Or BIF_SHAREABLE _
                                                          Or BIF_USENEWUI _
                                                          Or BIF_NEWDIALOGSTYLE _
                                                          Or BIF_NONEWFOLDERBUTTON)
    End With
    
    If Folder Is Nothing Then
        MsgBox "cancel"
    Else
        Me.Caption = Folder.Self.Path
    End If
End Sub

PS.Писал, особо не проверял, так что можно наверное оптимизировать
4
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
19.06.2014, 02:26
The trick, привет !
А можешь, пожалуйста, написать, как будет для 1-го варианта (мод. GetOpenFileName):
- если не выбрано ни одной папки и нажать на кнопку "Pick folder", чтобы выбиралась единственная папка - та, в которой в данный момент открыт диалог.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
19.06.2014, 02:34
Dragokas, держи.
Вложения
Тип файла: rar GetOpenFileName3.rar (3.2 Кб, 344 просмотров)
3
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
19.06.2014, 23:13
Это существенные правки. На лицо оптимизация, центрирование... и другое.
Спасибо. Объединил с предыдущим кодом.

Единственное, что - когда нажимаешь кнопку "Перейти в родительскую папку", а затем "Pick Folder",
код выбирает дочернюю, а не ту, в которой сейчас находишься.
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
02.09.2020, 13:10
Цитата Сообщение от The trick Посмотреть сообщение
Или для стандартного диалога открытия папки, только без множественного выбора:
Как сделать, чтобы программа запоминала последнюю папку, как в это делается в стандартном CoommonDialog?
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
02.09.2020, 22:26
Argus19, Обзор папок, вспомнить прежную открытую папку
1
 Аватар для Rh2Dark
32 / 32 / 0
Регистрация: 05.11.2020
Сообщений: 102
05.11.2020, 16:00
Не смотрел архив, на который ссылается The trick, но поделюсь своим опытом. Я в своих программах использую хранение последней открытой папки в реестре (как и завещал Билли всем разработчикам). Например:
1. Запомнить папку:
SaveSetting(MyCopyright, MyApplicaton, "LastFolder", "C:\MyApp\Folder") 'Это можно сделать, например, после выбора файла
пользователем (sLastFolder = CommonDialog.InitFolder)
2. Вспомнить папку и загнать её в CommonDialog:
sLastFolder = GetSetting(MyCopyright, MyApplicaton, "LastFolder", "")
Перед вызовом CommonDialog сделать так:
If Len(sLastFolder) > 0 then 'Это я так по простецки проверяю содержимое полученного ключа "LastFolder". Если по уму подойти, то нужно организовать проверку наличия пути к папке, например через FSO или функцию Dir$()
CommonDialog.InitFolder = sLastFolder
End If
'Ну и потом вызвать метод "ShowOpen" CommonDialog - а
'(sLastFolder - переменная типа String)
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
16.11.2023, 20:59
Вот супер-классный новый модуль для вызова диалога выбора папки: Готовые решения и полезные коды на Visual Basic 6.0
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.11.2023, 20:59
Помогаю со студенческими работами здесь

Диалоговое окно выбора как папки так и файлов
Можно ли обыграть ситуацию с диалоговыми окнами: Application.FileDialog(msoFileDialogFilePicker) - выбор файла(-ов) ...

Вызвать стандартный диалог выбора директории
как вызвать стандартный диалог выбора директории. очевидно д б api функция

Нужен диалог выбора диска (директории), а не файла
Задача: на форме есть Label1, нужно выбрать директорию на диске, и присвоить этот путь LABEL1 может поможет выводит все диалоги ...

Activex компонент для выбора файла из директории
Нужно закачивать данные из файла, пользователь должен выбирать файл. для этого ищу Activex компонент для выбора файла из директории ...

Стандартный объект выбора директории или файла
Подскажите есть ли в VBA стандартный обьект который можна вставить в форму, и с помощью которого можно производить выбор директории или...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru