2.1.3. Асинхронное выполнение операций

Есть возможность запускать операции на выполнение асинхронно. Для этого используться метод TbtkScriptSelectionObject.AsyncExecOpScript. Рассмотрим пример. Есть операция Op1, которая принадлежит выборке Selection1. В операции есть вызов Selection.ExecOpScript('Op2'). В данном случае, до тех пор пока Op2 не вернет управление, выполнение Op1 не продолжится. Это накладывает определенные ограничения на те действия, которые можно выполнять в Op2. Например, нельзя удалить выборку Selection1. Если запустить выполнения Op2 асинхронно: Selection2.AsyncExecOpScript('Op2') , то управление сразу вернется в Op1. Выполнение Op2 начнется только после того, как завершится Op1 (и весь стек вызовов, который привел к вызову Op1). Также добавлен новый параметр в функцию CreateFormEx(...['UseActiveForm'],[1]). Если он установлен в 1, то создание новой формы не произойдет. Вместо этого выборка откроется на активной форме. Все это нужно для решения следующей задачи. Есть MDI список, из которого открывается MDI карточка. На карточке есть операции перемещению по списку. При этом объекты в списке могут быть разных типов и соответственно должны отображаться в разных карточках. Сделать это при помощи синхронных вызовов невозможно, т. к. при уничтожении карточки, уничтожаются все операции выборки (в том числе и операция перехода на следующую запись). Достичь нужного результата можно при помощи асинхронного запуска. Для этого в карточке в операции перемещения на следующую запись пишется следующий код:

<PASCAL>
  S := Selection.Master;
  //находим выборку-список  S.PriorRecord;
  if {здесь определяем, что нужно будет сменить карточку} then
  begin
    S.AddVar('UseActiveForm', 1, ftInteger); //имя переменной может быть любым
    S.AsyncExecOpScript('CardEdit'); // операция открытия карточки запускается асинхронно
  end
  else
    Selection.Refresh;
</PASCAL>

В выборке-списке в операции открытия карточки пишется:

<pascal>
  CreateFormEx(...['UseActiveForm'], [GetVar(UseActiveForm)]);
  AddVar('UseActiveForm', 0);
</pascal>