CallBack Procedure

VS> Что-то я в силу несколько усеченных познаний в буржуйском языке плохо представляю  из Help’а, как работать с CALLBACK(entity, FileCallBackInterface, [flag]). Если у кого-то есть готовый пример, а еще лучше — пример под шаблоны Вадима Синявского, буду весьма признателен.

Так а в чем проблема-то? В доке кажется нормально все описано. Да и пример даже есть. Тоже нормальный.

Ну, на всякий случай:

Все знают, что работа в Кларион с файлами организована через драйвера. Драйвер — это обычная процедура, которая принимает все обращения к файлу. Эта процедура является как бы диспетчером, когда для выполнения определенной операции управление передается уже конкретной подпрограмме, входящей в драйверный модуль вместе с процедурой-диспетчером. Возможно не все знают, но работа с View так-же организована через процедуру-драйвер VIEWDRIVER, входящей в рантайм — библиотеку Клариона.

Так вот, в С55 сделали возможность вставлять свой код перед вызовом этой процедуры-драйвера и после ее вызова. Для этого необходимо в своей программе просто подключить файл FILECB.INC и написать две подпрограммки, задекларированные интерфейсным классом из этого файла. Где все это делать — решать уже самому программисту. Можно все это дело описать глобально, на уровне программы а можно и просто в конкретной подпрограмме. Перед использованием этих процедур — «перехватчиков» необходимо зарегистрировать для каждого файла или View, за которыми будем следить, или один и тоже интерфейсный класс или для каждого свой. Для отключения слежения надо вызвать этот же оператор CALLBACK() с установленным в True последним параметром Flag=True. Для отслеживания всех обращений от SQL-драйвера к SQL-серверу также есть подобный интерфейсный класс, описанный в том же файле FILECB.INC.

Вот, в принципе, и все. Для более полного понимания примера, приведенного в документации, следует также заглянуть в файл FILECB.INC

Применительно к шаблонам В.Синявского, я бы рекомендовал вставить INCLUDE(‘FILECB.INC’) или перед глобальным MAP-ом или сразу же после него. Там, где обычно вставляются INC-файлы для разных классов. Теперь, если делаешь тотальную слежку за каким-нибудь файлом, можно, опять же на уровне приложения, в секции глобальных данных, описать класс типа:

SpyFile   CLASS,IMPLEMENTS(FileCallBackInterface)
          END

Теперь надо создать одну или двепроцедуры:

  • для вызова перед процедурой-драйвером:
  SpyFile.FileCallBackInterface.FunctionCalled ...
  • для вызова после процедуры-драйвера:

SpyFile.FileCallBackInterface.FunctionDone …

Как их создать:

  • лучше всего создать пустую процедуру с любым именем через шаблон «Source».
  • в точке вставки «Подпрограммы в процедуре» пишешь вышеназванные процедуры.

При таком подходе не надо писатьвнешние сырцы а все сидит прямо в APP-шнике, и  в глобальный MAP эти процедуры не попадают.

Таким образом можно описать «шпионов» или по отдельности, для каждого «отслеживаемого» файла, или один «шпион» для всех таких файлов. Если пишешь одного «шпиона» для нескольких файлом, то определить текущий обрабатываемый файл можно по полю File из группы параметров, которые передаются в процедуру — «шпион» в качестве второго параметра. Ну или третьего, если считать еще «невидимку» Self в качестве первого параметра. Конечно, лучше всего для каждого отслеживаемого файла или View написать своих «шпионов».

В данном случае, под «шпионом» я понимаю набор:

  • класс типа SpyFile
  • процедуры — «перехватчики» (одна или две)

Аналогично делается и «шпион» для SQL-запросов через интерфейсный класс — SQLCallBackInterface.

Успехов!