Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Удобный выбор папки


Автор: ИгнатьевАлексей 28.7.2006, 12:15
Друзья! Подскажите пожалуйста!

Надо на форме получать путь к папке в текстовом виде. Не могу найти ничего подходящего и готового. Т.е. надо нечто подобное CommonDialog\ShowOpen, только для выбора папок, а не файлов.

Заранее благодарен! 

Автор: mihanik 28.7.2006, 12:26
ИгнатьевАлексей,  я в таких случаях обычно использую DirListBox совместно с DriveListBox.

При необходимости выношу их на отдельную формочку...

Кода там требуется, ну... Строк 5. Не больше.

Если хочешь, дам примерчик...

Добавлено @ 12:32 
Короче так...

На форму бросаешь DirListBox  и DriveListBox

Пишешь код события изменения DriveListBox для того, чтобы согласовать оба элемента.

Код

Option Explicit

Private Sub Drive1_Change()
    Dir1.Path = Drive1.Drive
End Sub


А потом обрабатываешь событие даблклик по DirListBox  и берёшь от него свойство .path
Это и будет полный путь к твоеё папке...

Добавлено @ 12:34 
а....
Замечание, если в DriveListBox выберешь дискету, а дискеты не будет, то прога вылетит, т.е. нужен обработчик ошибок...

Подходит идея?

Добавлено @ 12:36 
А можно использовать стандартный диалог ShowOpen, но немного через...
Гм... smile 
В приличном обществе о таком не говорят... smile   

Автор: ИгнатьевАлексей 28.7.2006, 12:46
Спасибо, приятель!
Исчерпывающе! 

Да вот я думал, что человечество уже сделало это. Не потому, что лень 5 строк кода написать, а потому, что стандартные вещи удобнее, как правило и элегантнее, не так ли? 

Автор: mihanik 28.7.2006, 12:52
Цитата(ИгнатьевАлексей @  28.7.2006,  12:46 Найти цитируемый пост)
стандартные вещи удобнее, как правило и элегантнее, не так ли? 

Это так...
Сейчас ещё пошукаю по книжкам.
Может, найду, что-нибудь...  smile  

Автор: ИгнатьевАлексей 28.7.2006, 13:42
Передо мной по кругу лежат 5 книжек. Обзорно просмотрел - кроме того, о чем ты мне любезно рассказал, не нашел! Из чего делаю вывод, что если и есть что либо подобное, то не в составе базовых вещей. Хотя хочется верить, что это не так.  smile  

Автор: ИгнатьевАлексей 28.7.2006, 14:08
Ой беда!
 Я и забыл, что пишу это в VBA, а там мне что-то это не найти! Может же такое быть? 

Автор: mihanik 28.7.2006, 14:17
Не расстраивайся!!!

Я знаешь как сделал однажды в Excel'e?
Создал форму, разместил на ней CommonDialog и пользовался им спокойно.
Например так...

Код

Private Sub cmdSaveBook_Click()
Dim strFileName As String
Dim strFilePath As String

    ' Выбираем файл, в котором храниться заполненные заявки
    strFilePath = ThisWorkbook.Path + "\Заполненные заявки"
    
On Error GoTo CancelSave

    ChDir strFilePath

    frmMain.CommonDialog1.CancelError = True
    frmMain.CommonDialog1.Filter = "Файлы заявок |*.xls"
    frmMain.CommonDialog1.InitDir = strFilePath
    frmMain.CommonDialog1.Flags = cdlOFNFileMustExist + cdlOFNLongNames
    frmMain.CommonDialog1.FileName = "Заявка " + CStr(Format(Date, "ddmmyy"))
    frmMain.CommonDialog1.ShowSave
    strFileName = frmMain.CommonDialog1.FileName

    ActiveWorkbook.SaveAs FileName:= _
        strFileName, FileFormat:=xlNormal _
        , Password:="VelvetSweatshop", WriteResPassword:="", ReadOnlyRecommended _
        :=False, CreateBackup:=False

CancelSave:

End Sub


А кто тебе мешает создать форму?  smile

Добавлено @ 14:18 
Кроме того!!!

На форме ты же можешь и DirListBox совместно с DriveListBox разместить...
 

Автор: Dexx 28.7.2006, 14:33
Функция SHBrowseForFolder

Описание : Выводит на экран диалоговое окно ' Выбор папки'.
Операционная система : Windows NT 4.0 или выше; Windows 95 или выше
Библиотека : Shell32.dll

Код

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

Const BIF_RETURNONLYFSDIRS = 1
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 Sub Form_Load()
    Dim iNull As Integer, lpIDList As Long, lResult As Long
    Dim sPath As String, udtBI As BrowseInfo

    With udtBI
        .hWndOwner = Me.hWnd
        .lpszTitle = lstrcat("C:\", "")
        .ulFlags = BIF_RETURNONLYFSDIRS
    End With

    'Выводим на экран стандартный диалог 'Выбор папки'
    lpIDList = SHBrowseForFolder(udtBI)
    If lpIDList Then
        sPath = String$(MAX_PATH, 0)
        'Получаем путь из IDList
        SHGetPathFromIDList lpIDList, sPath
        'Освобождаем блок памяти
        CoTaskMemFree lpIDList
        iNull = InStr(sPath, vbNullChar)
        If iNull Then
            sPath = Left$(sPath, iNull - 1)
        End If
    End If

    MsgBox sPath
End Sub

 


Вот так и не важно VB  или VBA 

Автор: mihanik 28.7.2006, 14:35
Dexx!!!

О!

Классно!!!
Думаю, что ИгнатьевАлексей, это понравится...
 smile  

Автор: ИгнатьевАлексей 28.7.2006, 16:08
Цитата

Классно!!!
Думаю, что ИгнатьевАлексей, это понравится...


Понравилось, хотя и заморочно.


Dexx, 
Вопросик по коду, если позволите. 
Код

'Освобождаем блок памяти
        CoTaskMemFree lpIDList


Зачем это делается? Ведь это переменная типа Long, или не так просто? Почему к ней такое особое внимание?



mihanik, 

Цитата

А кто тебе мешает создать форму? 


Вот и проблема в этом, что в VBA я не нашел таких компонентов для формы, а в VB они есть. 
Или ты имеешь в виду создать форму в VB, а не в VBA? 

Автор: mihanik 28.7.2006, 16:16
Цитата(ИгнатьевАлексей @  28.7.2006,  16:08 Найти цитируемый пост)
Вот и проблема в этом, что в VBA я не нашел таких компонентов для формы, а в VB они есть. 


Покопайся среди Additional Controls.
(Правой кнопкой по тулбоксу )

Там наверняка должно быть что-нибудь подобное...

Сейчас копаться некогда!!!
Убегаю с работы!!!
Завтра или в понедельник посмотрю... 

Автор: Akina 28.7.2006, 19:06
Цитата(mihanik @  28.7.2006,  13:26 Найти цитируемый пост)
можно использовать стандартный диалог ShowOpen, но немного через...

Цитата(ИгнатьевАлексей @  28.7.2006,  17:08 Найти цитируемый пост)
Понравилось, хотя и заморочно.

Не заморочно, а правильно. Если очень хочется остаться в рамках регистрированных компонентов - то надо использовать CommonDialuog.ShowOpen - однако он предназначен для выбора файла, а не каталога. Что же до создания собственной формы с DriveListBox/DirListBox - вот это действительно путь через то самое место, и нужно очень много причин для выбора ТАКОГО пути.

Сорри, не мог не высказаться. 

Автор: Дмит 28.7.2006, 22:35
В Excel 2000 можно так:
Код

With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "Выберите папку:"
.Show
If .SelectedItems.Count > 0 Then
str = .SelectedItems(1)
End If
End With 
 

Автор: cardinal 29.7.2006, 01:29

M
cardinal
Дмит, пользуйся тегами кода!

 

Автор: ИгнатьевАлексей 29.7.2006, 10:23
mihanik, да не надо уже, спасибо! Дмит предложил классную вещь, как мне кажется, я в книжке ее не заметил!



Akina, скажи, пожалуйста, а то, что Дмит предложил по какой-то причине хуже, чем SHBrowseForFolder?
 

Автор: Akina 6.8.2006, 17:13
Цитата(ИгнатьевАлексей @  29.7.2006,  11:23 Найти цитируемый пост)
то, что Дмит предложил по какой-то причине хуже, чем SHBrowseForFolder?

Ничуть не хуже. Это просто программная эмуляция ручного выбора папки через главное меню приложения.

Одна беда - этот пункт может оказаться недоступным. Нет прав, блокировка на уровне приложения, пользователя, OLE-сервера...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)