По-Умолчанию, в качестве Построителя Отчетов используется приложение: ReportBuilder.App, которое содержит внутреннюю таблицу, в которой закреплены специфические методы обработки событий. В указанной Таблице описаны способы обработки комбинаций Объект-Событие, как событие игнорируется, или перенаправляется соответствующему классу обработки события.

Дополнительную информацию о классах Обработчика событий можно посмотреть в исходных программных текстах приложения reportbuilder.app, которые содержатся в архиве: XSource Folder, который размещен в подкаталоге  домашнего каталога  Visual FoxPro HOME().

Поскольку указанная Таблица Регистрации является внутренней для приложения, поэтому она не может быть изменена. Приложение ReportBuilder.App имеет механизм получения копии этой Таблицы на диске, которую уже можно корректировать, изменять значения по-умолчанию или добавлять собственные классы обработчиков событий.

Дополнительную информацию смотрите в разделе: Как: Настроить Обработчик Событий в Построителе Отчетов.

А в данном параграфе:

Expand imageСтруктура Таблицы

Приложение ReportBuilder.App использует внутреннюю Регистрационную Таблицу, с помощью которой  определяется требуемый Класс Обработчика, который создается для соответствующих Событий EventType и объектов Отчета report object (которые определяют текущую выборку записей из курсора FRX рассматриваемого отчета, которые описывают либо Контрол Отчета, либо Полосу Отчета, либо Заголовок Отчета и так далее (объект Отчета). Структура Таблицы Регистрации представлена далее:

Имя Поля Тип (размер) Краткое Описание

REC_TYPE

C (1)

Определяет Тип класса Обработчика, описываемый в данной Записи таблицы.

HNDL_CLASS

C (35)

Определяет Имя класса.

Требуемый класс может быть создан с помощью функции NEWOBJECT(), где необходимо указать содержащую его Библиотеку, или использовать команды Visual FoxPro SET CLASSLIB или SET PATH.

HNDL_LIB

C (50)

Определяет имя файла Библиотеки Классов.

Это может быть или визуальная библиотека (.vcx) или программный модуль (.prg) описания классов.

EVENTTYPE

I

Определяет Тип События. Используйте значение =  -1 для шаблонов (масок) типа "wild card".

Допустимые типы событий описываются в разделе:  Основные понятия о Событиях в Построителе Отчетов.

OBJTYPE,

OBJCODE

I,

I

Определяет тип Контрола Отчета (Объекта Отчета, или Элемента Отчета). Данное поле аналогично полям  с именами OBJTYPE и OBJCODE, которые имеются в соответствующих таблицах Отчетов (.frx).

Используйте значение = -1 для соответствия шаблону поиска (включения в результат выборки).

Дополнительную информацию о структуре таблиц файлов Отчетов смотрите в разделе: Структуры Табличных файлов типа (.dbc, .frx, .lbx, .mnx, .pjx, .scx, .vcx) .

NATIVE

L

Определяет отмену внутренней обработки события. Для таких записей отчета, комбинации типа События + Объекта отчета, внутреннее поведение (или реакция) Дизайнера отчетов может быть изменена, или заменена пользовательскими действиями.

DEBUG

L

Определяет режим "debug handler override" (отмену режима Отладки Обработчика). Для таких записей отчета, комбинации типа События + Объекта отчета, специальный пользовательский интерфейс режима Отладки может быть активирован взамен стандартного режима Отладки, определенного в системной переменной HNDL_CLASS.

FLTR_ORDR

C (1)

Определяет порядок (очередность), с помощью которого выполняется обработка Фильтров обработчика Событий. Применяется только для Записей, у которых: REC_TYPE="F".

NOTES

C (50)

Данное поле не используется в приложении ReportBuilder.App, но информация из этого поля может быть отображена в Браузере при просмотре Таблицы Регистрации Обработчика Событий Построителя Отчета. (Дополнительную информацию смотрите в разделе: Event Handler Registry, диалоговый бокс (Построитель Отчетов.)

Остальные дополнительные поля, существующие в рассматриваемой Таблице игнорируются Построителем Отчетов.

Expand imageТипы Классов Обработчика Событий

Классы, определяемые в Таблице Регистрации, могут быть одного из следующих Типов:

Значение Тип Краткое Описание

H

Event Handler

Определяет Класс Обработчика для специфической комбинации события построителя + объекта отчета.

F

Filter Handler

Определяет класс обработчика, который будет вызван для каждого События Построителя, и может отменять обработку конкретного события (внутренним обработчиком) построителя Отчетов.

X

Exit Handler

Определяет Класс обработчика, который вызывается после завершения процесса обработки конкретного События Построителя, но до момента передачи управления обратно в Дизайнер Отчета. Обычно выполняет роль завершающего процесса, восстановления восстановления начальных параметров, значений переменных, типа "Clean Up Process".

G

GetExpression Wrapper

Определяет класс, который будет вызван взамен стандартного диалогового бокса GETEXPR, который может быть вызван из другого диалогового бокса Построителя.

E

Run-time Extension Editor

Определяет класс, который будет вызван в тот момент, когда активируется кнопка Edit settings (Изменение Настроек), расположенная в закладке Other из Report Control Properties, диалоговый бокс.

M

Multi-select dialog tab

Определяет класс, который создается на основе базового класса  Page Object , который в свою очередь автоматически добавляется в Контейнер Multiple Selection, диалоговый бокс (Построитель Отчетов).

Expand imageПрограммный интерфейс (API) Обработчика Событий

Классы Обработчика Событий могут быть порождены любым базовым классом Visual FoxPro, но должны осуществлять программный интерфейс (API) с указанным Обработчиком Event Handler API. Упомянутый программный интерфейс Event Handler API имеет следующие признаки:

  • Должен содержать Метод м именем "Execute", который должен принимать один параметр - ссылку на Объект (которым является передаваемый в класс объект обработки).

В том случае, если указанный выше метод обработки Объекта Execute( oEvent )не определен в вашем Классе, Обработчик Событий должен устанавливать соответствующие Флаги возвращаемых значений, как приводится в примере, фрагменте программного Кода:

  CopyCode imageКопировать Код
DEFINE CLASS MyHandler AS Custom
PROCEDURE Execute( oEvent )
* You can alter oEvent.returnFlags to suit
oEvent.SetHandledByBuilder(.T. | .F. )
oEvent.SetReloadChanges( .T. | .F. )
ENDPROC
ENDDEFINE

Рассматриваемый Метод получает ссылку на Объект, в котором произошло Событие, требующее обработки. Обработчик установить требуемое значение Флага в возвращаемую переменную ReturnFlags и определить необходимое действие, которое должен выполнить Дизайнер Отчетов для рассматриваемого Объекта после того, как управление будет возвращено из рассматриваемого Класса.

Обработчик Событий:

  • Определяет значение для поля REC_TYPE = "H".

  • Определяет общий принцип обработки для конкретной комбинации данного типа события + типа объекта отчета.

Дополнительную информацию по использованию необходимых Свойств и выполнения Метода  Execute() смотрите в разделе: Класс Событий Построителя Отчетов.

Expand imageПрограммный интерфейс (API) Фильтра Обработчика

Класс Фильтра может быть порожден одним из базовых классов Visual FoxPro и обязан осуществлять соответствующий программный интерфейс  Event Handler API (смотрите выше), дополнительно, в этом классе Фильтра, должно быть создано свойство с именем  allowToContinue:

  CopyCode imageКопировать Код
DEFINE CLASS MyFilter AS Custom
allowToContinue = .T.
PROCEDURE Execute( oEvent )
* decide whether or not to process the event
THIS.allowToContinue = .T.
* You can optionally alter oEvent.returnFlags to suit
oEvent.SetHandledByBuilder(.T. | .F. )
oEvent.SetReloadChanges( .T. | .F. )
ENDPROC
ENDDEFINE

Класс Фильтра Обработчика Событий:

  • Определяет значение поля в Таблице Регистрации REC_TYPE = "F".

  • Обрабатывает каждое событие Построителя Отчетов.

  • Осуществляет обработку потока событий согласно приоритетам, заданным в поле FLTR_ORDR.

  • Может прервать дальнейшую обработку поступаемых Событий, для этого устанавливается значение Свойства AllowToContinue = False (.F.)

  • Может выполнить предварительную обработку исходного  курсора FRX до начала обработку поступившего События в рассматриваемый класс обработчика Событий.

Expand imageОбработчики Завершения (Exit Handlers)

Класс Обработчика Завершения (Exit Handler class) должен поддерживать программный интерфейс:  API-интерфейс Обработчика Событий.

Класс Обработчика типа Exit:

  • Определяет значение поля REC_TYPE = "X".

  • В основном используется для выполнения специального программного Кода в момент завершения обработки События (clean-up time).

  • Данный класс выполняется только в том случае, когда выполнены (обработаны) все текущие События с помощью Обработчика Event Handler. Если класс Фильтра обработчика прерывает выполнение текущего цикла обработки, то рассматриваемый класс Завершения (Exit) не будет выполнен.

  • Как и любые рассматриваемые классы, данный Класс может изменять или уточнять значения флагов завершения получаемого по ссылке объекта события oEvent.ReturnFlags. Но данная практика не является рекомендуемой, класс предназначен для других целей.

Expand imageОболочка GetExpression (API)

Вы можете заменить стандартно установленный диалоговый бокс определения требуемого Выражения GETEXPR,для этого требуется определить соответствующий объект в Таблице Регистрации, для записи которого устанавливается значение поля REC_TYPE="G". Создаваемый Класс обработчика должен содержать "замещающий" Метод с именем GetExpression(). К примеру, как показано в следующем фрагменте программного Кода:

  CopyCode imageКопировать Код
DEFINE CLASS MyGetExpr AS Custom
PROCEDURE GetExpression( cDefExpr, cDataType, cCalledFrom, oEvent )
LOCAL cExpression
GETEXPR TO cExpression DEFAULT cDefExpr
RETURN cExpression
ENDPROC
ENDDEFINE

Только один "замещающий" Класс для перехвата стандартного класса обработки требуемого выражения GetExpressionWrapper может быть определен в вашей Таблице Регистрации. Если будет создано несколько записей со значением поля REC_TYPE="G," то только первая найденная Запись будет использоваться как описание "замещающего" класса обработки События Построителя Отчетов.

Описание параметра cCalledFrom

Построитель Отчетов направляет в стандартный обработчик GetExpressionWrapper параметр, описывающий тип создаваемого Выражения , которое необходимо изменить или подтвердить. Допустимы следующие варианты типов Выражения:

  • "PrintWhenExpression"         - условие печати элемента Отчета;

  • "FieldExpression"                  - выражение для Контрола Отчета;

  • "OleBoundField"                    -  Поле внешнего объекта OLE;

  • "OleBoundExpression"          -  Выражение типа OLE; 

  • "BandGroupOnExpression"    - Выражение для группы Полос Отчета;

  • "VariableValueToStore"         - Значение для переменной Отчета;

  • "VariableInitialValue"            - Значение для начального значения Переменной Отчета.

Expand imageПрограммный интерфейс (API) Редактора Данных расширенных функций выполнения Отчета

Вы можете заменить стандартный Диалоговый бокс, который активируется при нажатии кнопки Edit settings (Изменение установок), которая размещена в группе командных кнопок Run-time extensions (Расширения Режима выполнения Отчета) , расположенной в закладке Other Построителя Отчетов; в этом случае создается соответствующая запись в Таблице Регистрации со значением поля REC_TYPE = "E". Создаваемый класс должен поддерживать требования, описанные в разделе: Event Handler API. Если создаваемый класс представляет собой Форму, то последняя должна быть модальной (MODAL window).

Рассматриваемый "замещающий" класс должен содержать Метод с именем Execute(), который выполняет следующие операции:

  • Читает метаданные в формате XML из соответствующего поля STYLE.

  • Обеспечивает необходимый интерфейс для пользователя по редактированию указанных метаданных.

  • Сохраняет измененные метаданные в формате XML в указанном поле STYLE.

  • В отличие от рассмотренных выше Классов Обработчика Событий, данный метод не может устанавливать соответствующие значения Флагов возвращаемых значений (ReturnFlags).

Только один "замещающий" класс с типом "Е" может быть создан в Таблице Регистрации для стандартного класса RuntimeExtensionEditor. Если вы создаете несколько классов Редактора с типом = "E", то будет обработана только первая найденная запись указанной Таблицы.

Expand imageСоздание новой Закладки в диалоговый бокс Multiple-selection (Множественного выбора)

Вы можете добавить новую Закладку в Контейнер Multiple Selection, диалоговый бокс (Построитель Отчетов), для этого  существует возможность создания нового класса в Таблице Регистрации Обработчика Событий, для записей которых устанавливается признак REC_TYPE  = "M".

Указанный класс должен порождаться базовым классом Page Object. Если указанный класс будет содержать внутренние объекты типа  Container Object,  тогда должны быть созданы соответствующие Методы с именами .LoadFromFrx() и .SaveToFrx(), которые могут быть вызваны из различных мест рассматриваемого Диалогового Бокса множественного выбора; например, как описывается в следующем фрагменте программного Кода:

  CopyCode imageКопировать Код
DEFINE CLASS pagAlign AS page
Caption = "Alignment"
Name = "pagAlign"
ADD OBJECT Panel1 AS panelAlign
ENDDEFINE

DEFINE CLASS panelAlign as Container
BorderWidth = 0
Width = 300
Height = 300
Event = null
frxCursor = null

ADD OBJECT Check1 AS Checkbox WITH ;
Caption = "Align to leftmost object", ;
Top = 100, Left = 50, Width = 150, Value=.F.

PROCEDURE LoadFromFrx()
* No initialization required
RETURN .T.
ENDPROC

PROCEDURE SaveToFrx()
IF THIS.Check1.Value
LOCAL curSel
curSel = SELECT()
SELECT MIN(hpos) AS hpos FROM frx ;
WHERE curpos AND objcode<>53 ;
INTO CURSOR query
newHpos = query.hpos
USE IN query
SELECT frx
SCAN FOR curpos AND RECNO()>1
REPLACE hpos WITH m.newHpos
ENDSCAN
SELECT (m.curSel)
ENDIF
RETURN .T.
ENDPROC
ENDDEFINE

В представленном Примере, создается дополнительная Закладка в Диалоговом боксе множественного выбора, в которой размещается один управляющий Контрол-переключатель (CheckBox) который, если он является отмеченным, выполняет горизонтальное размещение всех выделенных (выбранных) объектов текущего Отчета относительно самого левого объекта из выделенных (другими словами - стандартное выравнивание по левому краю).

Рассматриваемый контейнерный объект должен обеспечивать следующие программные компоненты для удовлетворения полного программного интерфейса:

  • Метод LoadFromFrx()вызывается в процессе инициализации рассматриваемой Формы (диалогового бокса), поэтому является удобным местом для размещения программного Кода определения начальных значений переменных или других необходимых действий.

  • Метод SaveToFrx() вызывается в момент нажатия пользователем кнопки OK (при закрытии рассматриваемого диалогового бокса). Выполните возврат значения, = FALSE, если вам требуется не закрывать данный диалоговый бокс.

  • Если определено, то Свойство с именем Event может содержать ссылку на соответствующий Объект построителя Отчетов, событие которого требует обработки. (Дополнительную информацию смотрите в разделе: Класс Событий Построителя Отчетов.)

  • Если определено, Свойство с именем frxCursor может содержать соответствующую ссылку на объект frxCursor (для удобства дополнительной обработки событий данного объекта). (Дополнительную информацию смотрите в разделе: FRX Cursor, фундаментальный класс.)

В том случае, когда вы создаете несколько записей в Таблице Регистрации с указанным выше признаком дополнительной Закладки (REC_TYPE="M"), то для каждого созданного класса, загруженного в рассматриваемый Диалоговый бокс, создается отдельная независимая Закладка в общем контейнере.

Expand imageКак обрабатывать События Построителя Отчетов

Когда Построитель Отчета запущен, дизайнер отчета передает идентификатор (ID) типа события вместе с копией соответствующего файла  FRX, открытого в приватной сессии данных. Объект отчета, к которому относится рассматриваемое Событие, обычно идентифицируется указателем Записи в соответствующем курсоре FRX. Сначала построитель отчета запрашивает значения полей OBJTYPE и OBJCODE из выбранной записи, а после этого (с помощью соответствующей ссылки) обращается в Таблицу регистрации Обработчика.

1. Все фильтры Обработчика выполнены.

Построитель выбирает все записи из таблицы регистрации, для которых установлено значение поля REC_TYPE="F", сортирует выбранные записи по полю FLTR_ORDR, и выполняет каждый класс Фильтра с помощью метода Execute().

Если значение свойства allowToContinue устанавливается как = true (.T.), то обрабатывается следующий фильтр обработчика событий Отчета.

Если значение свойства allowToContinue устанавливается как = false (.F.), то дальше обработка не выполняется - приложение ReportBuilder.App устанавливает бит 0 в значении параметра ReturnFlags для указания Построителю, что данное событие успешно обработано.

Важно:

  • Значение, заданное в поле FLTR_ORDR определяет важность обработки рассматриваемого Фильтра (так как по нему выполняется сортировка); с помощью данного поля выполняется порядок обработки событий в классе Обработчика.

  • Каждый Обработчик Фильтров получает возможность устанавливать флаги в возвращаемые значения, но эти значения будут обрабатываться только в том случае, когда устанавливается allowToContinue = false (.F.), поэтому обработка событий продолжается; однако каждый из обработчиков (Event Handler) может обработать рассматриваемые флаги или изменить последовательность обработки событий.

2. Соответствующий класс Обработчика Событий Создан.

Далее Построитель Отчета выполняет поиск соответствующего класса Обработчика Событий, который должен обработать это событие.

В Регистрационной Таблице допускаются шаблонные символы ("wild card"), так чтобы не каждая уникальная комбинация События Построителя + Объект Отчета размещались в одной записи таблицы. Построитель выполняет выборки требуемых записей только среди неудаленных записей (не помеченных для удаления).

Построитель последовательно выполняет поиск требуемых записей по заданному шаблону (маске) и пока выполняются следующие условия:

Последовательность REC_TYPE EVENTTYPE OBJTYPE OBJCODE

1

"H"

(Exact)

(Exact)

(Exact)

2

"H"

(Exact)

(Exact)

-1

3

"H"

(Exact)

-1

-1

4

"H"

-1

-1

-1

Если никакой требуемой записи не найдено, то обработчик событий игнорирует текущее рассматриваемое событие (оба бита параметра ReturnFlags будут очищены) и управление возвращается в Дизайнер, как в стандартном построителе Visual FoxPro.

Если соответствие найдено, то требуемый класс создается и требуемый метод выполняется как Execute().

3. Все процедуры Завершения Обработчика выполнены.

Как только соответствующий обработчик событий (завершения) выполнен, построитель отчетов устанавливает всем выбранным записям значение поля REC_TYPE="X", сортирует эти записи по полю FLTR_ORDR, и обрабатывает каждый Класс с помощью соответствующего метода  Execute().

Относительно объектов Множественного Выбора:

По-умолчанию, регистрационная Таблица обработчика событий содержит регистрационную запись типа MultiSelectHandler, для которой установлено свойство  OBJTYPE = 99. Дополнительную информацию и пример об обработчике множественного выбора смотрите в разделе: Multiple Selection, диалоговый бокс (Построитель Отчетов).

Построитель Отчетов определяет момент выделения нескольких объектов (контролов) среди общего множества объектов Отчета и обрабатывает выделенное подмножество с уникальным идентификатором OBJTYPE:

  CopyCode imageКопировать Код
COUNT FOR curpos AND RECNO() > 1 TO oEvent.SelectedObjectCount
IF oEvent.SelectedObjectCount > 1
oEvent.OBJTYPE = 99
oEvent.OBJCODE = 0
ELSE
oEvent.OBJTYPE = frx.OBJTYPE
oEvent.OBJCODE = frx.OBJCODE
ENDIF

Таким образом, заданный Класс обработчика Событий зарегистрирован как обработчик Множественного Выбора.

Expand imageСм. также