Запрет вывода окна свойств объекта в режиме формы ACCESS
Автор Дмитрий Сонных (aka Joss)   
27.01.2008 г.

В процессе разработки формы очень интенсивно используется окно задания свойств объекта.
Но когда разработка закончена, то появление этого окна в рабочей версии программы нежелательно. Намекает на низкую квалификацию разработчика.
В Access 2000 (и старше), в форме появилось свойство AllowDesignChanges, которое управляет выводом окна свойств на экран. Оно имеет тип Boolean.


Значения:
True (-1) - (По умолчанию) Изменения свойств объектов могут быть сделаны во всех режимах формы.
False (0) - Изменения свойств объектов могут быть сделаны только в режиме конструктора.

Его можно изменить на вкладке "Другие" в самом низу списка параметров.
В русской версии оно называется "Разрешить изменение макета" и имеет значения - "Все режимы" (True) и "Только режим конструктора" (False).

Конечно, значение этого параметра можно установить вручную. Если форм несколько, то это сделать легко. А если их несколько десятков? Сразу возникает предложение: вставить в отдельный модуль глобальную переменную blnDesignForm и присвоить ей значение True на время разработки программы.


Public Const blnDesignForm As Boolean = True

В каждой форме, в секции Form_Load вставить строку

Me.AllowDesignChanges = blnDesignForm

После окончания разработки изменить значение blnDesignForm с True на False.

К сожалению оказалось, что всё не так просто. Попытка программно изменить параметр формы AllowDesignChanges, выдает ошибку 2448 "Невозможно присвоить значение объекту". Оказалось, что это свойство можно изменять только в режиме конструктора. Поэтому пришлось пойти по другому пути и написать следующую подпрограмму.



'---------------------------------------------------------------------------------------
' Procedure : SetChangeDesignDAO
' DateTime  : 03.05.2006 11:41
' Release   : 1.1
' Author    : Дмитрий Сонных (aka Joss)
' Purpose   : Подпрограмма изменения параметра формы AllowDesignChanges
'---------------------------------------------------------------------------------------
'
Public Sub SetChangeDesignDAO()

' Подпрограмма изменения параметра формы AllowDesignChanges -
' разрешение на вывод окна параметров на экран во всех режимах - True
' или только в режиме конструктора - False
' В подпрограмме использованы некоторые идеи Юрия Шермана
' Для запуска подпрограммы установите на неё маркер и нажмите F5

Dim MN As String, j As Integer, n As Integer
Dim ContainerName As String
Dim blnChange As Boolean

   On Error GoTo SetChangeDesignDAO_Error

   ContainerName = "Forms"

' Выбор режима вывода окна свойств
Select Case MsgBox("Разрешить вывод окна параметров на экран только в режиме конструктора?" _
                   & vbCrLf & "(Нет(No) - во всех режимах)" _
                   , vbYesNoCancel Or vbQuestion Or vbDefaultButton1, _
                   "Установка режима вывода окна параметров на экран")
    Case vbYes
' разрешение на вывод окна параметров на экран только в режиме конструктора
        blnChange = False
    Case vbNo
' разрешение на вывод окна параметров на экран во всех режимах
        blnChange = True
    Case vbCancel
' отмена выполнения подпрограммы
        Exit Sub
End Select

' определяем количество форм
    n = CurrentDb.Containers(ContainerName).Documents.Count - 1
' подготавливаем статусную строку для вывода прогрессбара
    If n >= 0 Then
' выводит в статусной строке слово Forms
        SysCmd acSysCmdSetStatus, ContainerName
' выводит в статусной строке количество форм
        SysCmd acSysCmdInitMeter, ContainerName, (n + 1)
    Else
' выход из процедуры если форм нет
        Exit Sub
    End If
' перебор форм
    For j = 0 To n
        MN = CurrentDb.Containers(ContainerName).Documents(j).Name
' открываем форму в режиме конструктора
        DoCmd.OpenForm MN, acDesign, , , , acHidden
' изменяем параметр AllowDesignChanges
        Forms(MN).AllowDesignChanges = blnChange
' закрываем форму с сохранением
        DoCmd.Close acForm, MN, acSaveYes
' изменяем значение прогрессбара в статусной строке
        SysCmd acSysCmdUpdateMeter, (j + 1)
    Next
' очищаем статусную строку
SysCmd acSysCmdClearStatus

   On Error GoTo 0
   Exit Sub

SetChangeDesignDAO_Error:
    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure SetChangeDesignDAO"

End Sub

Всё это хорошо работало, но когда я перешел на ADP, подпрограмму пришлось переработать. Дело в том, что для ADP CurrentDB не действует. Пришлось немного посидеть над подпрограммой. Теперь её можно применять и в MDB и в ADP.




'---------------------------------------------------------------------------------------
' Procedure : SetChangeDesignADO
' DateTime  : 01.01.2008 11:41
' Release   : 1.1
' Author    : Дмитрий Сонных (aka Joss)
' Purpose   : Подпрограмма изменения параметра формы AllowDesignChanges
'---------------------------------------------------------------------------------------
'
Public Sub SetChangeDesignADO() 'blnChange As Boolean)

' Подпрограмма изменения параметра формы AllowDesignChanges -
' разрешение на вывод окна параметров на экран во всех режимах - True
' или только в режиме конструктора - False
' В подпрограмме использованы некоторые идеи Юрия Шермана


Dim FormName As String, j As Integer, n As Integer
Dim ContainerName As String
Dim blnChange As Boolean

   On Error GoTo SetChangeDesignADO_Error

   ContainerName = "Forms"

' Выбор режима вывода окна свойств
Select Case MsgBox("Разрешить вывод окна параметров на экран только в режиме конструктора?" _
                   & vbCrLf & "(Нет(No) - во всех режимах)" _
                   , vbYesNoCancel Or vbCritical Or vbDefaultButton1, _
                   "Установка режима вывода окна параметров на экран")
    Case vbYes
' разрешение на вывод окна параметров на экран только в режиме конструктора
        blnChange = False
    Case vbNo
' разрешение на вывод окна параметров на экран во всех режимах
        blnChange = True
    Case vbCancel
' отмена выполнения подпрограммы
        Exit Sub
End Select

' определяем количество форм
    n = CurrentProject.AllForms.Count - 1
' подготавливаем статусную строку для вывода прогрессбара
    If n >= 0 Then
' выводит в статусной строке слово Forms
        SysCmd acSysCmdSetStatus, ContainerName
' выводит в статусной строке количество форм
        SysCmd acSysCmdInitMeter, ContainerName, (n + 1)
    Else
' выход из процедуры если форм нет
        Exit Sub
    End If
' перебор форм
    For j = 0 To n
        FormName = CurrentProject.AllForms(j).Name
' открываем форму в режиме конструктора
        DoCmd.OpenForm FormName, acDesign, , , , acHidden
' изменяем параметр AllowDesignChanges
        Forms(FormName).AllowDesignChanges = blnChange
' закрываем форму с сохранением
        DoCmd.Close acForm, FormName, acSaveYes
' изменяем значение прогрессбара в статусной строке
        SysCmd acSysCmdUpdateMeter, (j + 1)
    Next
' очищаем статусную строку
    SysCmd acSysCmdClearStatus

   On Error GoTo 0
   Exit Sub

SetChangeDesignADO_Error:
    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure SetChangeDesignADO"

End Sub


Примечание: в Access 97 я не смог найти аналог свойству AllowDesignChanges, хотя при преобразовании из Access 2000, возможность открыть окно свойств объектов в режиме формы блокируется.


Просмотров: 15906

  Коментарии (1)
 1 Написал(а) Олег, в 21:22 16.04.2009
Ух как сложно то все. Порой бывает сама программа в базе меньше, чем борьба с ее свойствами. Всетаки легче воспринимается то, что в начале. Спасибо за подсказку со свойствами.

Добавить коментарий
Имя:
E-mail
Коментарий:



Код:* Code