ГлавнаяMS ACCESS Запрет вывода окна свойств объекта в режиме формы ACCESS
Запрет вывода окна свойств объекта в режиме формы 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
Всё это хорошо работало, но когда я перешел на 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
Примечание: в Access 97 я не смог найти аналог свойству AllowDesignChanges, хотя при преобразовании из Access 2000, возможность открыть окно свойств объектов в режиме формы блокируется.