Робота з формами в Access, MS Office, Програмні керівництва, статті

Ще роблячи перший свій великий проект, років так шість тому, я прийшов до висновку, що на екрані повинна знаходитися тільки одна форма. Кілька одночасно відкритих форм захаращують робоче поле, виникає можливість випадкового перемикання між відкритими формами, що може привести до помилок. (Правда, іноді наявність декількох форм на екрані виправдано. Наприклад, з великої форми ти можеш викликати небудь довідник, щоб подивитися потрібне значення або відкоригувати його.) Використання модальних форм не завжди виправдано. Наприклад, при виведенні на екран звіту з модальної форми, ця форма залишається на екрані поверх звіту. Що не дуже-то красиво. Довелося сісти за розробку інтерфейсу. Після декількох експериментів, я прийшов до висновку, що при виклику однієї форми з іншої, треба робити батьківську форму невидимою, а при закритті – відновлювати видимість. Єдина умова – передача в дочірню форму імені батьківської форми. Тут можна використовувати три методи. (По крайней мере, я додумався до трьох.)



  1. Використовувати глобальну текстову змінну. У момент відкриття форми, зчитувати з неї ім’я батьківської форми, поміщати в локальну змінну, а в глобальну записувати своє ім’я відкривається форми. При виклику наступної форми, операція повторюється. Таким чином, в глобальної змінної зберігається ім’я поточної активної форми. При закритті форми спочатку в глобальну змінну поміщається ім’я батьківської форми з локальної змінної, потім закривається поточна форма і керування передається батьківського формі.
  2. Передавати ім’я батьківської форми через аргументи команди DoCmd.OpenForm
  3. Передавати ім’я батьківської форми через тег (Tag) завантажується форми.

Кожен спосіб має як свої переваги, так і недоліки. Зрештою, мені набридло виписувати рядки коду в кожній формі, за цим я зробив дві підпрограми і виніс їх в окремий модуль.


Ось приклад реалізації управління видимістю форм при передачі імені по третьому методу.


Підпрограма відкриття форми


Public Sub GotoForm(Name As String, Optional MyForm As Variant, Optional StrWhere As Variant, Optional StrArg As String)
“Параметри підпрограми GotoForm
“Name as String – ім’я завантажується форми
“MyForm as Variant – ім’я закривається форми (опціонально)
“StrWhere as Variant – cтроковое вираз, що представляє допустиме
“Пропозиція SQL WHERE без ключового слова
“WHERE (опціонально)
“StrArg as String – аргументи відкриття (опціонально)
On Error GoTo Err_GotoForm
Dim stDocName As String
Dim stLinkCriteria As String
Dim strHide As String
“Визначається ім’я активної форми
    strHide = Screen.ActiveForm.Name
“Активна форма робиться невидимої
    Screen.ActiveForm.Visible = False
“Перевіряється наявність умов
    If Not IsMissing(StrWhere) Then
        If Len(StrWhere) > 0 Then
            DoCmd.OpenForm Name, acNormal, , StrWhere, , , StrArg
“Перевіряється наявність закривається форми
            If Not IsMissing(MyForm) Then
                DoCmd.Close acForm, strHide
            Else
                Screen.ActiveForm.Tag = strHide
            End If
            Exit Sub
        End If
    End If
“Якщо немає умов для відкриття форми
    DoCmd.OpenForm Name, acNormal, , , , , StrArg
“Перевіряється наявність закривається форми
    If Not IsMissing(MyForm) Then
        DoCmd.Close acForm, strHide
    Else
        Screen.ActiveForm.Tag = strHide
    End If
Exit_GotoForm:
    Exit Sub
Err_GotoForm:
    MsgBox Err.Description
    Resume Exit_GotoForm
End Sub


****************************************************


Функція закриття форми

Public Function fnCloseForm() As Long
“Ця функція закриває поточну форму і робить
“Видимої батьківську форму
On Error GoTo Err_fnCloseForm
Dim strUnhide As String
Dim Name As String
“Визначається ім’я активної форми
    Name = Screen.ActiveForm.Name
“Визначається наявність батьківської форми
    If Nz(Screen.ActiveForm.Tag) = “” Then
        DoCmd.Close acForm, Name
    Else
        strUnhide = Screen.ActiveForm.Tag
        DoCmd.Close acForm, Name
        DoCmd.SelectObject acForm, strUnhide
    End If
“Якщо при виконанні функції не сталося помилки
    fnCloseForm = 0
Exit_fnCloseForm:
    Exit Function
Err_fnCloseForm:
“Якщо при виконанні функції сталася помилка
” MsgBox Err.Description
    fnCloseForm = Err.Number
    Resume Exit_fnCloseForm
End Function


Ці дві підпрограми треба застосовувати спільно. Код звичайно далекий від ідеалу, наприклад підпрограму GotoForm можна представити у вигляді:


Public Sub GotoForm(Name As String, Optional MyForm As Variant, Optional StrWhere As String, Optional StrArg As String)
“Параметри підпрограми GotoForm
“Name as String – ім’я завантажується форми
“MyForm as Variant – ім’я закривається форми (опціонально)
“StrWhere as String – cтроковое вираз, що представляє допустиме
“Пропозиція SQL WHERE без ключового слова
“WHERE (опціонально)
“StrArg as String – аргументи відкриття (опціонально)
On Error GoTo Err_GotoForm
Dim stDocName As String
Dim strHide As String
“Визначається ім’я активної форми
    strHide = Screen.ActiveForm.Name
“Активна форма робиться невидимої
    Screen.ActiveForm.Visible = False
“Відкривається нова форма
    DoCmd.OpenForm Name, acNormal, , StrWhere, , , StrArg
“Перевіряється наявність закривається форми
    If Not IsMissing(MyForm) Then
        DoCmd.Close acForm, strHide
    Else
        Screen.ActiveForm.Tag = strHide
    End If
Exit_GotoForm:
    Exit Sub
Err_GotoForm:
    MsgBox Err.Description
    Resume Exit_GotoForm
End Sub


Обидва варіанти працездатні, причому другий простіше і красивіше. Прошу не дуже лаяти, я ці подпрограммкі склав, коли з усієї літературу з Access у мене була книга “Access 97 – кроки до ефективної роботи” (Щось на зразок “Access за 24 години”) і хелп до самого Access 97.


Ці підпрограми по суті є “обгортками” стандартних команд Access. Їх можна змінювати і допрацьовувати під свій смак. Але і в такому вигляді вони вирішують більшість стоять перед Вами завдань. А якщо треба, то додайте нові параметри. Завантажити приклад реалізації роботи форм Ви можете нижче.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*