понедельник, 28 декабря 2015 г.

Microsoft Access. Создание формы в VBA

Проектирование форм - самый сложный этап проектирования базы данных. Формы постоянно находятся в движении. Их переделывают, удаляют, изменяют и никто не бывает довольным текущим решением.
Создание форм в базе данных Access сложный и трудный этап программирования. Давайте напишем общую функцию, которая будет сама создавать нам форму и изменит ее настройки так, чтобы она выглядела красиво и с минимальным количеством объектов управления. Имя формы будет «Мой калькулятор» и запишем ее в переменную strForm.

Внешний вид панели элементов в режиме дизайнера Access 2016, т.е. тогда когда пользователь изменяет форму программы.
   
Public Function funCreateForm(strForm As StringAs Boolean
        Dim frm As Form
        On Error GoTo 999 'Переход по ошибке
        funCreateForm = False 'Значение возвращаемое по ошибке
        funDeleteForm strForm 'Удаляем старую форму
        frm = appAccess.CreateForm 'Создаем новую форму
        With frm 'Изменяем параметры формы
            .Caption = "Мой калькулятор" 'Вставляем заголовок
            .ScrollBars = 0 'Гасим полосы прокрутки
            .RecordSelectors = False 'Гасим область выделения
            .NavigationButtons = False 'Гасим кнопки перехода
            .DividingLines = False 'Гасим разделительные линии
            .AutoCenter = True 'Выравниваем форму по центру
            .BorderStyle = 3 'Устанавливаем диалоговую границу
            .Section(0).Height = 3.862 * appCM 'Изменяем высоту окна
            .Width = 10.926 * appCM 'Изменяем ширину окна
            .HasModule = True 'Разрешаем программы в форме
        End With
        funRestoreFormControls frm  'Создаем элементы формы
        funInsertFormModule frm 'Создаем модуль формы
        appAccess.DoCmd.Save, strForm 'Сохраняем форму
        appAccess.DoCmd.Close(acForm, strForm, acSaveYes) 'Закрываем форму
        funCreateForm = True 'Возвращаем результат
        Exit Function 'Выход из программы
999:
        MsgBox Err.Description 'Сообщаем об ошибке
        Err.Clear() 'Очищаем поток от ошибок
    End Function

Удаление формы

На этом этапе напишем программу для удаления формы strForm («Мой калькулятор»). Программа работает так, что если формы нет в базе данных, то программа выходит по ошибке через метку 999 и нам надо очистить поток от нее, чтобы в дальнейшем не было сообщений.
    Public Function funDeleteForm(strForm As StringAs Boolean
        Dim frm As Form
        On Error GoTo 999 'Переход по ошибке
        funDeleteForm = False 'Возвращаемое значение при ошибке
        appAccess.DoCmd.DeleteObject(acForm, strForm) 'Удаляем форму
        funDeleteForm = True 'Возвращаем значение
        Exit Function
999:
        Err.Clear() 'Очищаем поток от ошибок
    End Function

Создание элементов формы

Теперь нам надо написать программу, которая создаст управляющие элементы, т.е. метки, кнопки и список формы, восстанавливая их из таблицы базы данных, например, «Калькулятор-форма». Этот метод необходимо изучить потому, что таким образом  можно легко восстановить любой шаблон формы и в дальнейшем модифицировать его.
    Public Function funRestoreFormControls(frm As Form) As Boolean
        Dim ctl As Control, rst As Recordset, dbs As Database, i As Integer
        On Error GoTo 999 'Переход по ошибке
        funRestoreFormControls = False 'Возврат значения по ошибке
        dbs = CurrentDb 'Выбираем текущую базу данных
        rst = dbs.OpenRecordset("SELECT * FROM [Калькулятор-форма]")
        If rst.RecordCount = 0 Then  'Проверяем запрос
            rst.Close() 'Закрываем запрос
            Exit Function  'Выходим из программы
        End If
        With rst 'Создание элемента из запроса
            .MoveLast() 'Заполняем запрос данными
            .MoveFirst() 'Переходим на 1 запись
            For i = 0 To .RecordCount - 1 'Выполняем восстановление для каждой записи
                Select Case rst!ControlType
                    Case acCommandButton 'Создаем Кнопку
                        ctl = appAccess.CreateControl(frm.Name, rst!ControlType, , """", rst!Left, rst!Top, rst!Width, rst!Height)
                        ctl.OnClick = "[Event Procedure]" 'Включаем обработку нажатия
                        ctl.Caption = rst!Caption 'Меняем название
                        ctl.ControlTipText = rst!ControlTipText 'Устанавливаем подсказку
                    Case acLabel 'Создаем Надпись
                        ctl = appAccess.CreateControl(frm.Name, rst!ControlType, , "", rst!Caption, rst!Left, rst!Top, rst!Width, rst!Height)
                        ctl.BackColor = !BackColor 'Меняем фон
                    Case acTextBox 'Создаем Поле
                        ctl = appAccess.CreateControl(frm.Name, rst!ControlType, , """", rst!Left, rst!Top, rst!Width, rst!Height)
                        ctl.SpecialEffect = 0 'Выбираем стандартное выделение
                        ctl.BorderColor = 0 'Выбираем черный цвет
                        ctl.BorderStyle = 1 'Выбираем обычную границу
                    Case acListBox 'Создаем Список
                        ctl = appAccess.CreateControl(frm.Name, rst!ControlType, , """", rst!Left, rst!Top, rst!Width, rst!Height)
                        ctl.SpecialEffect = 0 'Выбираем стандартное выделение
                        ctl.BackColor = rst!BackColor 'Меняем фон списка
                        ctl.BorderColor = 0 'Выбираем стандартное выделение
                        ctl.ColumnCount = 2 'Устанавливаем число колонок
                        ctl.ColumnWidths = "7,932 см;1 см" 'Устанавливаем размер колонок
                        ctl.RowSource = "запросСписокКалькулятора" 'Выбираем запрос для списка
                End Select
                ctl.Name = rst!Name 'Изменяем имя элемента
                ctl.ForeColor = !ForeColor 'Изменяем цвет символов
                rst.MoveNext() 'Переходим на следующую запись
            Next i
        End With
        rst.Close() 'Закрываем запрос
        funRestoreFormControls = True 'Возвращаем результат
        Exit Function 'Выходим из программы
999:
        MsgBox Err.Description 'Сообщаем об ошибке
        Err.Clear() 'Очищаем поток от ошибок
    End Function

Вставить в форму модуль

После создания формы, напишем программу, которая вставит «модуль программ» на Бэйсике в нашу форму. Это необходимо для того, чтобы обеспечить обработку событий формы, например, таких как открытие, загрузка,  нажатие кнопок.
Далее в лекциях идет перечисление событий. Они отмечены на рисунках кнопкой.
Public Function funInsertFormModule(frm As Form) As Boolean
Dim s As String, mdl As Module
        On Error GoTo 999 'Переход по ошибке
        s = appFolder & "\Программы\Form_Мой калькулятор.bas"
        If Dir(s) <> "" Then 'Проверяем файл
            frm.Module.AddFromFile s 'Добавляем модуль
        End If
        Exit Function 'Выходи из программы
999:
        MsgBox Err.Description 'Сообщаем об ошибке
        Err.Clear() 'Очищаем поток от ошибок
    End Function

Открытие формы

Обработка события. Данная функция начинает работать при открытии формы. В ней мы размещаем информацию о предварительных настройках окна калькулятора, до его отображения на экране.
Private Sub Form_Open(Cancel As Integer)
    subBarOff() 'Выключить все меню и строку состояния
    'Настроить всплывающие подсказки кнопок
    Me.кнВыход.ControlTipText = "Выход из программы"
    Me.кнПечать.ControlTipText = "Печать отчета о расчетах"
    Me.кнРасчет.ControlTipText = "Расчет данных на калькуляторе"
    Me.кнСброс.ControlTipText = "Сбросить все вычисления"
    'Меняем настройки окна, установленные по умолчанию
    Me.Caption = "Мой калькулятор" 'Заголовок
    Me.ScrollBars = 0 'Полосы прокрутки
    Me.RecordSelectors = False 'Область выделения
    Me.NavigationButtons = False 'Кнопки перехода
    Me.DividingLines = False 'Разделительные линии
    'Меняем настройки списка задач
    Me.Список.BackColor = 8421376 'Цвет фона символов
    Me.Список.ForeColor = RGB(255, 255, 255) 'Цвет символов
    'Устанавливаем события
    Me.Выражение.AfterUpdate = "[Event Procedure]" 'После обновления
    Me.кнВыход.OnClick = "[Event Procedure]" 'Нажатие кнопки
    Me.кнПечать.OnClick = "[Event Procedure]" 'Нажатие кнопки
    Me.кнРасчет.OnClick = "[Event Procedure]" 'Нажатие кнопки
    Me.кнСброс.OnClick = "[Event Procedure]" 'Нажатие кнопки
    'Настраиваем параметры приложения
    DoCmd.RunCommand acCmdAppMaximize 'Увеличиваем приложение
    On Error Resume Next 'Отключаем диагностику ошибок меню
    Me.MenuBar = "Калькулятор" 'Устанавливаем меню
    Err.Clear() 'Очищаем поток от ошибки
End Sub

Расчет выражения

Обработка события. Эта программа нужна для того, чтобы после того, как пользователь введет свое выражение и нажмет кнопку «Enter», произошли необходимые расчеты, и список вычислений калькулятора обновился.
   Private Sub Выражение_AfterUpdate()
        Dim dbs As Database
        On Error GoTo 999  'Назначаем переход по ошибке
        If (Me.Выражение = ""Or _
            IsNull(Me.Выражение) Then Exit Sub 'Проверяем выражение
        dbs = CurrentDb 'Выбираем базу данных
        Me.Итог = Eval(Me.Выражение) 'Рассчитываем выражение
        subСохранитьВыражение() 'Сохраняем выражение в списке
        Me.Список.Requery() 'Пересматриваем список
        Me.Выражение = "" 'Сбрасываем выражение
        Me.кнПечать.SetFocus() 'Помещаем курсор для печати
        dbs = Nothing 'Обнуляем переменную
        Exit Sub 'Выходим из программы
999:
        Err.Clear() 'Очищаем поток от ошибок
        Me.Итог = "Ошибка" 'Сообщаем об ошибке
        Me.Выражение.SetFocus() 'Подготавливаем новый ввод данных
    End Sub

Выход из программы

 Обработка события. Пользователю Вашей программы надо обеспечить выход из приложения. Для этого напишем событие так, чтобы после нажатия кнопки Выход, программа запросила о выходе из калькулятора, и  в случае утвердительного ответа закрыла базу данных.
 Private Sub кнВыход_Click()
    If MsgBox("Закрыть калькулятор?", vbInformation + vbOKCancel, "Калькулятор") = vbOK Then
        Application.Quit acQuitSaveAll 'Выходим из приложения
    End If
End Sub

Открыть отчет

Обработка события. После проведенных вычислений нам может потребоваться отпечатать отчет. Для этого мы и создали кнопку Печать. Теперь мы должны написать событие, чтобы при нажатии кнопки отобразился документ "Отчет об итогах".
Private Sub кнПечать_Click()
     On Error Resume Next 'Отключаем диагностику ошибок
     DoCmd.OpenReport("Отчет об итогах", acViewPreview) 'Открываем отчет
     Err.Clear() 'В случае отсутствия данных очищаем поток ошибок
 End Sub

Расcчитать данные

Обработка событий. В нашем калькуляторе есть кнопка Расчет, вставим в программу событие, которое при нажатии данной кнопки будет проводить вычисление введенного в калькулятор выражения.
Private Sub кнРасчет_Click()
    If (Me.Выражение = ""Or IsNull(Me.Выражение) Then 'Проверяем выражение
        MsgBox("Введите выражение!", _
            vbInformation, Me.Name) 'Сообщаем об отсутствии данных
    Else
        Выражение_AfterUpdate()  'Обновляем выражение
    End If
End Sub

Сохранить выражение

Если мы хотим печатать данные о вычислениях, то надо уметь сохранять итоги расчетов калькулятора в таблице. Напишем функцию, которая будет это делать.
    Private Sub subСохранитьВыражение()
        Dim dbs As Database, rst As Recordset
        On Error GoTo 999  'Назначаем переход по ошибке
        dbs = CurrentDb 'Выбираем базу данных
        rst = dbs.OpenRecordset("SELECT * FROM [Калькулятор]")
        With rst
            If .RecordCount > 0 Then
                .MoveLast() '! Заполнить запрос SQL данными
            End If
            .AddNew() 'Добавить новую запись
            !Пункт = .RecordCount + 1 'Порядковый номер записи
            !Выражение = Me.Выражение 'Вычисляемое выражение
            !Итог = Me.Итог 'Итоговое вычисление
            .Update() '! Запомнить вычисления
        End With
        rst.Close() 'Закрываем запрос
        dbs = Nothing 'Уничтожаем переменную
        Exit Sub 'Выходим из программы
999:
        MsgBox Err.Description 'Сообщаем об ошибке
        Err.Clear() 'Очищаем поток от ошибок
    End Sub

Сбросить все вычисления

Обработка событий. И так при работе за калькулятором, Вам может потребоваться сбросить все вычисления, для этого напишем событие, которое будет  срабатывать при нажатии кнопки Сброс.
    Private Sub кнСброс_Click()
        Dim dbs As Database
        On Error GoTo 999  'Назначаем переход по ошибке
        dbs = CurrentDb 'Выбираем базу данных
        dbs.Execute("DELETE * FROM [Калькулятор]", dbFailOnError) 'Удаляем расчеты
        Me.Итог = "" 'Удаляем итог
        Me.Выражение = "" 'Очищаем выражение
        Me.Список.Requery() 'Обновляем список
        Exit Sub 'Выходим из программы
999:
        MsgBox Err.Description 'Сообщаем об ошибке
        Err.Clear() 'Очищаем поток от ошибок
    End Sub

Проверка знаний

Теперь Вы научились создавать формы в Access и можете себя считать в какой-то степени профессионалом. Для просмотра Вашей работы нажмите кнопку [Проверка N6], для продолжения учебы, нажмите кнопку Вперед>
Внимание! Открыв форму калькулятора в режиме просмотра, у Вас не будет работать кнопка Отчет, т.к. Вы еще не прослушали раздел лекций по разработке отчетов.

ОГЛАВЛЕНИЕ

ССЫЛКИ ПО ТЕМЕ

Загрузить исходники по теме (скоро …)

Комментариев нет: