powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как выбрать Folder в Common Dialog?
12 сообщений из 12, страница 1 из 1
Как выбрать Folder в Common Dialog?
    #36512980
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про OFN.Initdir это не то естественно.
Т.е. диалог уже запущен.

Например я могу узнать текущий folder, выбранный органами управления диалога:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Public Function OFNHookProcOpen(ByVal hWnd As Long, _
                            ByVal uMsg As Long, _
                            ByVal wParam As Long, _
                            ByVal lParam As Long) As Long
...
   Select Case uMsg
...
      Case WM_NOTIFY
            CopyMemory tNMH, ByVal lParam, Len(tNMH)
            Select Case tNMH.code
               Case CDN_FOLDERCHANGE
                    hWndParent = GetParent(hWnd)
                    gszPath = String$(MAX_PATH,  0 )
                    SendMessageByString hWndParent, CDM_GETFOLDERPATH, MAX_PATH, gszPath
                    szTrimNull gszPath
                    Debug.Print gszPath

А я хочу теперь обратную процедуру!
Т.е. установить этот (DO_SET)FOLDERPATH извне
С ходу не нашел.

Или текст в ID_LIST пытаться поменять?
...
Рейтинг: 0 / 0
Как выбрать Folder в Common Dialog?
    #36512986
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется понял идею: надо "вписать" в combo_имя файла путь к Folder и "кликнуть" ID_OK.
...
Рейтинг: 0 / 0
Как выбрать Folder в Common Dialog?
    #36513653
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да, все получилось.
Вот такой получился код синхронизации директории диалога с неким Treeview из 3-х "избранных" фолдеров (картинка тут http://www.sql.ru/forum/actualthread.aspx?tid=740929 ).


Код: 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.
Public Function OFNHookProcOpen(ByVal hWnd As Long, _
                            ByVal uMsg As Long, _
                            ByVal wParam As Long, _
                            ByVal lParam As Long) As Long
...
   Select Case uMsg
      Case WM_INITDIALOG
        hWndParent = GetParent(hWnd)
        frmOpen.Tag = hWndParent 'сохраняем hwnd диалога
      Case WM_NOTIFY
            CopyMemory tNMH, ByVal lParam, Len(tNMH)
            Select Case tNMH.code
               Case CDN_FOLDERCHANGE
                    hWndParent = GetParent(hWnd)
                     gszPath = String$(MAX_PATH,  0 )
                    SendMessageByString hWndParent, CDM_GETFOLDERPATH, MAX_PATH, gszPath
                    szTrimNull gszPath
                    For i =  1  To  3 
                        If (GoodPath(gOpenTreeView1.Nodes(i).Tag) = GoodPath(gszPath)) Then
                            gOpenTreeView1.Nodes(i).Selected = True
                        Else
                            gOpenTreeView1.Nodes(i).Selected = False
                        End If
                    Next i
...
и обратно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
    'frmOpen.Tag -сохраняем hwnd диалога
    'Node.Tag-хранит путь к "избранной" folder
    Dim gszPath As String
    Node.Selected = True 'исправляет начальный глюк, когда специально снимаем выделение
    If Val(frmOpen.Tag) >  0  Then
        gszPath = String$(MAX_PATH,  0 )
        Call SendMessageByString(Val(frmOpen.Tag), CDM_GETFOLDERPATH, MAX_PATH, gszPath)
        szTrimNull gszPath
        If Not (GoodPath(Node.Tag) = GoodPath(gszPath)) Then 'если мы еще не там
            Call SendMessage(Val(frmOpen.Tag), CDM_SETCONTROLTEXT, ID_FILETEXT, ByVal CStr(Node.Tag))
            Call SendMessage(GetDlgItem(Val(frmOpen.Tag), ID_OPEN), BM_CLICK,  0 ,  0 )
            Call SendMessage(Val(frmOpen.Tag), CDM_SETCONTROLTEXT, ID_FILETEXT, ByVal "") 'очистка поля
        End If
    End If
End Sub
...
Рейтинг: 0 / 0
Как выбрать Folder в Common Dialog?
    #36513765
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но, блин, маленькая досада:
Код: plaintext
Call SendMessage(GetDlgItem(Val(frmOpen.Tag), ID_OPEN), BM_CLICK,  0 ,  0 )
Фокус убегает из Treeview, и вернуть его туда по простому нельзя, по TAB здесь к сожалению, увы. Но хотябы чтоб не убегал...
М.б. можно по-другому Folder установить?
...
Рейтинг: 0 / 0
Как выбрать Folder в Common Dialog?
    #36517350
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но должна же быть какая-то хитрая команда без кликанья Open кнопки.
Например если нажать на кнопки левой панели (Рабочий стол,Мои документы), то диалог туда приходит, но не вижу чтобы Open нажималась, фокус на нее не перемещается, в моем же случае даже видно что она "чуть дрыгается", т.е. нажимается.

Скажем я могу взять WebBrowser и написать Webbrowser.Navigate "C:\Windows" и оно туда придет. Т.е. есть же в диалоге какой-нибудь ID_КОТОРЫЙ_УКАЗЫВАЕТ_ПУТЬ, который ID_LIST отображаетв стиле Explorer (также как LIST в WebBrowser) .

Или хотя бы как выполнить ID_OPEN_Click без этого самого Click, т.е. без получения фокуса этим ID_OPEN? (т.е. выполнить ф-цию, кот. выполняет кнопка но без ее нажатия)

Я могу еще сделать так:
Код: plaintext
            Call SendMessage(TreeView1.hWnd, WM_SETFOCUS,  0 &,  0 &)

и как ни странно, в отличии от TreeView1.setfocus
оно сработает, но криво,
т.е. получу 2 фокуса одновременно: на TreeView1 и на родном элементе диалога, т.е. на ID_OPEN, это не вариант.

Или можно на ходу извлечь OFN (текущую)структуру , поменять в ней путь и перезапихнуть ее обратно? Только как это сделать? нужен пример.
...
Рейтинг: 0 / 0
Как выбрать Folder в Common Dialog?
    #36517376
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Public Function SelectFolder(hWnd As Long, Optional ByRef Title = "") As String
Dim lpIDList As Long, tBrowseInfo As BrowseInfo, sBuffer As String

  tBrowseInfo.hwndOwner = hWnd
  tBrowseInfo.lpszTitle = lstrcat(Title, "")
  tBrowseInfo.ulFlags = BIF_RETURNONLYFSDIRS

  lpIDList = SHBrowseForFolder(tBrowseInfo)

  If (lpIDList) Then
    sBuffer = Space(MAX_PATH)
    SHGetPathFromIDList lpIDList, sBuffer
    sBuffer = Left(sBuffer, InStr(sBuffer, vbNullChar) -  1 )
    SelectFolder = sBuffer
  End If

End Function
...
Рейтинг: 0 / 0
Как выбрать Folder в Common Dialog?
    #36517414
утечка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыто
CoTaskMemFree lpIDList
...
Рейтинг: 0 / 0
Как выбрать Folder в Common Dialog?
    #36517613
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,
спасибо за поддержку, но сдается мне, вы не поняли вопроса.
Ваш пример я честно отработал конечно, вот он кстати с декларациями:
http://www.base64.co.uk/shbrowseforfolder.html
Но мне надо совсем другое:

Это картинка из реальной программы, но не суть я такое же уже нарисовал.
То что справа (т.е. treeview1) установлено как SetParent на диалог, чем уже 2 недели страдаю.
Т.е. дерево кот. справа, "левое" для диалога.
Когда user Щелкает например на Node=Outbox, то Common Dialog должен перевестись в соотв. папку, т.е. Out.
Как это я сделал, я привел код выше:

Код: plaintext
1.
2.
3.
4.
5.
'Поле имя файла заполняется путем к требуемой Folder
Call SendMessage(Val(frmOpen.Tag), CDM_SETCONTROLTEXT, ID_FILETEXT, ByVal CStr(Node.Tag))
'программа щелкает по кнопке "Открыть", и это переводит Common Dialog в заданную фолдер
Call SendMessage(GetDlgItem(Val(frmOpen.Tag), ID_OPEN), BM_CLICK,  0 ,  0 )
'поле "Имя файла" очищается
Call SendMessage(Val(frmOpen.Tag), CDM_SETCONTROLTEXT, ID_FILETEXT, ByVal "") 'очистка поля

Все работает, но как только я щелкаю по Outbox, за счет "нажимания" кнопки открыть
SendMessage(...ID_OPEN), BM_CLICK..)
фокус сразу убегает на кнопку "Открыть", т.е. Treeview1.node(outbox) на долю секунды окрашивается в темно-синий, а потом сразу в серый как на картинке,фокус то убежал

Я могу конечно сделать бяку
Код: plaintext
Call SendMessage(TreeView1.hWnd, WM_SETFOCUS,  0 &,  0 &)
но это реально бяка ибо получаю "двойной фокус", и на treeview и на родном диалоге.

Т.к. у меня TreeView фокуса по TAB не получает (издержки, тема обсуждалась, но здесь смирился) , то вернуть нормально программой этот фокус на Treeview считаем невозможно.

Поэтому надо чтобы он не убегал.
Если не "щелкать" по "Открыть", то не убежит,

но как тогда изменить текущую Folder для Common Dialog?

P.S. При выборе Folder, напр. Рабочий Стол, из системной левой панели, щелчка/переключения на Открыть не происходит, т.е. это как то возможно.
...
Рейтинг: 0 / 0
Как выбрать Folder в Common Dialog?
    #36520345
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
давно бы уже свой собственный диалог нарисовал и не мучался бы с управлением через API
...
Рейтинг: 0 / 0
Как выбрать Folder в Common Dialog?
    #36520356
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneдавно бы уже свой собственный диалог нарисовал и не мучался бы с управлением через API

Он либо спортсмен, либо мазохист. Причем одно другому не мешает

ЗЫ: Ни в коем случае не наезд
...
Рейтинг: 0 / 0
Как выбрать Folder в Common Dialog?
    #36520560
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,
я вам отвечал на эту тему, у меня время есть, изучение API идет только на пользу, багаж знаний как бы увеличивается.
А рисовка собственного диалога это думаю как раз бесполезное убийство времени и низкое качество исполнения в итоге (мы ведь не майкрософты,верно?), и подобная самопалка сразу бросается в глаза. А если рисовать диалог качественно, т.е. на том уровне, на кот. сделан Common Dialog, то мелких вопросов будет думаю не 2-3 а 222, и не неделя-другая, а поболе.

Shosker.Pro,
не знаешь, не лезь.
А писать: ты либо дурак, либо идиот, одно другому не мешает, ой, извините не хотел наехать, это любой дурак может.
Лучше школьникам помогайте задания делать. (Каждый развлекается по своему...)
...
Рейтинг: 0 / 0
Как выбрать Folder в Common Dialog?
    #36520726
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, я действительно не хотел тебя обидеть, написал только в качестве прикола, я уважаю людей которые могут/знают то, чего не могу/знаю я. Извини.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как выбрать Folder в Common Dialog?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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