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

oReportListener.OutputPage(;
nPageNo, ;
eDevice, ;
nDeviceType ;
[,nleft, nTop, nWidth, nHeight ;
[,nClipLeft,nClipTop, nClipWidth, nClipHeight]])

Параметры

nPageNo

В постраничном режиме (свойство ListenerType установлено в 0 или 2), ReportListener использует этот параметр, чтобы послать Вам номер очередной страницы, подготавливаемой для вывода. Вы можете направить вывод очередной страницы на другое устройство. В режиме "все страницы сразу" (свойство ListenerType установлено в 1 или 3), Вы используете этот параметр, чтобы послать ReportListener число страницы, которое Вы желаете обработать (rendered). Подробнее о значениях свойства ListenerType, см. ListenerType Свойство.
eDevice

Указывает дескриптор, ссылку, или имя файла , куда вы хотите направить вывод. Когда  значение свойства ListenerType - 0, ReportListener использует этот параметр, чтобы послать GDI+ графический дескриптор на текущий принтер. Когда свойство ListenerType - 2, вывод фактически не идет в принтер, так что ReportListener посылает Вам значение 0. В режиме "все страницы сразу" (ListenerType 1 или 3), Вы используете этот параметр, чтобы указать ReportListener один из вариантов:
  • Дескриптор GDI на принтер.

  • GDI+ Графический  дескриптор на другое устройство вывода.

  • Ссылка на объект, произошедшая из элемента управления Shape или из Контейнера baseclass.

  • Имя файла.

Вы сообщаете ReportListener, какое значение eDevice Вы посылаете в этом параметре, посылая соответствующее значение в nDeviceType.
nDeviceType

Представляет тип устройства, для которого будет обработан (rendered) вывод.

Значение Тип устройства

-1

Нет устройства.

ReportListener посылает это значение, когда он инициирует OutputPage при ListenerType=2.

0

hDC (GDI дескриптор).

Вы можете послать дескриптор GDI в ReportListener для  вывода на другой принтер.

1

hGraphics (GDI+ графический дескриптор).

ReportListener посылает это значение, когда он инициирует OutputPage при ListenerType = 0. Вы можете послать его в ReportListener, чтобы направить вывод на другой GDI+ контекст, например, окно.

2

oFoxControl.

Используйте это значение, чтобы  ReportListener отобразил предварительный просмотр, используя элемент управления Shape или элемент управления контейнер.

100

Это значение определяет имя EMF-файла для сохранения образа.

101

Это значение определяет имя TIFF-файла для сохранения образа.

102

Это значение определяет имя JPEG-файла для  сохранения образа.

103

Это значение определяет имя GIF-файла для  сохранения образа.

104

Это значение определяет имя PNG-файла для  сохранения образа.

105

Это значение определяет имя BMP-файла для  сохранения образа.

201

Это значение добавляет страницу в предварительно-созданный TIFF, создавая многостраничный файл TIFF.

Совет:
ReportListener способен выполнить некоторую дополнительную оптимизацию этого формата файла, когда Вы используете это значение прежде, чем отчет закончен. Для ReportListener с ListenerType 0 или 2, OutputPage событие случается в это время. Это проиллюстрировано в примере, приведенном ниже. Для ReportListener с ListenerType 1 или 3, Вы можете вызвать OutputPage при обработке события AfterReport чтобы использовать оптимизацию.

[nleft, nTop, nWidth, nHeight,[nClipLeft,nClipTop, nClipWidth, nClipHeight]]

Эти дополнительные параметры не применимы, когда nDeviceType - 2 (a Visual FoxPro control surface). Первый набор четырех координат (nleft, nTop, nWidth, nHeight) определяет координаты в еденицах 1/960 дюйма (960 точек на дюйм), прямоугольника на текущем устройстве, в котором будет размещён выводимый элемент. Второй набор четырех координат (nClipLeft, nClipTop, nClipWidth, nClipHeight) позволяет при выводе на предварительный просмотр указать, что только часть страницы должна быть обновлена.

Возвращаемое значение

Нет.

Замечания

Применимо к: ReportListener Object.

OutputPage метод необычен тем что, в зависимости от значения ListenerType , ReportListener или вызывает этот метод, чтобы сообщить Вам, что страница готова или ожидает, что Вы сами его вызовите,  запросив страницы, которые Вы хотите.

Понимание двух режимов обработки OutputPage

В первом режиме обработки, ReportListener действует в стиле, применимом для принтеров и других устройства вывода, которые обрабатывают одну страницу одновременно. В случае необходимости, эти устройства размещают страницы в спулер или очередь, пока они не готовы. Этот тип обработки страницы только вперед; Вы не можете запросить страницу, после того, как ReportListener начал обрабатывать следующие после неё страницы.

Во втором режиме, ReportListener готовит все страницы сразу, фактически создавая очередь всех страниц, пока устройство не готово принять их. Вы не можете запрашивать отдельные страниц, пока все страницы не подготовлены. Однако, этот тип обработки размещает страницы в кэш, допускающий прокрутку, что необходимо при предварительном просмотре; как только страницы готовы, Вы можете запросить их в любом порядке, и можете использовать их  длительное время.

Обработка ошибок параметров OutputPage

У OutputPage много параметров, и некоторые параметры имеют неоднозначное толкование. По этой причине интерпретация ошибок может быть затруднена, если Вы задаёте параметры неправильно.

Далее перечислены сообщения об ошибках, которые генерирует ReportListener при передаче некорректных параметров в OutputPage.

Сообщение об ошибке и номер Условия, вызывающие эту ошибку

Must specify additional parameters (Error 94). Должены быть определены дополнительные параметры

Возникает, если Вы не включаете все три обязательных параметра (nPageNo, eDevice, nDeviceType).

Function argument value, type, or count is invalid (Error 11). Некорректное значение или тип аргумента.

Возникает, если не распознано значение nDeviceType.

DataType property for field 'eDevice' is invalid (Error 1544). Некорректное свойство DataType для поля 'eDevice'.

Возникает, если тип данных аргумента eDevice не соответствует требованиям, определяемым nDeviceType

Например, это может случится если nDeviceType - 0 или 1, а eDevice - недопустимый дескриптор, или если nDeviceType - один из типов имени файла, но eDevice - не строка, представляющая  имя файла.

Error writing to file 'filename' (Error 1105) Ошибка, записи в файл.

Возникает, если nDeviceType - один из типов имени файла и eDevice корректен, но файл не может быть создан. Например, пользователь не имеет разрешения создавать файл в указанном каталоге.

Output page 'pageno' is not available (Error 2194). Страница вывода не доступна.

Возникает, если nPageNo не соответствует текущей обрабатываемой странице, или если значение ListenerType не установлено в одно из значений (0, 1, 2, или 3), когда ReportListener обрабатывает страницы.

Для получения дополнительной информации об ошибках Visual FoxPro см. Сообщения об ошибках по номерам. Для получения дополнительной информации об ошибки выполнения отчета см. Ошибки при выполнении отчета.

Предостережение:
В дополнение к вышеперечисленным сообщениям об ошибках, возникающих при вызове OutputPage с неправильными параметрами, надо знать что, OutputPage нуждается в ресурсах, доступных отчёту, даже когда Вы вызываете его после того, как выполненное отчёта заканчивается. Например, если графический файл, используемый в отчёте, встроен в ваше приложение, вызов OutputPage из PreviewContainer нуждается в доступе к этому графическому файлу. Хотя сообщение об ошибкае не возникает, ваш отчёт не будет завершен, если Вы разгружаете приложение, из которого вызвана REPORT FORM или LABEL.

Примеры

Пример 1: OutputPage в постраничном режиме, вывод в графичекий файл

Этот код создает многостраничный-TIFF файл при выполнении отчета. Сначала OutputPage вызывается с параметром nDeviceType=101 и создаётся TIFF-файл. При последующих вызовах nDeviceType=102, и создаваемые страницы добавляются к многостраничному TIFF-документу.ReportListener создаётся на основе класса, в котором ListenerType=2, и код, определенный в классе вызывает OutputPage для подготовки каждой страницы.

Совет:
Встроенная способность класса  ReportListener выводить изображения страниц в виде различных типов файлов ограничена некоторыми настройками по умолчанию для каждого типа файла. В случае TIFF, ReportListener формирует сжатые TIFF. Однако, Вы не ограничены встроенными настройками. Вы можете передать в ReportListener GDI+ графический дескриптор и, в OutputPage методе обработать страницу для этого устройства. Вы можете тогда сохранить результат в виде графического файла с другими настройками. Visual FoxPro снабжен библиотекой классов, помогающей Вам выполнять GDI+ ориентированные задачи. Для получения дополнительной информации, см. фундаментальные классы GDI Plus API адаптер.

Код

  Копировать код
#define OutputNothing -1
#define OutputTIFF 101
#define OutputTIFFAdditive (OutputTIFF+100)

LOCAL oReportListener
oReportListener = NEWOBJECT("MPTiffListener")
oReportListener.Filename = "Multi"

WAIT WINDOW "Processing report to TIFF file...." NOWAIT
REPORT FORM ? OBJECT oReportListener
WAIT CLEAR

DEFINE CLASS MPTiffListener AS ReportListener

PROCEDURE Init
this.AddProperty("Filename", "temp")
this.ListenerType = 2
ENDPROC

PROCEDURE BeforeReport
ERASE this.Filename
ENDPROC

PROCEDURE OutputPage(nPageNo, eDevice, nDeviceType)
IF (nDeviceType == OutputNothing)
IF (nPageNo == 1)
nDeviceType = OutputTIFF
ELSE
nDeviceType = OutputTIFFAdditive
ENDIF
THIS.OutputPage(nPageNo, this.Filename, nDeviceType)
NODEFAULT
ENDIF
ENDPROC

ENDDEFINE

Пример 2: испоьзование OutputPage для постраничного отображения на экран

Этот пример демонстрирует отображение вывода на дисплей для обратной совместимости, когда ключевое слово NOCONSOLE не используется в команде REPORT FORM. Используется способность OutputPage метода записывать в GDI+ графический дескриптор. Если в REPORT FORM определена NOCONSOLE, объект ReportListener не отображает вывод на дисплей.

По умолчанию ReportListener использует значение ListenerType 2, поэтому OutputPage готовит каждую страницу вывода, но не имеет собственного вывода результата. Проверяется есть ли ключево слово NOCONSOLE анализируя свойство CommandClauses, и определяется куда будет направлен вывод. Если пользователь направляет вывод на принтер, в файл, или предварительный просмотр, этот класс корректирует его поведение в соответствовии с предыдущим версиям Visual FoxPro.

Код

  Копировать код
#DEFINE OUTPUTDEVICETYPE_GDIPLUS 1
#DEFINE OUTPUTTO_PRINT 1
#DEFINE OUTPUTTO_FILE 2
#DEFINE LISTENER_TYPE_PRN 0
#DEFINE LISTENER_TYPE_PRV 1
#DEFINE LISTENER_TYPE_PAGED 2
LOCAL loRL, loForm
loRL = CREATEOBJECT("EchoListener")
REPORT FORM ? OBJECT loRL && Вывод на консоль
REPORT FORM ? OBJECT loRL NEXT 1 TO PRINT && вывод, на консоль и печатать
_SCREEN.Cls && Очистка экрана
REPORT FORM ? OBJECT loRL PREVIEW && предварительный просмотр, нет вывода на консоль
loForm = CREATEOBJECT("form")
loForm.Caption = "My Output Window"
loForm.Show()
REPORT FORM ? OBJECT loRL TO FILE c:\temp\x.txt && в файл и окно
REPORT FORM ? OBJECT loRL TO FILE c:\temp\x.txt NOCONSOLE && долько в файл

DEFINE CLASS EchoListener as ReportListener
ListenerType = LISTENER_TYPE_PAGED

GP = 0
RHeight = 0
RWidth = 0

PROCEDURE LoadReport()
IF THIS.CommandClauses.Preview
THIS.ListenerType = LISTENER_TYPE_PRV
ELSE
IF INLIST(THIS.CommandClauses.OutputTo,OUTPUTTO_PRINT,OUTPUTTO_FILE)
THIS.ListenerType = LISTENER_TYPE_PRN
ENDIF
ENDIF
ENDPROC

PROCEDURE BeforeReport()
IF NOT (THIS.CommandClauses.NoConsole OR THIS.CommandClauses.Preview)
DECLARE integer GdipCreateFromHWND IN GDIPLUS.DLL ;
integer hwnd, integer @ nGraphics
LOCAL lH, nG
nG = 0
IF TYPE("_SCREEN.ActiveForm") = "O"
m.lH = _SCREEN.ActiveForm.HWnd
ELSE
m.lH = _SCREEN.HWnd
ENDIF
IF GdipCreateFromHWND( m.lH, @nG ) = 0
THIS.GP = m.nG
THIS.RHeight = THIS.GetPageHeight()/10 && преобразование 960 точек на дюйм в 96 точек на дюйм
THIS.RWidth = THIS.GetPageWidth()/10
ENDIF
ENDIF
ENDPROC

PROCEDURE OutputPage(nPageNo, ;
eDevice, ;
nDeviceType, ;
nleft, nTop, nWidth, nHeight, ;
nClipLeft,nClipTop, nClipWidth, nClipHeight)
IF THIS.GP # 0
DODEFAULT(nPageNo, THIS.GP,OUTPUTDEVICETYPE_GDIPLUS , ;
0,0,THIS.RWidth, THIS.RHeight, ;
0,0,THIS.RWidth, THIS.RHeight)
ENDIF

ENDPROC

PROCEDURE UnloadReport()
* reset:
IF NOT THIS.GP = 0
DECLARE integer GdipDeleteGraphics IN GDIPLUS.DLL integer
GdipDeleteGraphics( THIS.GP )
THIS.GP = 0
ENDIF
THIS.ListenerType = LISTENER_TYPE_PAGED
ENDPROC

ENDDEFINE

Example 3: OutputPage in all-pages-at-once mode

Этот пример использует значение ListenerType 3, так что собственно ReportListene класс не вызывает OutputPage для подготовки страниц. Вместо этого этот класс вызывает OutputPage после того, как выполнение отчета заканчивается, и отображает вывод в объекте preview, включённому в форму. Как видно из примера, изменяя измерения объекта preview, Вы можете изменить масштаб изображения, используя любой алгоритм или ограничения, которые Вы предпочитаете. Передавая ссылку на этот объект в метод OutputPage , Вы сообщаете внутреннему коду метода, какой размер Вы хотите установить для предварительного просмотра страницы. Собственно OutputPage обеспечивает масштабирование вывода на предварительный просмотр.

Совет:
Обратите внимание, что внутренний код DoOutputPage этого класса для метода OutputPage выясняет, что передан номер существующей страницы перед вызовом внутреннего кода OutputPage, во избежании ошибок.

Код

  Копировать код
#DEFINE BASEPAGEHEIGHT  550
#DEFINE BASEPAGEWIDTH 425

CLEAR ALL
oListener = NEWOBJECT("zoomListener")
oForm = CREATEOBJECT("form")

WITH oForm
.ScaleMode = 3
.allowOutput = .F.
.top = 0
.left = 0
.height = BASEPAGEHEIGHT
.width = BASEPAGEWIDTH
.backcolor = RGB(255,255,255)
.Show()
ENDWITH

oListener.PreviewContainer = oForm
REPORT FORM ? OBJECT oListener
oListener.DoOutputPage(1,1)
WAIT window ;
"Масштаб 100%... " + ;
"Нажмите клавишу для изменения масштаба"
oListener.DoOutputPage(2, .21123 )
WAIT window ;
"Масштаб 21.123%... " + ;
"Нажмите клавишу для изменения масштаба"
oListener.DoOutputPage(3,2.367)
WAIT window ;
"Масштаб at 236.7%... "

DEFINE CLASS zoomListener AS ReportListener
ListenerType = 3

PROCEDURE DoOutputPage(tPage, tMultiplier)
LOCAL liPage
IF VARTYPE(tPage) = "N" AND ;
BETWEEN(tPage,;
THIS.CommandClauses.RangeFrom, ;
IIF(THIS.CommandClauses.RangeTo=-1, ;
THIS.PageTotal, ;
THIS.CommandClauses.RangeTo))
liPage = INT(tPage)
ELSE
liPage = THIS.CommandClauses.RangeFrom
ENDIF
THIS.SetPreview(tMultiplier)
THIS.OutputPage(liPage,ThIS.PreviewContainer.MyPreview,2)
ENDPROC

PROCEDURE SetPreview(tMultiplier)
LOCAL liHeight, liWidth
IF TYPE("THIS.PreviewContainer.MyPreview") # "O"
THIS.PreviewContainer.AddObject("MyPreview","shape")
ENDIF
IF VARTYPE(tMultiplier) = "N" AND ;
BETWEEN(tMultiplier,.01, 10)
liHeight = BASEPAGEHEIGHT * tMultiplier
liWidth = BASEPAGEWIDTH * tMultiplier
WAIT WINDOW ;
"H:" + TRANSFORM(liHeight)+ ;
", W:" + TRANSFORM(liWidth) TIMEOUT 1
* note that VFP will round the pixels
WITH THIS.PreviewContainer
.LockScreen = .T.
.MyPreview.Height = liHeight
.MyPreview.Width = liWidth
.Height = liHeight
.Width = liWidth
.LockScreen = .F.
.Cls()
ENDWITH
ENDIF
ENDPROC

PROCEDURE Destroy
THIS.PreviewContainer = NULL
ENDPROC

ENDDEFINE

См. также