2.3.4. Управление операциями¶
Для управления свойствами операций используется скриптовый объект
TbtkScriptOperationOptionsObject
. Получить к нему доступ можно в
паскаль-скрипте через свойство выборки TbtkScriptSelectionObject.OperationOptions
TbtkScriptOperationOptionsObject содержит следующие методы:
TbtkScriptOperationOptionsObject.SetStandardDisabled
- блокирование стандартной операции;TbtkScriptOperationOptionsObject.SetCustomDisabled
- блокирование не стандартной операции;TbtkScriptOperationOptionsObject.SetCustomInactive
- отключение не стандартной операции, с удалением её из панели управления.
Блокирование (запрет на выполнение) операций делает их не доступными для
выполнения с помощью метода ExecOpScript
, а также делает неактивными
соответствующие им элементы интерфейса.
2.3.4.1. Блокирование стандартных операций¶
Для запрета или разрешения выполнения стандартных операций используется
метод TbtkScriptOperationOptionsObject.SetStandardDisabled
(Selection.OperationOptions.SetStandardDisabled).
При этом если запрещается операция “редактирование”
(SetStandardDisabled(dsoEdit, True)
), изменения свойства ReadOnly у
полей выборки не скажутся на возможности редактирования до снятия
блокировки с операции (SetStandardDisabled(dsoEdit, False)
).
<pascal>
Selection.OperationOptions.SetStandardDisabled(dsoInsert, True); // запретить вставку
Selection.OperationOptions.SetStandardDisabled(dsoEdit, False); // разрешить редактирование
Selection.SetFieldsReadOnly('FooField1', False);
SetVar('FooField1', 'some value'); // Не приведет к ошибке. Поле будет изменено
Selection.OperationOptions.SetStandardDisabled(dsoEdit, True);
SetVar('FooField1', 'some value'); // Приведет к ошибке так как запрещено редактирование
Selection.SetFieldsReadOnly('FooField1', True);
Selection.OperationOptions.SetStandardDisabled(dsoEdit, False);
SetVar('FooField1', 'some value'); // Приведет к ошибке, так как поле ReadOnly
</pascal>
2.3.4.2. Блокирование нестандартных операций¶
Для блокирования нестандартных операций используется метод
TbtkScriptOperationOptionsObject.SetCustomDisabled
(Selection.OperationOptions.SetCustomDisabled).
<pascal>
Selection.OperationOptions.SetCustomDisabled('fooOper1', True); // запрещает выполнение операции с именем "fooOper1"
Selection.OperationOptions.SetCustomDisabled('fooOper2', False); // разрешает выполнение операции с именем "fooOper2"
</pascal>
2.3.4.3. Отключение не стандартных операций¶
Для отключения пользовательских операций со скрытием их на панели
управления используется метод TbtkScriptOperationOptionsObject.SetCustomInactive
(Selection.OperationOptions.SetCustomInactive).
<pascal>
Selection.OperationOptions.SetCustomInactive('fooOper1', True); // запрещает выполнение операции с именем "fooOper1" и убирает соответствующие ей кнопки из интерфейса.
Selection.OperationOptions.SetCustomInactive('fooOper2', False); // разрешает выполнение операции с именем "fooOper2" и отображает соответствующие ей кнопки в интерфейсе.
</pascal>
2.3.4.4. Устаревшие методы¶
Для управления доступом к операциям раньше использовались методы выборки:
- SetDisabled, - блокирование стандартной операции;
- SetCustomDisable, - блокирование не стандартной операции;
- SetCustomInactive, - отключение не стандартной операции, с удалением её из панели управления.
Логика работы старых методов Selection.SetCustomDisable
и
Selection.SetCustomInactive
полностью совпадает с работой новых
методов Selection.OperationOptions.SetCustomDisabled
и
Selection.OperationOptions.SetCustomInactive
, соответственно. В работе
старого метода Selection.SetDisabled
и соответствующего ему нового
метода Selection.OperationOptions.SetStandardDisabled
присутствуют
существенные различия. Эти отличия связаны с изначально допущенной в
методе SetDisabled
ошибке, которая позволяет разрешать редактирование
для отдельных полей выборки, при заблокированной операции
“редактирование”.
2.3.4.4.1. Известные проблемы метода Selection.SetDisabled и способы решения¶
При блокировании операции “редактирование” методом
Selection.SetDisabled
не учитываются изменения свойств ReadOnly полей выборки:<pascal> Selection.SetFieldsReadOnly('fooField1,fooField2', '0,0'); //присваивает значение False свойствам ReadOnly полей "fooField1" и "fooField2". Selection.SetDisabled(dsoEdit, True); //присваивает значение True свойствам ReadOnly всех полей выборки и блокирует операцию "редактирование" Selection.SetFieldsReadOnly('fooField1,fooField2', '0,1'); //присваивает значение False и True свойствам ReadOnly полей "fooField1" и "fooField2" соответственно. Selection.SetDisabled(dsoEdit, False); //снимает блокировку с операции "редактирование" и восстанавливает состояние которое было у свойств ReadOnly всех полей выборки перед блокированием операции "редактирование". т.е. в данном случае присваивает значение False свойствам ReadOnly полей "fooField1" и "fooField2". //решение: Selection.SetFieldsReadOnly('fooField1,fooField2', '0,0'); //присваивает значение False свойствам ReadOnly полей "fooField1" и "fooField2". Selection.OperationOptions.SetStandardDisabled(dsoEdit, True); //блокирует операцию "редактирование" (свойства всех полей ReadOnly будут возвращать значение True, не зависимо от того какое им задаётся значение, редактироваться такие поля не будут!). Selection.SetFieldsReadOnly('fooField1,fooField2', '0,1'); //присваивает значение False и True свойствам ReadOnly полей "fooField1" и "fooField2" соответственно. Эти поля всё ещё НЕ могут редактироваться т.к. операция "редактирование" заблокирована. Selection.OperationOptions.SetStandardDisabled(dsoEdit, False); //снимает блокировку с операции "редактирование". Поле "fooField1" теперь может редактироваться, а поле "fooField2" нет, т.к. значения свойства ReadOnly у них False и True, соответственно. </pascal>
Повторный вызов
Selection.SetDisabled
с теми же параметрами не вызывает никакой реакции:<pascal> Selection.SetDisabled(dsoEdit, True); //присваивает значение True свойствам ReadOnly всех полей выборки и блокирует операцию "редактирование" Selection.SetFieldsReadOnly('fooField1,fooField2', False); //присвоили значение False свойствам ReadOnly полей "fooField1" и "fooField2", эти поля могут редактироваться Selection.SetDisabled(dsoEdit, True); //не отрабатывает!!! т.к. операция уже заблокирована. Поля "fooField1" и "fooField2" всё ещё могут редактироваться //1 вариант решения: Selection.SetFieldsReadOnly(Selection.GetFieldNames, True); //присваивает значение True свойствам ReadOnly всех полей выборки, но не блокирует операцию "редактирование" Selection.SetFieldsReadOnly('fooField1,fooField2', False); //присвоили значение False свойствам ReadOnly полей "fooField1" и "fooField2", эти поля могут редактироваться Selection.SetFieldsReadOnly(dsoEdit, True); //снова присваивает значение True свойствам ReadOnly всех полей. Поля "fooField1" и "fooField2" НЕ могут редактироваться //2 вариант решения: Selection.OperationOptions.SetStandardDisabled(dsoEdit, True); //блокирует операцию "редактирование" (свойства всех полей ReadOnly будут возвращать значение True, не зависимо от того какое им задаётся значение, редактироваться такие поля не будут!). Selection.SetFieldsReadOnly('fooField1,fooField2', False); //присвоили значение False свойствам ReadOnly полей "fooField1" и "fooField2", эти поля НЕ могут редактироваться т.к. операция "редактирование" заблокирована. Чтобы эти поля снова стали редактируемыми нужно вызвать Selection.OperationOptions.SetStandardDisabled(dsoEdit, False); </pascal>
Блокирование/разблокирование операции “редактирование” методом
Selection.SetDisabled
либо методомSelection.OperationOptions.SetStandardDisabled
приводит к неопределённому состоянию операции “редактирование” в случае если она уже заблокирована вызовом дрогого метода:<pascal> Selection.SetDisabled(dsoEdit, True); //присваивает значение True свойствам ReadOnly всех полей выборки и блокирует операцию "редактирование" Selection.SetFieldsReadOnly('fooField1,fooField2', False); //присвоили значение False свойствам ReadOnly полей "fooField1" и "fooField2", эти поля могут редактироваться Selection.OperationOptions.SetStandardDisabled(dsoEdit, True); //блокирует операцию "редактирование" (свойства всех полей ReadOnly будут возвращать значение True, не зависимо от того какое им задаётся значение, редактироваться такие поля не будут!). Selection.SetDisabled(dsoEdit, False); //снимает блокировку с операции "редактирование" и восстанавливает состояние которое было у свойств ReadOnly всех полей выборки перед блокированием операции, т.е. в данном случае присваивает значение False свойствам ReadOnly всех полей. НО! операция "редактирование" всё ещё ЗАБЛОКИРОВАНА методом Selection.OperationOptions.SetStandardDisabled что должно запрещать редактирование полей в любом случае, но из-за особенностей метода Selection.SetDisabled все поля ДОСТУПНЫ для редактирования! При этом в отладочной сборке приложения будет выведено сообщение о некорретном совместном использовании этих методов, в релизной же версии подобных сообщений не будет. //вариант решения для случая когда не удаётся отказаться от совместного использования этих методов: Selection.SetDisabled(dsoEdit, True); //присваивает значение True свойствам ReadOnly всех полей выборки и блокирует операцию "редактирование" Selection.SetDisabled(dsoEdit, False); //снимает блокировку с операции "редактирование" и восстанавливает состояние которое было у свойств ReadOnly всех полей перед блокированием операции. Selection.SetFieldsReadOnly('fooField1,fooField2', False); //присвоили значение False свойствам ReadOnly полей "fooField1" и "fooField2", эти поля могут редактироваться Selection.OperationOptions.SetStandardDisabled(dsoEdit, True); //блокирует операцию "редактирование" (свойства всех полей ReadOnly будут возвращать значение True, не зависимо от того какое им задаётся значение, редактироваться такие поля не будут!). Selection.SetDisabled(dsoEdit, False); //не вызывает никакого эффекта, т.к. операция "редактирование" не была блокирована методом Selection.SetDisabled; Selection.OperationOptions.SetStandardDisabled(dsoEdit, False); //корректно снимает блокировку с операции "редактирование" </pascal>