Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 23.05.2014
Сообщений: 17

Common Dialog Control выбор нескольких файлов не работает

23.05.2014, 17:55. Показов 3828. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проблема та же, что и в этой теме:
Проблема с Common dialog control

Во-первых непонятно какое значение присвоить:
CommonDialog1.Flags

Мой язык не поддерживает LONG (пишу не на VBA) и не видит константы...

Соотвественно попробовал:
CommonDialogControl.Flags := 2621952;

Вроде все ОК, но возникла та же проблема:
функция FileName возвращает только Путь к Папке, хотя по идее должна была вернуть еще имена файлов.
Как получить выбранные имена файлов?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.05.2014, 17:55
Ответы с готовыми решениями:

Проблема с Common dialog control
Здравствуйте! Проблема заключается в следующем... Нужно, чтобы можно было открыть коммон диалог .ShowOpen с возможностью выбора...

Как спомощью com компоненты Microsoft Common Dialog Control 6.0 открывать диалоги?
Подскажите пожалуста как спомощью com компоненты Microsoft Common Dialog Control 6.0 открывать диалоги, то есть при нажатии на 'Открыть'...

Выбор папки в MS Windows Common Control 6.0
Как сделать что бы в MS Windows Common Control 6.0 можно было выбрать папку, а не только файл?

15
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
23.05.2014, 18:31
Цитата Сообщение от KeeperRU Посмотреть сообщение
Мой язык не поддерживает LONG
Так какой у Вас язык?
По профилю раздела (VB6) почитайте http://www.vb6.us/tutorials/co... b-tutorial
0
0 / 0 / 0
Регистрация: 23.05.2014
Сообщений: 17
23.05.2014, 19:15  [ТС]
Какой язык не важно (стороннее приложение со своим языком). Главное сам принцип работы с данным Automation Server. А в интернете все вопросы по данному OLE как раз на VBA, вот и написал сюда.

Все что было в интернете на двух языках - перечитал. У всех вроде как работает, но у меня Filename не возвращает выбранные файлы...

В мануалах, что вы приложили нет ничего нового, все это я уже 500 раз видел.
Просто в примерах везде указывают флаг так:
.Flags = cdlOFNAllowMultiselect
или так:
.Flags = &H200

А мне надо:
.Flags = &H200 OR &H80000 OR &H200000

Так вот мой язык не поддерживает такой тип данных: &H200.
И я не могу понять каким целым числом мне задать то что мне надо:&H200 OR &H80000 OR &H200000

Видимо из-за этого проблема.
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
23.05.2014, 19:34
KeeperRU, вот константы в десятичном виде
Code
1
2
?&H200,&H80000,&H200000
 512           524288        2097152
В сумме действительно 2621952.

Добавлено через 6 минут
Цитата Сообщение от KeeperRU Посмотреть сообщение
функция FileName возвращает только Путь к Папке, хотя по идее должна была вернуть еще имена файлов
Это свойство возвращает все это в виде
Code
1
путь_к_папке\ файл1 файл2 файл3
, т.е. короткие имена через пробел (короткие имена не могут содержать пробел).
0
0 / 0 / 0
Регистрация: 23.05.2014
Сообщений: 17
23.05.2014, 19:55  [ТС]
Написал такой код:
Dim L1 As Long
L1 = &H200 Or &H80000 Or &H200000

Проверил
L1 = 2621952

Значит я правильно все нашел... но почему же список файлов не возвращается.
В интернете нашел многих с такой проблемой, но вот ответа не вижу.

, т.е. короткие имена через пробел (короткие имена не могут содержать пробел).
Да я понимаю, что так должно быть. Но мне возвращается только путь_к_папке\
И судя по всему не я один такой счастливчик.

Вот еще:
http://social.msdn.microsoft.c... rum=isvvba

Судя по всему мешает флаг: cdlOFNExplorer
Но без него выводится интерфейс аля Win95.

Добавлено через 4 минуты
Тут вроде как приложено решение:
http://www.vbforums.com/showth... rning-List)

Может кто-нибудь скопировать мне код оттуда? Нету никаких утилит по работе с VBA.

Добавлено через 5 минут
Глянул через VBA в Excel... ничего не понял. Там нужный метод объявлен Private, внутрь видимо никак?
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
25.05.2014, 11:05
Лучший ответ Сообщение было отмечено The trick как решение

Решение

Цитата Сообщение от KeeperRU Посмотреть сообщение
функция FileName возвращает только Путь к Папке, хотя по идее должна была вернуть еще имена файлов.
Внимательно ли ты смотрел возвращаемое значение? Она возвращает путь и имена файлов разделенные нуль-символом. Получить можно например так:
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
Option Explicit
 
Private Function GetFiles(List As String) As String()
    Dim i As Long, p As Long, o As Long, ret() As String
    i = InStr(1, List, vbNullChar)
    Do While i
        ReDim Preserve ret(p)
        ret(p) = Mid$(List, o + 1, i - o - 1)
        o = i: i = InStr(i + 1, List, vbNullChar): p = p + 1
    Loop
    ReDim Preserve ret(p): ret(p) = Mid$(List, o + 1)
    GetFiles = ret
End Function
' Проверка
Private Sub Command1_Click()
    Dim ret() As String, i As Long
    With CommonDialog1
        .MaxFileSize = 2048   ' Set as appropriate
        .FileName = ""
        .Filter = "All Files|*.*"
        .Flags = cdlOFNAllowMultiselect + cdlOFNExplorer
        .ShowOpen
        ret = GetFiles(.FileName)
        For i = 0 To UBound(ret)
            Debug.Print ret(i)
        Next
    End With
End Sub
1
0 / 0 / 0
Регистрация: 23.05.2014
Сообщений: 17
25.05.2014, 12:58  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Внимательно ли ты смотрел возвращаемое значение? Она возвращает путь и имена файлов разделенные нуль-символом. Получить можно например так:
Ну конечно внимательно. Мои исследования навели меня вот на что:
Так выглядит проводник при выборе нескольких файлов. Проблема в том, что если строка начинается с ": "111231co.csv" "111231cd.csv"
То функция ничего не возвращает - только Путь к папке.
Если же вручную сделать так в проводнике: 111231co.csv" "111231cd.csv"
То возвращается все как надо, хотя тот жe uTorrent например, нормально открывает несколько файлов и они тоже в эти кавычках.

Подозреваю, что я в шаге от решения проблемы, но не могу понять чего не хватает.
Миниатюры
Common Dialog Control выбор нескольких файлов не работает  
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
25.05.2014, 13:02
Цитата Сообщение от KeeperRU Посмотреть сообщение
Так выглядит проводник при выборе нескольких файлов. Проблема в том, что если строка начинается с ": "111231co.csv" "111231cd.csv"
То функция ничего не возвращает - только Путь к папке.
Если же вручную сделать так в проводнике: 111231co.csv" "111231cd.csv"
То возвращается все как надо, хотя тот жe uTorrent например, нормально открывает несколько файлов и они тоже в эти кавычках.
Подозреваю, что я в шаге от решения проблемы, но не могу понять чего не хватает.
Ты мой код смотрел?
0
0 / 0 / 0
Регистрация: 23.05.2014
Сообщений: 17
25.05.2014, 13:16  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Ты мой код смотрел?
Естественно.

Но что толку если в этом месте:
ret = GetFiles(.FileName)

.FileName = C:\Temp
И в функцию передается тоже самое, без какого либо списка файлов.

Попытаюсь выполнить сейчас тот же код в VBA (как я писал сейчас я работаю в стороннем приложении у которого свой язык).
Может у моего приложения какие то проблемы с символом ".
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
25.05.2014, 13:47
KeeperRU, как я понял, среды VB6 у Вас нет, Вы через VBA Excel смотрите.
Вот несколько модифицированный код уважаемого The trick в Excel. Здесь функция возвращает либо строку, если выбран один файл, либо массив строк полных путей файлов.
На самом деле в Excel есть аж два метода application.GetOpenFilename и application.FileDialog, которые делают то же самое, т.е. возвращают массив полных путей.
Вложения
Тип файла: xls FileOpen_Multiselect.xls (47.0 Кб, 10 просмотров)
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
25.05.2014, 13:48
KeeperRU, на каком языке пишешь? Интересует формат строковых данных, в VB6 например BSTR, у тебя скорее всего обычный LPTSTR, поэтому строка обрезается при встрече 0 символа. Если поддерживается работа с указателями, то можно просто "перепрыгнуть" этот символ и добраться до имен файлов.
0
0 / 0 / 0
Регистрация: 23.05.2014
Сообщений: 17
25.05.2014, 14:08  [ТС]
Цитата Сообщение от Казанский Посмотреть сообщение
Вот несколько модифицированный код уважаемого The trick в Excel. Здесь функция возвращает либо строку, если выбран один файл, либо массив строк полных путей файлов.
На самом деле в Excel есть аж два метода application.GetOpenFilename и application.FileDialog, которые делают то же самое, т.е. возвращают массив полных путей.
Да смотрю сейчас через Excel. Проблема в том, что мне нужно выполнить задачу именно через
OCX: Microsoft Common Dialog Control, version 6.0
Без привлечения других функций свойственных VBA, Excel и.т.д.

Попробовал код на VBA:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Private Sub CommandButton1_Click()
     Dim ret() As String, i As Long, TestTxt As String
     
     With Me.CommonDialog1
        .MaxFileSize = 2048   ' Set as appropriate
        .Filename = ""
        .Filter = "All Files|*.*"
        .Flags = cdlOFNAllowMultiselect + cdlOFNExplorer
        .ShowOpen
        
        TestTxt = .Filename
        MsgBox (.Filename)
        
        ret = GetFiles(.Filename)
        For i = 0 To UBound(ret)
            MsgBox ret(i)
        Next
    End With
End Sub
И вот что мне непонятно, почему вот тут: TestTxt = .Filename
Я вижу Filename как надо, т.е. полная строка со списком всех выбранных файлов.

А MsgBox (.Filename) отображает только Путь к папке, а то что далее обрезает.
Такое ощущение, что нечто подобное и у меня происходит в моем приложении. Я вообще никак не могу получить, то что идет после ".

На ум приходят только 2 решения:
1)
-Запустить из своего приложения файл Excel с написанной функцией через Excel OLE.
-Запустить функцию которая откроет диалоговое окно и сохранит результат в глобальную переменную.
-Запустить функцию которая вернет глобальную переменную

Осталось только разобраться как через Excel OLE выполнять функции Excel

2)
Попробовать заменить разделители в проводнике при выборе нескольких файлов (" на # например).
Только надо разобраться какая ветка реестра за это отвечает и какие последствия ждут.

Добавлено через 6 минут
Цитата Сообщение от The trick Посмотреть сообщение
на каком языке пишешь? Интересует формат строковых данных, в VB6 например BSTR, у тебя скорее всего обычный LPTSTR, поэтому строка обрезается при встрече 0 символа. Если поддерживается работа с указателями, то можно просто "перепрыгнуть" этот символ и добраться до имен файлов.
http://ru.wikipedia.org/wiki/C/AL
По синтаксису PASСAL, а вот что внутри у него бог его знает. По-моему это какая-то обертка над С#.
Проблема вряд ли в 0 символе. Ведь он стоит между именами файлов правильно?

Но когда я убираю первую " в проводнике, то мне возвращается все как надо:
С:\TEMP\ 111231co.csv" "111231cd.csv "
Т.е. тут с 0 символом все в порядке. А "" в середине не мешают потому что они закрывают друг друга, последняя тоже не мешает.

Условно говоря переменные текстовые видимо хранятся как-то так:
Text := "";

Когда переменная получает данные выглядит это так:
Text := "С:\TEMP\ "111231co.csv" "111231cd.csv "";

Соотв. остается только:
Text := "С:\TEMP\ "
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
25.05.2014, 14:12
Цитата Сообщение от KeeperRU Посмотреть сообщение
Проблема вряд ли в 0 символе. Ведь он стоит между именами файлов правильно?
Нет проблема именно в нем.
Цитата Сообщение от KeeperRU Посмотреть сообщение
Когда переменная получает данные выглядит это так:
Text := "С:\TEMP\ "111231co.csv" "111231cd.csv "";
Цитата Сообщение от KeeperRU Посмотреть сообщение
Соотв. остается только:
Text := "С:\TEMP\ "
Так что в итоге в переменной, первое или второе?
Цитата Сообщение от KeeperRU Посмотреть сообщение
А MsgBox (.Filename) отображает только Путь к папке, а то что далее обрезает.
Это из-за того, что у тебя нуль-терминальная строка.
Цитата Сообщение от KeeperRU Посмотреть сообщение
Попробовать заменить разделители в проводнике при выборе нескольких файлов (" на # например).
Только надо разобраться какая ветка реестра за это отвечает и какие последствия ждут.
Это невозможно т.к. нет такого функционала, всегда будет нулевой символ, а завершаться список файлов будет двойным символом /0.
Пиши язык, поддерживается ли вызов API, работа с указателями, можно ли вернуть вместо строки массив байтов.
0
0 / 0 / 0
Регистрация: 23.05.2014
Сообщений: 17
25.05.2014, 14:26  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Так что в итоге в переменной, первое или второе?
В переменной: Text := "С:\TEMP\ "
То что выше мое предположение как оно первоначально выглядит, до того как преобразует в формат моей программы.

Цитата Сообщение от The trick Посмотреть сообщение
Пиши язык, поддерживается ли вызов API, работа с указателями, можно ли вернуть вместо строки массив байтов.
Не совсем понял, причем тут указатели. Но формат данных Binary есть.
Идея хорошая, надо только придумать как его потом в строку превратить, не работал с этим типом данных.

Добавлено через 7 минут
Пфу перепутал, под массивом байтов имеется ввиду:
Result[1] := '1';
Result[2] := '2';
Result[3] := '3';
Result := '123'

?
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
25.05.2014, 14:44
Цитата Сообщение от KeeperRU Посмотреть сообщение
Не совсем понял, причем тут указатели. Но формат данных Binary есть.
Я не могу тебе сказать точно как сделать, т.к. я понятия не имею о твоем языке. Ставь указатель на начало строки, проверяй длину, если не 0, значит прибавляй к адресу указателя длину строки + 1 символ (тут еще нужно знать формат строк ANSI/UNICODE) - это будет следующий элемент.

Добавлено через 12 минут
Цитата Сообщение от The trick Посмотреть сообщение
Я не могу тебе сказать точно как сделать, т.к. я понятия не имею о твоем языке. Ставь указатель на начало строки, проверяй длину, если не 0, значит прибавляй к адресу указателя длину строки + 1 символ (тут еще нужно знать формат строк ANSI/UNICODE) - это будет следующий элемент.
Так нельзя будет сделать, т.к. BSTR отсекает двойной нуль-терминатор. Можно понадеяться что у тебя так и остается BSTR, читая по отрицательному смещению размер строки по типу
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
 
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenW" (lpString As Any) As Long
Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyW" (lpString1 As Any, lpString2 As Any) As Long
Private Declare Function GetMem4 Lib "msvbvm60" (Src As Any, Dst As Any) As Long
 
Private Function GetFiles(Name As String) As String()
    Dim ret() As String, p As Long, i As Long, l As Long, ln As Long, a As Long
    ' Ставим указатель на начало строки
    p = StrPtr(Name)
    ' Проверяем длину всей строки
    GetMem4 ByVal p - 4, ln
    l = lstrlen(ByVal p)
    Do
        ReDim Preserve ret(a)
        ret(a) = Space(l)
        ' Копируем строку
        lstrcpy ByVal StrPtr(ret(a)), ByVal p + i
        ' т.к. я использую кодирование unicode то символ занимает 2 байта
        i = i + (l + 1) * 2
        ' если вышли за пределы строки
        If i > ln Then Exit Do
        a = a + 1
        ' Проверяем длину
        l = lstrlen(ByVal p + i)
    Loop
End Function
0
0 / 0 / 0
Регистрация: 23.05.2014
Сообщений: 17
25.05.2014, 15:04  [ТС]
1) Указатели язык не поддерживает.
2) Даже если бы поддерживал как бы это помогло?

Похоже когда я делаю вызов CommonDialog.Filenames, мое приложение обрезает строку где-то в глубинах своей реализации гораздо раньше, чем мне удается хоть как-то обработать эти данные в первозданном виде.
Присваивал я это значение и в Text, и в Variant, и потоками писал в Файл - ничего не получается.

Так что попробую свой "костыльный способ". Раз в VBA для Excel все работает, буду запускать заранее подготовленный файлик и запускать в нем нужные методы.

Добавлено через 24 секунды
В любом случае спасибо за советы, многое для себя узнал.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.05.2014, 15:04
Помогаю со студенческими работами здесь

Информация по Common Dialog
Еще раз обращаюсь за вашей помощью... можно хотя бы в общих чертах про Common Dialog... а то у меня хелпа нет... Спасибо...

Как сделать Common Dialog !?
Здравствуйте! Как сделать Common Dialog !? И подскажите пожайлуста URL, где про VB можно почитать !???

Флаги в Microsoft common Dialog Controls
Privet, kto nibut mojet mnje dat link v katorm ja mog naiti nimnogo bolshe i jasni razisnenije otnasitelno flagov Microsoft common...

Common dialog, как вывести только название выбранного файла?
когда я вывожу имя файла 'cdlg.filename' он мне дает полный путь и название файла, а как вывести только название выбранного файла

Common Dialog Control
Vopros takoy: V MS Access97/2000 net takogo kontrola, chtoby vyzvat'v okne 'Explorer' faily v directorii(ili ya ne prav?) On yest' v...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru