По умолчанию приложение вывода отчета (ReportOutput.app) соответствует стандартным требованиям приложения, описанном в переменной _REPORTOUTPUT.
-
Оно принимает два параметра, первый из которых должен иметь числовое значение.
-
Второй параметр - ссылка на объект, например, производный от класса ReportListener.
-
Класс, для которого он поставляет экземпляр, определяется значением в первом параметре.
-
В случае удачи при получении ссылки на объект соответствующего класса, оно назначает величину первого параметра свойству OutputType объекта.
![]() |
---|
Для полной информации о требованиях для Приложения вывода отчета см. _REPORTOUTPUT системная переменная. |
Этот раздел охватывает детали выполнения этих требований приложением вывода отчета. От также описывает некоторые дополнительные возможности, поставляемые по умолчанию данным приложением.
ReportOutput.app ReportListener Коллекция ссылок
Вы можете явно присвоить переменной ссылку на объект ReportListener, если Вы вызовите приложение вывода отчета используя следующий синтаксис:
![]() | |
---|---|
LOCAL loRef
do (_REPORTOUTPUT) with <N>, loRef
IF ISNULL(loRef)
*Приложение вывода отчета не распознало значение <N>
ELSE
? loref.outputtype
? loref.class
ENDIF |
Однако, во многих случаях ReportOutput.app обеспечивает ссылку на объект ReportListener без Вашего явного назначения переменной для ссылки. Это ситуация появляется если Вы установили значение SET REPORTBEHAVIOR в 90, или Вы используете выражение OBJECT TYPE <N> в Вашей команде REPORT FORM или LABEL.
ReportOutput.app поддерживает глобальную переменную, _oReportOutput, производную от базового класса "Collection" . Она хранит ссылку на объект производный от ReportListener, для которого она обеспечивает ссылку в этом наборе. Коллекция ссылок на объекты ReportListiner имеет глобальную область видимости, поэтому Вы можете с успехом использовать ее повторно для множества отчетов, не обращая внимания на то, как или где Вы пытаетесь получить ссылку.
Обеспечивая область действия ReportListener, используя коллекцию ссылок для ReportOutput.app или подобную стратегию необходимо для того, чтобы поддержать связь множества отчетов с одним выходным результатом.
Вы можете извлечь ссылку на объект из набора используя строковое значение соответствующего OutputType, как ключ коллекции:
![]() | |
---|---|
#DEFINE PRINT_MODE 0 REPORT FORM ? OBJECT TYPE PRINT_MODE LOCAL loRef loRef = _oReportOutput[TRANSFORM(PRINT_MODE)] ? loRef.OutputType && Будет 0 ? loRef.PageTotal && будет общим количеством страниц && с последнего запуска печати |
Для большей информации см. Как: Использовать коллекцию ссылок приложения вывода отчета.
![]() |
---|
ReportOutput.app резервирует права на использование дополнительного значения ключа в этой коллекции для других пользователей за исключением ссылок на объект ReportListener. Например, если Вы определите пользовательскую таблицу регистрации вывода отчета, то имя этой таблицы сохранится в коллекции ссылок. Для большей информации см. Как: Описать альтернативную таблицу регистрации вывода отчета. |
ReportOutput.app Расширенные параметры
ReportOutput.app расширяет использование двух, требуемых _REPORTOUTPUT параметра, обеспечивая режим работы по умолчанию, если второй параметр не включен, и добавляет необязательный третий параметр. Далее представлен соответствующий синтаксис для ReportOutput.app
![]() | |
---|---|
DO ReportOutput.app WITH ; nListenerType [,eListenerReference [,eUnload]] |
Этот раздел описывает обработку каждого параметра ReportOutput.app.
Первый параметр: nListenerType
Когда обрабатывается параметр nListenerType, ReportOutput.App принимает все номера больше чем или равные -1 для
обеспечения объекта ReportListener ссылкой правильного типа. -1 это значение по умолчанию свойства ListenerType объекта ReportListener.
![]() |
---|
Если nListenerType числовая, но не целочисленная переменная, ReportOutput.app принимает значение, но использует целую часть принимаемого значения как требуемый тип. |
Если nListenerType равен -1
, он обеспечивае ссылку к экземпляру объекта базового класса ReportListener. Если он больше чем -1
, ReportOutput.app начинает процесс обработки для определения какой класс, порожденный от ReportListener будет обеспечивать ссылку, как следует ниже:
- ReportOutput.app в первую очередь проверяет имеет ли он кэшированную ссылку к объекту, заранее созданную для этой переменной. Если она находится, то повторно используется эта ссылка.
- Если кэшированная ссылки не доступна, ReportOutput.app проверяет свою таблицу регистрации для любой команды пользователя, связанной с этим значением. Таблица регистрации описывается в последнем разделе этой темы.
- Если нет доступных команд пользователя, используются встроенные команды по умолчанию, перечисленные в следующей таблице.
nListenerType значение | Класс, обеспечивающий ссылку по умолчанию к ReportListener |
---|---|
0 |
ReportListener User Feedback Foundation Class |
1 |
ReportListener User Feedback Foundation Class |
2 |
ReportListener Baseclass |
3 |
ReportListener Baseclass |
4 |
ReportListener XML Foundation Class |
5 |
ReportListener HTML Foundation Class |
999 |
ReportListener Debug Foundation Class |
![]() |
---|
Имейте ввиду, что взятый в отдельности ReportListener класс может управлять множеством значений nListenerType. ReportOutput.app назначает величину nListenerType , которая изменяет свойство OutputType объекта. Значение этого свойства является частью описанных требований для любого Приложения Вывода Отчета. Если объект является экземпляром класса, порожденного от ReportListener, ReportOutput.app проверяет объект и решает нужно ли переназначить свое собственное свойство ListenerType, базирующееся на OutputType, или оставить его нетронутым. Если объект является экземпляром базового класса ReportListener, ReportOutput.app присваивает значение nListenerType свойству ListenerType объекта. Для большей информации см. Свойство OutputType(Visual FoxPro) и Свойство ListenerType . |
ReportOutput.app резервирует все значения nListenerType меньше, чем -1
для для расширения своей функциональности. Два таких значения -100 и -200 описаны ниже.
Второй параметр: eListenerReference
ReportOutput.app обрабатывает свой второй параметр eListenerReference, как необязательный. Если он не получен, ReportOutput.app просто сохраняет ссылку на экземпляр соответствующего класса ReportListener в свою коллекцию ссылок. Такое режим работы дает вам возможность установить различные ссылки на ReportListener до того, когда они потребуются для распечатки отчета.
Если ReportOutput.app получает свой параметр eListenerReference, он принимает либо объявленную переменную, как показано в примере в предыдущем разделе, либо символьную строку, представляющую переменную. Если Вы принимаете символьную строку в качестве переменной, или если переменная, представленная символьной строкой не существует, ReportOutput.app инициализирует переменную, как ГЛОБАЛЬНУЮ.
Вы можете также использовать символьную строку в качестве параметра eListenerReference, если Вы хотите назначить ReportListener в качестве члена объекта. Например:
![]() | |
---|---|
#DEFINE PREVIEW_MODE 1 Ox = CREATEOBJECT("custom") Ox.addProperty("myReportListener") DO (_REPORTOUTPUT) WITH PREVIEW_MODE, "ox.myReportListener" REPORT FORM ? OBJECT ox.MyReportListener ? ox.myReportListener.Name |
Если член объекта не существует но ReportOutput.app может подтвердить, что сам объект существует, то этот член создается. Для этой цели используется контейнерная иерархия объекта. Например:
![]() | |
---|---|
#DEFINE PREVIEW_MODE 1 Ox = CREATEOBJECT("form") Ox.addobject("myChildObject","custom") DO (_REPORTOUTPUT) WITH PREVIEW_MODE, "ox.myChildObject.RL" REPORT FORM ? OBJECT ox.myChildObject.RL ? ox.myChildObject.RL.PageTotal |
Третий параметр: eUnload
Вы можете освободить ссылку ReportListener из коллекции ссылок ReportOutput.app явно, см. далее:
![]() | |
---|---|
#DEFINE PRINT_MODE 0 _oReportOutput.Remove[TRANSFORM(PRINT_MODE)) |
Однако, ReportOutput.app предусматривает третий параметр, поэтому Вы можете запросить приложение управлять этой ссылкой для Вас, прямо без адресации к коллекции напрямую. Параметр позволит Вам явно освободить ссылку или освободить и немедленно получить новый экземпляр, как показано в следующем примере.
![]() | |
---|---|
#DEFINE PRINT_MODE 0 #DEFINE OUTPUTAPP_LOADTYPE_RELOAD 2 DO (_reportoutput) WITH ; PRINT_MODE , ox, OUTPUTAPP_LOADTYPE_RELOAD |
Далее рассматриваются значения параметра eUnload.
eUnload значение параметра e | Использование |
---|---|
Не передается, логический ( |
Игнорируется. ReportOutput.app обеспечивает стандартный режим работы: загружает ReportListener или выполняет другое действие определенное значением свойства nListenerType . |
Логический ( |
ReportOutput.app не предусматривает ссылку на объект ReportListener. Проверяет использование объектом ReportListener ключа, установленного nListenerType, и удаляет этот ReportListener из своей коллекции, если он найден. |
Все числовые значения больше |
ReportOutput.app удаляет ссылку на объект ReportListener из своей коллекции, если найдет, и затем перезагружает подходящую ссылку. Сохраняет эту ссылку в переменной, отображаемой в параметре eListenerReference . |
Таблица регистрации ReportOutput.app ReportListener
ReportOutput.app обеспечивает значение по умолчанию ссылки на объект ReportListener, в соответствии с таблицей, содержащей значения nListenerType и названий классов из предыдущего раздела. Вы можете использовать таблицу регистрации для перезаписи этих установок.
ReportOutput.app использует ту же конфигурацию или структуру таблицы регистрации, как ReportListener Foundation классы используют для сохранения своей конфигурационной информации. Последующий код показывает Вам базовую структуру этой таблицы. Вы можете добавлять поля в эту таблицу любого типа, а порядок полей не важен ни в компонентах Report Output Application, ни Foundation классах.
![]() | |
---|---|
CREATE TABLE (CONFIG_TABLE_NAME) ; (objtype i, ; objcode i, ; objname v(60), ; objvalue v(60), ; objinfo m) |
И ReportOutput.app и ReportListener Foundation классы обеспечивают возможность создания таблицы для Вас. Для большей информации по созданию таблицы и назначению ее, как Вашей таблицы регистрации приложения вывода отчета (Report Output Application) , см. Как: Описать альтернативную таблицу регистрации приложения вывода отчета.
![]() |
---|
ReportOutput.app и ReportListener Foundation классы используют эту структуру таблицы по разному и требуют различных индексов. Однако, не имеет значения какой компонент создает таблицу или Вы создаете ее, как пустую таблицу, как показано в примере кода выше. Каждый компонент будет создавать любые записи и индексы, которые ему нужны при обращении к этой таблице. |
ReportOutput.app резервирует область 100-999
для значений поля OBJTYPE в таблице конфигурации. Он использует значение поля OBJTYPE 100
для представления регистрационных записей класса ReportListener. Следующая таблица показывает использование записей в таблице для целей регистрации ReportListener.
Поле | Применение | Примечания |
---|---|---|
OBJTYPE |
100 |
Значение 100 в этом поле соответствует записи регистрации ReportListener . |
OBJCODE |
nListenerType |
Значение этого поля связано с первым параметром ReportOutput.app. |
OBJNAME |
Класс |
Это имя класса может быть ReportListener (базовый класс). |
OBJVALUE |
Библиотека классов (.vcx) или процедурный файл (.prg), содержащий описания классов. |
Может быть пустым, если имя класса ReportListener. |
OBJINFO |
Модуль/Приложение, содержащее библиотеку. |
Может быть пустым, если библиотека классов встроено в Ваше приложение. |
ReportOutput.app описывает значение поля Objtyp 110
для сохранения другой конфигурационной информации для своего собственного использования. Он использует записи со значением поля Objtyp 110
и значениями поля Objcode 1
для фильтрации записей регистрации ReportListener, основанной на критериях пользователя. Записи со значением поля Objtyp 110
и любыми другими значениями поля Objcode резервируются для использования для других конфигураций ReportOutput.app, но не текущих.
Следующая таблица показывает использование полей таблицы регистрации для фильтрации записей.
Поле | Применение | Примечания | ||||
---|---|---|---|---|---|---|
OBJTYPE |
110 |
Значение 110 в этом поле соответствует записи конфигурации ReportOutput.app. | ||||
OBJCODE |
1 |
Значение 1 в этом поле для записи с значением в поле Objtype 110, есть запись фильтра. | ||||
OBJNAME |
не используется |
Поле игнорируется | ||||
OBJVALUE |
не используется |
Поле игнорируется | ||||
OBJINFO |
Выражение для фильтра |
Выражение, которое Вы введете в это поле включается в выражение поиска (LOCATE) когда ищется таблица регистрации для требуемого класса с заданным значением nListenerType. Команда LOCATE конструируется следующим образом:
|
For more information, see How to: Register Custom ReportListeners and Custom OutputTypes in the Report Output Registry Table.
Возвращаемые значения от ReportOutput.app
Приложение Вывода Отчета должно быть модальным , потому что требуется возврат значения в обработчик отчетов (Report Engine) , как часть процесса обработки команд REPORT FORM или LABEL. Visual FoxPro получает это возвращенное значение используя параметр eListenerReference, который передается по ссылке; собственный обработчик не распознает возвращенное значение от ReportOutput.app.
Однако, ReportOutput.app не возвращает значение, если Вы вызвали его, как функцию, показывая результат выполнения задачи через параметр nListenerType:
![]() | |
---|---|
? ReportOutput(5, "oRL") * returns .T. DISPLAY MEMO LIKE oRL * Shows that the call above * declares the variable oRL PUBLIC if * it is not already in scope, * because it was passed as a string * stores a reference to the HTMLListener * Foundation class in this variable. ? ReportOutput(25,"oRlx") * returns .F. DISPLAY MEMO LIKE oRLx * Shows that the call above does * not declare the variable oRLx |
ReportOutput.app Настройки компиляции
Исходный код ReportOutput.app доступен в архивированном виде в папке XSource в каталоге Visual FoxPro \Tools. Для большей информации см. Папка XSource .
Вы можете включить исходный код ReportOutput.app в Ваше приложение. Для большей информации см. Включение файлов отчетов в дистрибутив. В этом случае Вы можете редактировать константы, определенные для данного приложения, которые находятся в файле заголовка ReportOutput.h, для правильной настройки Вашего приложения.
Ниже в таблице приведены примеры значений в файле заголовка доступные для настройки.
#DEFINEd константа | Значение по умолчанию | Изменить это значение на: |
---|---|---|
OUTPUTAPP_INTERNALDBF |
"_ReportOutputConfig" |
Имя построенной таблицы регистрации. |
OUTPUTAPP_EXTERNALDBF |
"OutputConfig" |
Имя таблицы регистрации на диске по умолчанию. |
OUTPUTAPP_REFVAR |
_oReportOutput |
Имя глобальной переменной для коллекции ссылок. |
OUTPUTAPP_BASELISTENER_CLASSLIB |
"Listener.VCX" |
Имя библиотеки, содержащей ReportListener класс по умолчанию. |
OUTPUTAPP_CLASS_PRINTLISTENER |
"UpdateListener" |
Имя класса, используемого по умолчанию для обработки значения 0 (печать) параметра eListenerType. |