Страница: 1 |
Страница: 1 |
Вопрос: Ошибка в GetOpenFileName при выборе более 1 файла
Добавлено: 31.08.04 08:53
Автор вопроса: ChAko | Web-сайт:
Мне нужно вызвать окно выбора нескольких файлов.
Для этого я пользуюсь GetOpenFileName с соответствующим флагом OFN_ALLOWMULTISELECT. При выборе одного файла lpstrFile возвращает все правильно, а если выбрать несколько файлов то только путь, lpstrFileTitle тоже пустой. Кстати у меня стоит флаг OFN_EXPLORER, если его убрать, то всё работает нормально. Всем проблема?
Ответы
Всего ответов: 10
Номер ответа: 1
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #1
Добавлено: 31.08.04 09:10
Возможно буфер слишком маленький, чтобы вместить все имена файлов...
Номер ответа: 2
Автор ответа:
ChAko
ICQ: 490470
Вопросов: 14
Ответов: 12
Web-сайт:
Профиль | | #2
Добавлено: 31.08.04 09:13
нет размера буфера хватает, проверял
Номер ответа: 3
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #3
Добавлено: 31.08.04 09:28
Так покажи кусок кода, чего ж гадать вслепую.
Номер ответа: 4
Автор ответа:
ChAko
ICQ: 490470
Вопросов: 14
Ответов: 12
Web-сайт:
Профиль | | #4
Добавлено: 31.08.04 10:30
' объявления для выбора файлов
Private Declare Function GetOpenFileName Lib "comdlg32.dll" _
Alias "GetOpenFileNameA" _
 pOpenfilename As OPENFILENAME) As Long
Private Declare Function GetSaveFileName Lib "comdlg32.dll" _
Alias "GetSaveFileNameA" _
 pOpenfilename As OPENFILENAME) As Long
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 _
 udtParametersWindowChoiceFiles _
As ПараметрыОткрываемогоОкнаВыбораФайлов, _
Optional sOpenOrSave As String = "open" As String
' вызов диалогового окна выбор файлов
 im FileBox As OPENFILENAME ' структура для управления диалоговым окном
 im lFlags As Long
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
Автор ответа:
cresta
Вопросов: 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
Автор ответа:
ChAko
ICQ: 490470
Вопросов: 14
Ответов: 12
Web-сайт:
Профиль | | #6
Добавлено: 31.08.04 13:25
>Попробуй сделать ф-цию разбиения буфера. Если не получится, я тебе на мыло вышлю модуль с примером.
Высылай
Номер ответа: 7
Автор ответа:
ChAko
ICQ: 490470
Вопросов: 14
Ответов: 12
Web-сайт:
Профиль | | #7
Добавлено: 31.08.04 13:32
Всё разобрался! Всем спасибо. Высылать не чего не надо.
Номер ответа: 8
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #8
Добавлено: 31.08.04 13:45
А в чём было дело?
Номер ответа: 9
Автор ответа:
ChAko
ICQ: 490470
Вопросов: 14
Ответов: 12
Web-сайт:
Профиль | | #9
Добавлено: 31.08.04 15:08
Дело в ошибке, на которую ты мне указал. Но я её не мог видеть, так как присматривал возвращаемое выражение через msgbox, а он воспринимает vbnullchar как конец строки и я думал, что путь к файлу это всё возвращаемое выражение и естественно не мог понять, в чём проблема. Посмотрев возвращаемое выражение через debug.print мне всё стало ясно.
Номер ответа: 10
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #10
Добавлено: 31.08.04 15:24
Ну и хорошо.