2.3.4. Управление операциями

Для управления свойствами операций используется скриптовый объект TbtkScriptOperationOptionsObject. Получить к нему доступ можно в паскаль-скрипте через свойство выборки TbtkScriptSelectionObject.OperationOptions

TbtkScriptOperationOptionsObject содержит следующие методы:

Блокирование (запрет на выполнение) операций делает их не доступными для выполнения с помощью метода 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>