Страница: 1 |
Вопрос: Ошибка в GetOpenFileName при выборе более 1 файла | Добавлено: 31.08.04 08:53 |
Автор вопроса: ![]() |
Мне нужно вызвать окно выбора нескольких файлов.
Для этого я пользуюсь GetOpenFileName с соответствующим флагом OFN_ALLOWMULTISELECT. При выборе одного файла lpstrFile возвращает все правильно, а если выбрать несколько файлов то только путь, lpstrFileTitle тоже пустой. Кстати у меня стоит флаг OFN_EXPLORER, если его убрать, то всё работает нормально. Всем проблема? |
Ответы | Всего ответов: 10 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #1 | Добавлено: 31.08.04 09:10 |
Возможно буфер слишком маленький, чтобы вместить все имена файлов... |
Номер ответа: 2 Автор ответа: ![]() ![]() ICQ: 490470 Вопросов: 14 Ответов: 12 |
Web-сайт: Профиль | Цитата | #2 | Добавлено: 31.08.04 09:13 |
нет размера буфера хватает, проверял |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #3 | Добавлено: 31.08.04 09:28 |
Так покажи кусок кода, чего ж гадать вслепую. |
Номер ответа: 4 Автор ответа: ![]() ![]() ICQ: 490470 Вопросов: 14 Ответов: 12 |
Web-сайт: Профиль | Цитата | #4 | Добавлено: 31.08.04 10:30 |
' объявления для выбора файлов
Private Declare Function GetOpenFileName Lib "comdlg32.dll" _ Alias "GetOpenFileNameA" _ ![]() Private Declare Function GetSaveFileName Lib "comdlg32.dll" _ Alias "GetSaveFileNameA" _ ![]() 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 lPWCFilenHook As Long lpTemplateName As String End Type Public Type ПараметрыОткрываемогоОкнаВыбораФайлов sТекущаяПапка As String hДескрипторФормы As Long sТекстЗаголовка As String sТипыФайлов As String bМножиственныйВыбор As Boolean bТолькоСуществующиеФайлы As Boolean bТолькоСуществующиеПапки As Boolean End Type Private Const OFN_FILEMUSTEXIST = &H1000 Private Const OFN_HIDEREADONLY = &H4 Private Const OFN_PATHMUSTEXIST = &H800 Private Const OFN_ALLOWMULTISELECT = &H200 Private Const OFN_LONGNAMES = &H200000 Private Const OFN_EXPLORER = &H80000 Public Function sChoiceFile_by_ChAko _ ![]() As ПараметрыОткрываемогоОкнаВыбораФайлов, _ Optional sOpenOrSave As String = "open" ![]() ' вызов диалогового окна выбор файлов ![]() ![]() With FileBox ' Устанавливаем вид диалогового окна ' размер структуры .lStructSize = Len(FileBox) ' текущая папка If udtParametersWindowChoiceFiles.sТекущаяПапка = "" Then udtParametersWindowChoiceFiles.sТекущаяПапка = App.Path .lpstrInitialDir = udtParametersWindowChoiceFiles.sТекущаяПапка ' дескриптор формы .hWndOwner = udtParametersWindowChoiceFiles.hДескрипторФормы ' текст для заголовка диалогового окна If udtParametersWindowChoiceFiles.sТекстЗаголовка = "" Then udtParametersWindowChoiceFiles.sТекстЗаголовка = "Обзор файлов" .lpstrTitle = udtParametersWindowChoiceFiles.sТекстЗаголовка ' Здесь устанавливаем типы файлов If udtParametersWindowChoiceFiles.sТипыФайлов = "" Then udtParametersWindowChoiceFiles.sТипыФайлов = "Все файлы" & vbNullChar & "*.*" .lpstrFilter = udtParametersWindowChoiceFiles.sТипыФайлов ' создаем буфер .lpstrFile = String(MAX_PATH, " " ![]() .nMaxFile = MAX_PATH + 1 .lpstrFileTitle = String(MAX_PATH, " " ![]() .nMaxFileTitle = MAX_PATH + 1 ' флаги If udtParametersWindowChoiceFiles.bТолькоСуществующиеФайлы = True Then lFlags = lFlags Or OFN_FILEMUSTEXIST End If If udtParametersWindowChoiceFiles.bТолькоСуществующиеПапки = True Then lFlags = lFlags Or OFN_PATHMUSTEXIST End If lFlags = lFlags Or OFN_LONGNAMES Or OFN_EXPLORER Or OFN_HIDEREADONLY ' обязательные флаги If udtParametersWindowChoiceFiles.bМножиственныйВыбор = True Then lFlags = lFlags Or OFN_ALLOWMULTISELECT End If .flags = lFlags End With ' Запускаем общее диалоговое окно Select Case sOpenOrSave Case "open" If GetOpenFileName(FileBox) = 0 Then Exit Function ' произошла ошибка Case "save" If GetSaveFileName(FileBox) = 0 Then Exit Function ' произошла ошибка End Select ' удаляем нулевой символ из имени файла sChoiceFile_by_ChAko = Mid(FileBox.lpstrFile, 1, InStr(1, FileBox.lpstrFile, vbNullChar) - 1) End Function Хотите исходник, вот он. Править не стал, как есть так и выложил. |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #5 | Добавлено: 31.08.04 12:45 |
ChAko
Для начала здесь нет самого места, откуда ты вызываешь ф-цию sChoiceFile_by_ChAko. Поэтому не видно, какие параметры и как ты в неё передаёшь.(т.е. как заполнена структура ПараметрыОткрываемогоОкнаВыбораФайлов) И явная ошибка, которую видно сразу: Mid(FileBox.lpstrFile, 1, InStr(1, FileBox.lpstrFile, vbNullChar) - 1) GetOpenFileName заполняет буфер, который ты её подготовил, именами файлов, разделенными vbNullChar'ом. А ты через Mid читаешь только первое имя, до первого vbNullChar. А остальные не считываешь. Как же ты хочешь их увидеть? Нужно ещё процедуру писать, которая содержимое буфера будет разбивать на отдельные строки и писать их допустим в строковый массив. Из которого ты уже по индексу элемента можешь читать имена. Попробуй сделать ф-цию разбиения буфера. Если не получится, я тебе на мыло вышлю модуль с примером. |
Номер ответа: 6 Автор ответа: ![]() ![]() ICQ: 490470 Вопросов: 14 Ответов: 12 |
Web-сайт: Профиль | Цитата | #6 | Добавлено: 31.08.04 13:25 |
>Попробуй сделать ф-цию разбиения буфера. Если не получится, я тебе на мыло вышлю модуль с примером.
Высылай |
Номер ответа: 7 Автор ответа: ![]() ![]() ICQ: 490470 Вопросов: 14 Ответов: 12 |
Web-сайт: Профиль | Цитата | #7 | Добавлено: 31.08.04 13:32 |
Всё разобрался! Всем спасибо. Высылать не чего не надо. |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #8 | Добавлено: 31.08.04 13:45 |
А в чём было дело? |
Номер ответа: 9 Автор ответа: ![]() ![]() ICQ: 490470 Вопросов: 14 Ответов: 12 |
Web-сайт: Профиль | Цитата | #9 | Добавлено: 31.08.04 15:08 |
Дело в ошибке, на которую ты мне указал. Но я её не мог видеть, так как присматривал возвращаемое выражение через msgbox, а он воспринимает vbnullchar как конец строки и я думал, что путь к файлу это всё возвращаемое выражение и естественно не мог понять, в чём проблема. Посмотрев возвращаемое выражение через debug.print мне всё стало ясно. |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #10 | Добавлено: 31.08.04 15:24 |
Ну и хорошо. |
Страница: 1 |
|