Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Ошибка в GetOpenFileName при выборе более 1 файла Добавлено: 31.08.04 08:53  

Автор вопроса:  ChAko | Web-сайт: hotcharts.ru | ICQ: 490470 
Мне нужно вызвать окно выбора нескольких файлов.
Для этого я пользуюсь GetOpenFileName с соответствующим флагом OFN_ALLOWMULTISELECT. При выборе одного файла lpstrFile возвращает все правильно, а если выбрать несколько файлов то только путь, lpstrFileTitle тоже пустой. Кстати у меня стоит флаг OFN_EXPLORER, если его убрать, то всё работает нормально. Всем проблема?

Ответить

  Ответы Всего ответов: 10  

Номер ответа: 1
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #1
Добавлено: 31.08.04 09:10
Возможно буфер слишком маленький, чтобы вместить все имена файлов...

Ответить

Номер ответа: 2
Автор ответа:
 ChAko



ICQ: 490470 

Вопросов: 14
Ответов: 12
 Web-сайт: hotcharts.ru
 Профиль | | #2
Добавлено: 31.08.04 09:13
нет размера буфера хватает, проверял

Ответить

Номер ответа: 3
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #3 Добавлено: 31.08.04 09:28
Так покажи кусок кода, чего ж гадать вслепую.

Ответить

Номер ответа: 4
Автор ответа:
 ChAko



ICQ: 490470 

Вопросов: 14
Ответов: 12
 Web-сайт: hotcharts.ru
 Профиль | | #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
' вызов диалогового окна выбор файлов

    ;Dim FileBox As OPENFILENAME ' структура для управления диалоговым окном
    ;Dim 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-сайт: hotcharts.ru
 Профиль | | #6
Добавлено: 31.08.04 13:25
>Попробуй сделать ф-цию разбиения буфера. Если не получится, я тебе на мыло вышлю модуль с примером.

Высылай

Ответить

Номер ответа: 7
Автор ответа:
 ChAko



ICQ: 490470 

Вопросов: 14
Ответов: 12
 Web-сайт: hotcharts.ru
 Профиль | | #7
Добавлено: 31.08.04 13:32
Всё разобрался! Всем спасибо. Высылать не чего не надо.

Ответить

Номер ответа: 8
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #8 Добавлено: 31.08.04 13:45
А в чём было дело?

Ответить

Номер ответа: 9
Автор ответа:
 ChAko



ICQ: 490470 

Вопросов: 14
Ответов: 12
 Web-сайт: hotcharts.ru
 Профиль | | #9
Добавлено: 31.08.04 15:08
Дело в ошибке, на которую ты мне указал. Но я её не мог видеть, так как присматривал возвращаемое выражение через msgbox, а он воспринимает vbnullchar как конец строки и я думал, что путь к файлу это всё возвращаемое выражение и естественно не мог понять, в чём проблема. Посмотрев возвращаемое выражение через debug.print мне всё стало ясно.

Ответить

Номер ответа: 10
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #10 Добавлено: 31.08.04 15:24
Ну и хорошо.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам