Программирование на Visual Basic

Диалоговые окна на visual basic

    Все, наверное, знают про стандартные окна открытия исохранения файлов. Они есть в каждой программе под Windows. Но каких показать? Вы либо делали свои похожие формы или просто ставили наформу ActiveX компонент Common Dialog и вызывали окно всего однойстрочкой (например MyDlg.ShowOpen). Но зато при этом Вам нужноносить вместе с программой этот .ocx файл, который занимает во многораз больше места, чем то, в какое увеличился бы Ваш .exe файл, в которомВы сами написали на VB свой код вызова этого диалога. Так вот сейчас я расскажу как этот самый код написть.

    Диалоговое окно для открытия и сохранения файлов вызываетсяфуекцией GetOpenFileName и GetSaveFileName из comdlg32.dll

    Вот синтаксис их объявления:

Declare Function GetOpenFileName Lib _
"comdlg32.dll" Alias "GetOpenFileNameA" _
(OpenFileName As OPENFILENAME) As Boolean

Declare Function GetSaveFileName Lib _
"comdlg32.dll" Alias "GetSaveFileNameA" _
(OpenFileName As OPENFILENAME) As Boolean

    Параметер OpenFileName в той и другой функции - это переменнаятипа OPENFILENAME, в которой перечислены все свойства диалога. Вот объявлениеэтого типа:

Type OPENFILENAME
    StructSize As Long
    Owner As Long
    Instance As Long
    Filter As String
    CustomFilter As Long
    MaxCustrFilter As Long
    FilterIndex As Long
    File As String
    MaxFile As Long
    FileTitle As String
    MaxFileTitle As Long
    InitialDir As String
    Title As String
    Flags As Long
    FileOffset As Integer
    FileExtension As Integer
    DefExt As String
    CustrData As Long
    Hook As Long
    TemplateName As Long
End Type

    Теперь надо просто объявить какую-нибудь переменную этоготипа, задать ей свойства и передать её в качестве параметра. Пример программы ниже.

"Переменная с полученным путём до файла
Dim File As String
"Фильтр файлов
Dim CommDlgF As String * 512
"Переменная для передачи API функции
Dim OpenFileName As OPENFILENAME
"Буфер для обработки строки
Dim Buf As Variant

CommDlgF = "Текстовые файлы|*.txt"

"Номер формы
OpenFileName.Owner = Me.hWnd
OpenFileName.Instance = 0
OpenFileName.CustomFilter = 0
OpenFileName.MaxCustrFilter = 0
OpenFileName.Hook = 0
OpenFileName.TemplateName = 0
OpenFileName.CustrData = 0
"Длина файла
OpenFileName.File = String$(512, 0)
OpenFileName.MaxFile = 511

    Далее должны присвоить параметр фильтра переменнойOpenFileName, но в отличие от фильтра в ActiveX компоненте,разделителем между названием типа и расширением файла служит несимвол "|", а нулевой (vbNullChar). Поэтому это вызывает некоторыесложности при указании фильтра, но для тех, кто привык к "|" пишемследующий код.

If Len(CommDlgF) > 0 Then
    For I = 1 To Len(CommDlgF)
        If Mid(CommDlgF, I, 1) = "|" Then
            Buf = Buf + vbNullChar
        Else
            Buf = Buf + Mid(CommDlgF, I, 1)
        End If
    Next I
    CommDlgF = Buf
End If

    Здесь всё просто. Если мы указали фильтр, то проходимсяпо всей строке и заменяемсимвол "|" на нулевой.

"Присваиваем фильтр
OPENFILENAME.Filter = CommDlgF
"Присваиваем заголовок окна
OPENFILENAME.Title = "Открытие файла"
"Каталог по умолчанию
OPENFILENAME.InitialDir = "c:/"
"Другие свойства диалога
OPENFILENAME.Flags = &H0
"Длина всей переменной
OPENFILENAME.StructSize = Len(OPENFILENAME)

If GetOpenFileName(OpenFileName) = True Then
    Buf = InStr(1, OPENFILENAME.File, Chr(0))
    MsgBox "Вы выбрали " & Left(OpenFileName.File, Buf - 1)
Else
    MsgBox "Ошибка"
End If

Таблица с некоторыми значениями параметра Flags

&H2000 Этот флаг устанавливает, что диалоговое окно сообщает пользователю об отсутствии файла и предлагает его создать ("Файл такой-то не существует. Создать его?").
&H1000 Указывает, что пользователь может выбрать только существующий файл или увидит сообщение "Файл не существует. Проверьте правильность имени файла".
&H10 Показывает кнопку справки.
&H4 Прячет галочку "Только чтение".
&H200000 Использование длинных имён файлов.
&H8 Заставляет открыть диалог в том же каталоге, в котором он был открыть первый раз.
&H40000 Не использовать длинных имён файлов.
&H100 Можно использовать любые символы при указании имени файла.
&H4000 Игнорирует ошибки.

    Вот в принципе и всё.

Hosted by uCoz