Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проблемы с выбором типа файла в Save As... / 2 сообщений из 2, страница 1 из 1
28.01.2010, 12:55
    #36435994
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с выбором типа файла в Save As...
Предполагается сохранять tiff файлы в различных форматах.
Проблема в том, что если меняем формат сохранения(в combobox с фильтрами) и ничего не меняем в имени файла (изначально подставляется имя исходного tiff), то окно возвращает имя с расширением tif, а не то что выбрано (jpg, pdf и т.п.), если что-то поменять в имени файла, то все корректно.
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
    'if first time through set the appropriate OFN size
    If OSV_VERSION_LENGTH =  0  Then Call SetOSVersion
    'filters for the dialog
        sFilters = "TIFF (*.tif)" & vbNullChar & "*.tif" & vbNullChar & _
            "PDF (*.pdf)" & vbNullChar & "*.pdf" & vbNullChar & _
            "Bitmap (*.bmp)" & vbNullChar & "*.bmp" & vbNullChar & _
            "JPEG (*.JPG)" & vbNullChar & "*.jpg" & vbNullChar & _
            "GIF (*.GIF)" & vbNullChar & "*.gif" & vbNullChar & _
            "PNG (*.PNG)" & vbNullChar & "*.png" & vbNullChar & vbNullChar
    'populate the structure
    With OFN
        .nStructSize = OSV_VERSION_LENGTH
        .hWndOwner = Me.hWnd
        .sFilter = sFilters
        .nFilterIndex =  1 
        .sFile = FileShort & Space$( 1024 ) & vbNullChar & vbNullChar
        .nMaxFile = Len(.sFile)
        .sDefFileExt = "tif" & vbNullChar & vbNullChar
        .sFileTitle = vbNullChar & Space$( 512 ) & vbNullChar & vbNullChar
        .nMaxTitle = Len(OFN.sFileTitle)
        .sInitialDir = FaxPath
        '.sDialogTitle = "Demo"
        .flags = OFS_FILE_SAVE_FLAGS Or _
            OFN_ENABLESIZING Or _
            OFN_ENABLEHOOK
        '.fnHook = FARPROC(AddressOf OFNHookProc)
    End With
    lReturn = GetSaveFileName(OFN)
    If lReturn =  0  Then
        'MsgBox "The User pressed the Cancel Button"
    Else
        'MsgBox "The user Chose " & Trim(OFN.sFile)
        targetfile = Trim(OFN.sFile)
        MsgBox targetfile
'        Exit Sub
...

targetfile -имя файла с расширением во что сохранять, и если дергать только фильтр, а не менять имя, то всегда будет .tif М.б. какие флаги забыл?
...
Рейтинг: 0 / 0
28.01.2010, 22:45
    #36437396
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с выбором типа файла в Save As...
Часов несколько копал и контрол CommonDialog и API, так и не откопал(неужели нету), пришлось извращаться.

1)изначально заполняем поле имени файла именем без расширения (чтобы .tif не отображалось если система отображает расширения хотя бы при загрузке окна)
Код: plaintext
 .sFile = FileName(FileShort) & Space$( 1024 ) & vbNullChar & vbNullChar
2) контролироем не только имя возвращаемого файла, но и выбранный пользователем фильтр расширения, и если не совпадает, то заменяем
Код: 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.
25.
26.
27.
28.
29.
        targetFile = Trim(Replace(OFN.sFile, vbNullChar, "")) 'убираем пустые символы
        If FileType = "tif" Then
            Select Case OFN.nFilterIndex
                Case  1 : 'tif
                    If Not (Right(targetFile,  4 ) = ".tif") Then
                        targetFile = Left(targetFile, Len(targetFile) -  4 ) & ".tif"
                    End If
                Case  2 : 'pdf
                    If Not (Right(targetFile,  4 ) = ".pdf") Then
                        targetFile = Left(targetFile, Len(targetFile) -  4 ) & ".pdf"
                    End If
                Case  3 : 'bmp
                    If Not (Right(targetFile,  4 ) = ".bmp") Then
                        targetFile = Left(targetFile, Len(targetFile) -  4 ) & ".bmp"
                    End If
                Case  4 : 'jpg
                    If Not (Right(targetFile,  4 ) = ".jpg") Then
                        targetFile = Left(targetFile, Len(targetFile) -  4 ) & ".jpg"
                    End If
                Case  5 : 'gif
                    If Not (Right(targetFile,  4 ) = ".gif") Then
                        targetFile = Left(targetFile, Len(targetFile) -  4 ) & ".gif"
                    End If
                Case  6 : 'png
                    If Not (Right(targetFile,  4 ) = ".png") Then
                        targetFile = Left(targetFile, Len(targetFile) -  4 ) & ".png"
                    End If
            End Select
        End If
        'MsgBox targetFile
3) запрещаем запрашивать подтверждение замены файла
.flags не должен содержать Public Const OFN_OVERWRITEPROMPT As Long = &H2 (cdlOFNOverwritePrompt)
иначе возможна ситуация, что при сохранении в test.bmp окно ругнется на существующий test.tif
Подобные перезаписи лучше обрабатывать в дальнейшем коде.

Единственный м.б. не оч.красивый момент это когда в поле имени файла написано test.tif, а в фильтре выбрано bmp, тогда по идее имя должно получаться как test.tif.bmp, а у меня будет
просто test.bmp, что конечно красивше, но не совсем правильно, хотя...
можно наверно тупо добавить расширение, а потом убрать двойное...

но вообще странно, что флагами это не лечится...
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проблемы с выбором типа файла в Save As... / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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