В
процессе разработки формы очень интенсивно используется окно задания
свойств оъекта. Но когда разработка закончена, то появление этого окна
в рабочей версии программы нежелательно. Намекает на низкую
квалификацию разработчика. В 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 "Невозможно
присвоить значение объекту". Оказалось, что это свойство можно изменять
только в режиме конструктора. Поэтому пришлось пойти по другому пути и
написать следующую подпрограмму.
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.
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, возможность открыть окно свойств
объектов в режиме формы блокируется.
|