powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проблемы с выбором типа файла в Save As...
2 сообщений из 2, страница 1 из 1
Проблемы с выбором типа файла в Save As...
    #36435994
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предполагается сохранять 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
Проблемы с выбором типа файла в Save As...
    #36437396
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Часов несколько копал и контрол 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
2 сообщений из 2, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проблемы с выбором типа файла в Save As...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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