:: Visual Foxpro, Foxpro for DOS
ReportListener
Перминов Игорь
Автор

Сообщений: 1591
Откуда: Красная Орловка
Дата регистрации: 16.09.2001
Ребята приведите здесь пример, как работать с ReportListener.
Понял, что это зашибатая штука, но как все это дало заставить работать, непонимаю. Только не пишите читай то-то. Читаю, но все равно не понимаю! (Наверно тупой такой).




------------------
Без коментариев..
Ratings: 0 negative/0 positive
Re: ReportListener
amaximum

Сообщений: 131
Откуда: Новороссийск, Красндарский край
Дата регистрации: 26.04.2001
Раскорй исходники ReportOutput и ReportPreview. Лично я сделал уже вывод в HTML с использованием CSS и предварительный промотр. Будет время - выложу в решения... Хотелось бы знать, реализовал кто нибудь экспорт в другие форматы?
Ratings: 0 negative/0 positive
Понемногу начинаю разбираться
Перминов Игорь
Автор

Сообщений: 1591
Откуда: Красная Орловка
Дата регистрации: 16.09.2001




[i][small][color=Gray]Отредактировано (23.06.04 11:52)


------------------
Без коментариев..
Ratings: 0 negative/0 positive
Re: ReportListener
Sega

Сообщений: 511
Откуда: Ярославль
Дата регистрации: 27.12.2000
Обязательно выкладывай в решения. Мне этот механизм тоже не понятен, а вкусностей в нем много.
Ratings: 0 negative/0 positive
Re: ReportListener
Перминов Игорь
Автор

Сообщений: 1591
Откуда: Красная Орловка
Дата регистрации: 16.09.2001
Для ReportPreview (туповатый код взятый из примера, скорее всего можно сделать и что-то свое):
LOCAL oListener as ReportListener, oPC as Object
SET REPORTBEHAVIOR 90
_REPORTPREVIEW=[ReportPreview.app]
IF !FILE(_REPORTPREVIEW)
MESSAGEBOX("File not found REPORTPREVIEW.APP")
_REPORTPREVIEW=LOCFILE([ReportPreview.app])
IF EMPTY(_REPORTPREVIEW) OR ISNULL(_REPORTPREVIEW)
RETURN
ENDIF
ENDIF
oPC = null
DO (_REPORTPREVIEW) with m.oPC
* set initial properties:
*oPC.currentPage = 1 && start on page 4
*oPC.canvasCount = 1 && 2 pages side-by-side
*oPC.zoomlevel = 4 && 75%
oPC.Caption = "Òåõíîëîãè÷åñêèå ïîêàçàòåëè Òà ¹ 5"
oPC.Top=1
oPC.Left=1
oPC.Width=oGlobalForm.width-30
oPC.Height=oGlobalForm.height-50
oPC.toolbarIsVisible = .F. && no toolbar, initially
oListener = CREATEOBJECT('ReportListener')
*oListener.OutputType=0
oListener.CurrentDataSession=1
oListener.ListenerType=1 && preview
oListener.PreviewContainer = m.oPC
REPORT FORM rpt_parameters_tg ALL OBJECT oListener NOWAIT
oPC.setCurrentPage( 1 )
oPC.setCanvasCount( 1 )
oPC.setZoomLevel( 5 )




------------------
Без коментариев..
Ratings: 0 negative/0 positive
Re: ReportListener
piva

Сообщений: 18655
Откуда: Курган
Дата регистрации: 24.03.2004
А мне все больше ReportListener нравится - перегоны куда угодно можно делать.
Правда не совсем понятно как расталкивать данные по передаваемым координатам
ну это со временем решится. А так можно на ходу менять размеры, стили, имена шрифтов
чего собственно мне от отчетов и надо было. А перегон в HTML становится простым.
(если б я только прилично знал синтаксис разметки самого HTML )
Ratings: 0 negative/0 positive
Re: ReportListener
Перминов Игорь
Автор

Сообщений: 1591
Откуда: Красная Орловка
Дата регистрации: 16.09.2001
Блин! Приведи здесь пример, ну очень интересно!




------------------
Без коментариев..
Ratings: 0 negative/0 positive
Re: ReportListener
piva

Сообщений: 18655
Откуда: Курган
Дата регистрации: 24.03.2004
ox=CreateObject([hooktext])
ox.ListenerType = 1 && we want to see the results in a Preview
REPORT FORM XXX OBJECT OX

Define Class HookText As ReportListener
Procedure EvaluateContents(nFRXRecno, oObjProperties) As Boolean
If Mod(Recno(),2)=0
oObjProperties.FontSize=12
Else
oObjProperties.FontSize=10
Endif
oObjProperties.RELOAD = .T.
this.AdjustObjectSize(nFRXRecno, oObjProperties)
Endproc
Enddefine
Ratings: 0 negative/0 positive
Re: ReportListener
piva

Сообщений: 18655
Откуда: Курган
Дата регистрации: 24.03.2004
Во блин ! Еще Круче - можно отчеты сбрасывать сразу в картинки !

Поддерживаемые форматы

Цитата:
Value Type
0 hDC (printer)
1 hGraphics (GDI+ graphics handle)
2 hFoxControl (for preview display, shape or container control)
100 cFilename, to be saved as image of EMF type
101 cFilename, to be saved as image of TIFF type
102 cFilename, to be saved as image of JPEG type
103 cFilename, to be saved as image of GIF type
104 cFilename, to be saved as image of PNG type
105 cFilename, to be saved as image of BMP type
201 cFilename, page to be saved additively into previously created TIFF to create a multi-page TIFF file

Пример сброса в JPEG

ox=CreateObject([hooktext])
ox.ListenerType = 2 && Rendering only
REPORT FORM XXX OBJECT OX PREVIEW
Define Class HookText As ReportListener
Procedure EvaluateContents(nFRXRecno, oObjProperties) As Boolean
If Mod(Recno(),2)=0
oObjProperties.FontSize=12
Else
oObjProperties.FontSize=10
Endif
oObjProperties.RELOAD = .T.
this.AdjustObjectSize(nFRXRecno, oObjProperties)
Endproc
Procedure OutputPage (nPageNo, eDevice,nDeviceType, nleft, nTop, nWidth, nHeight, nClipLeft,nClipTop, nClipWidth, nClipHeight)
eDevice='c:\0\'+Transform(nPageNo,'@L 999')+'.jpeg'
nDeviceType=102
DoDefault(nPageNo, eDevice,nDeviceType)
Enddefine
Ratings: 0 negative/0 positive
Re: ReportListener
piva

Сообщений: 18655
Откуда: Курган
Дата регистрации: 24.03.2004
Во- ! сейчас только чуть не обделелася от счастья !
Если в предыдушем примере заменить метод OutputPage на

Procedure OutputPage (nPageNo, eDevice,nDeviceType, nleft, nTop, nWidth, nHeight, nClipLeft,nClipTop, nClipWidth, nClipHeight)
eDevice='c:\0\xxx.tiff'
nDeviceType=Iif(nPageNo=1,101,201)
DoDefault(nPageNo, eDevice,nDeviceType)

То получаем многостраничный TIFF который мой старый ACDSee показывает только первую станицу а Imaging for Windows - нормально показывает все !
Итого 4 цветных страницы 320 кб.
Ratings: 0 negative/0 positive
Re: ReportListener
Равиль

Сообщений: 6555
Откуда: Уфа
Дата регистрации: 01.08.2003
piva, привет :
Цитата:
Во ! ... !
Вот пробую твои примеры - какие-то затыки, разбираться в лом. Состряпай пожалуйста 100% работающий пример - хочется посопереживать ;)



------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: ReportListener
piva

Сообщений: 18655
Откуда: Курган
Дата регистрации: 24.03.2004
2Равиль
А я с чего показывал пример ? Проверил - забросил
Ну вот и камушек в огород - при отправке в формат EMF - получаю файлы с чистм листом - остальное работает

тут подумалось - может у меня вьювер плохо показывает. CorelDraw сейчас нету.
Кто проверит ?
Ratings: 0 negative/0 positive
Re: ReportListener
Равиль

Сообщений: 6555
Откуда: Уфа
Дата регистрации: 01.08.2003
piva, спасибо, все путем и в EMF:
eDevice='c:\'+Transform(nPageNo,'@L 999')+'.emf'
nDeviceType=100

ps Это очень кстати, а ведь мы хотели этого:
forum.foxclub.ru



[i][small][color=Gray]Отредактировано (23.06.04 15:24)


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: ReportListener
amaximum

Сообщений: 131
Откуда: Новороссийск, Красндарский край
Дата регистрации: 26.04.2001
Не могу пока выложить решение в архиве:-(( не пускают.... Вот код из classbrowser:

**************************************************
*-- Class: html_listener (c:\projects\vfp9_preview\html_listener.vcx)
*-- ParentClass: reportlistener
*-- BaseClass: reportlistener
*-- Time Stamp: 06/18/04 03:09:01 PM
*
#INCLUDE "c:\projects\vfp9_preview\vfp9_preview.h"
*
DEFINE CLASS html_listener AS reportlistener


Height = 23
Width = 23
FRXDataSession = -1
PROTECTED noutfile
noutfile = -1
PROTECTED npagewidth
npagewidth = 0
PROTECTED npageheight
npageheight = 0
PROTECTED nscreendpi
nscreendpi = 0
Name = "html_listener"
PROTECTED ldebug
PROTECTED coutfile


PROTECTED PROCEDURE getbandname
lparameters nBandObjCode
do case
case nBandObjCode = FRX_OBJCOD_TITLE
return 'FRX_OBJCOD_TITLE'
case nBandObjCode = FRX_OBJCOD_PAGEHEADER
return 'FRX_OBJCOD_PAGEHEADER'
case nBandObjCode = FRX_OBJCOD_COLHEADER
return 'FRX_OBJCOD_COLHEADER'
case nBandObjCode = FRX_OBJCOD_GROUPHEADER
return 'FRX_OBJCOD_GROUPHEADER'
case nBandObjCode = FRX_OBJCOD_DETAIL
return 'FRX_OBJCOD_DETAIL'
case nBandObjCode = FRX_OBJCOD_GROUPFOOTER
return 'FRX_OBJCOD_GROUPFOOTER'
case nBandObjCode = FRX_OBJCOD_COLFOOTER
return 'FRX_OBJCOD_COLFOOTER'
case nBandObjCode = FRX_OBJCOD_PAGEFOOTER
return 'FRX_OBJCOD_PAGEFOOTER'
case nBandObjCode = FRX_OBJCOD_SUMMARY
return 'FRX_OBJCOD_SUMMARY'
case nBandObjCode = FRX_OBJCOD_DETAILHEADER
return 'FRX_OBJCOD_DETAILHEADER'
case nBandObjCode = FRX_OBJCOD_DETAILFOOTER
return 'FRX_OBJCOD_DETAILFOOTER'
otherwise
return ''
endcase
ENDPROC


PROTECTED PROCEDURE getfontstyle
lparameters nFontStyle
local cStyle
cStyle = ''
* extended styles
if nFontStyle = FRX_FONTSTYLE_UNDERLINED
cStyle = 'U'
nFontStyle = nFontStyle - FRX_FONTSTYLE_UNDERLINED
endif
if nFontStyle = FRX_FONTSTYLE_STRIKETHROUGH
cStyle = cStyle + 'S'
nFontStyle = nFontStyle - FRX_FONTSTYLE_STRIKETHROUGH
endif
* standart styles
do case
case nFontStyle = FRX_FONTSTYLE_NORMAL
cStyle = cStyle + 'N'
case nFontStyle = FRX_FONTSTYLE_BOLD
cStyle = cStyle + 'B'
case nFontStyle = FRX_FONTSTYLE_ITALIC
cStyle = cStyle + 'I'
case nFontStyle = FRX_FONTSTYLE_BOLD + FRX_FONTSTYLE_ITALIC
cStyle = cStyle + 'BI'
endcase
return cStyle
ENDPROC


PROTECTED PROCEDURE rgbtohex
lparameters nReg, nGreen, nBlue
return [#] + right(transform(max(nReg, 0), [@0]), 2) + ;
right(transform(max(nGreen, 0), [@0]), 2) + right(transform(max(nBlue, 0), [@0]), 2)
ENDPROC


PROTECTED PROCEDURE getcontinuationtype
lparameters nObjectContinuationType
do case
case nObjectContinuationType = LISTENER_CONTINUATION_NONE
return 'LISTENER_CONTINUATION_NONE'
case nObjectContinuationType = LISTENER_CONTINUATION_START
return 'LISTENER_CONTINUATION_START'
case nObjectContinuationType = LISTENER_CONTINUATION_MIDDLE
return 'LISTENER_CONTINUATION_MIDDLE'
case nObjectContinuationType = LISTENER_CONTINUATION_END
return 'LISTENER_CONTINUATION_END'
otherwise
return ''
endcase
ENDPROC


PROCEDURE BeforeReport
This.nPageHeight = This.nScreenDPI * This.GetPageHeight() / 960
This.nPageWidth = This.nScreenDPI * This.GetPageWidth() / 960
This.cOutFile = forceext(This.CommandClauses.File, 'htm')
This.nOutFile = fcreate(This.cOutFile)
local cHtml
cHtml = [<html><head><META http-equiv="Content-Type" content="text/html">] + ;
[<title>] + This.cOutFile + [</title></head><body>]
fputs(This.nOutFile, cHtml)
ENDPROC


PROCEDURE AfterReport
fputs(This.nOutFile, [</body></html>])
fclose(This.nOutFile)
if file(This.cOutFile)
local oLink as HyperLink
oLink = newobject('HyperLink')
oLink.NavigateTo(This.cOutFile)
endif
ENDPROC


PROCEDURE Render
LPARAMETERS nFRXRecno, nLeft, nTop, nWidth, nHeight, nObjectContinuationType, cContentsToBeRendered, GDIPlusImage
local vTemp, cText, cPreSpan, cPostSpan, cFillHex, cForeHex, cPreFont, cPostFont, cFontStyle, ;
cPreStyle, cPostStyle, cHtml

if This.lDebug
vTemp = [<!-- nLeft:] + transform(nLeft) + [, nTop:] + transform(nTop) + [, nWidth:] + ;
transform(nWidth) + [, nHeight:] + transform(nHeight) + [, ContinuationType:] + ;
This.GetContinuationType(nObjectContinuationType) + [, cContents:] + cContentsToBeRendered + [ -->]
fputs(This.nOutFile, vTemp)
endif

cText = strconv(cContentsToBeRendered, STRCONV_UNICODE_UTF8)
if empty(cText)
return
endif
* html special chars
cText = strtran(cText, [&], [&amp]) && first!
cText = strtran(cText, [ ], [&nbsp])
cText = strtran(cText, [<], [&lt])
cText = strtran(cText, [>], [&gt])

* dpi2pix
nLeft = round(This.nScreenDPI * nLeft / 960, 0)
nTop = round(This.nScreenDPI * nTop / 960, 0)
nWidth = round(This.nScreenDPI * nWidth / 960, 0)
nHeight = round(This.nScreenDPI * nHeight / 960, 0)

set datasession to This.FRXDataSession
go nFRXRecno in frx

* css style for span to output
if _pageno > 1
nTop = This.nPageHeight * (_pageno - 1) + nTop
endif
if frx.fillred = -1 and frx.fillgreen = -1 and frx.fillblue = -1
cFillHex = [#FFFFFF] && white
else
cFillHex = This.RgbToHex(frx.fillred, frx.fillgreen, frx.fillblue)
endif
cPreSpan = [<span style="position:absolute;left:] + transform(nLeft) + [px;top:] + transform(nTop) + [px;] + ;
[background-color:] + cFillHex + [">]
cPostSpan = [</span>]

* font attrib
cForeHex = This.RgbToHex(frx.penred, frx.pengreen, frx.penblue)
cPreFont = [<font face="] + frx.FontFace + [" fontsize=] + transform(frx.FontSize) + [ color=] + cForeHex + [>]
cPostFont = [</font>]

* set html font style
cFontStyle = This.GetFontStyle(frx.FontStyle)
store '' to cPreStyle, cPostStyle
if at('B', cFontStyle) > 0
cPreStyle = [<b>]
cPostStyle = [</b>]
endif
if at('I', cFontStyle) > 0
cPreStyle = cPreStyle + [<i>]
cPostStyle = [</i>] + cPostStyle
endif
if at('U', cFontStyle) > 0
cPreStyle = cPreStyle + [<u>]
cPostStyle = [</u>] + cPostStyle
endif
if at('S', cFontStyle) > 0
cPreStyle = cPreStyle + [<s>]
cPostStyle = [</s>] + cPostStyle
endif

* write to file
cHtml = cPreSpan + cPreFont + cPreStyle + cText + cPostStyle + cPostFont + cPostSpan
fputs(This.nOutFile, cHtml)

set datasession to This.CurrentDataSession
ENDPROC


PROCEDURE AfterBand
LPARAMETERS nBandObjCode, nFRXRecno
local cBand
set datasession to This.FRXDataSession
go nFRXRecno in frx
cBand = This.GetBandName(nBandObjCode)
if This.lDebug
fputs(This.nOutFile, '<!-- AfterBand:' + cBand + ' -->')
endif
if atc('pagefooter', cBand) > 0
* fputs(This.nOutFile, '<hr color = black>')
endif
set datasession to This.CurrentDataSession
ENDPROC


PROCEDURE BeforeBand
LPARAMETERS nBandObjCode, nFRXRecno
set datasession to This.FRXDataSession
go nFRXRecno in frx
if This.lDebug
fputs(This.nOutFile, '<!-- BeforeBand:' + This.GetBandName(nBandObjCode) + ' -->')
endif
set datasession to This.CurrentDataSession
ENDPROC


PROCEDURE Destroy
fclose(This.nOutFile)
ENDPROC


PROCEDURE Init
declare integer GetDeviceCaps in WIN32API integer HDC, integer item
declare integer GetDC in WIN32API integer hWnd
local hdc, lnScreenDPI
hdc = GetDC(0)
lnScreenDPI = GetDeviceCaps( m.hdc, LOGPIXELSX )
This.nScreenDPI = lnScreenDPI
This.lDebug = version(2) = 2
ENDPROC


ENDDEFINE
*
*-- EndDefine: html_listener
**************************************************
Ratings: 0 negative/0 positive
Re: ReportListener
Piva_AS_Guest
2Равиль - привет от PIVA
Ты чем смотришь EMF а то у меня ACDSee показывает пустой лист

ЗЫ Это я с другого компика
Ratings: 0 negative/0 positive
Re: ReportListener
Равиль

Сообщений: 6555
Откуда: Уфа
Дата регистрации: 01.08.2003
Привет, файл emf я открывал стандартной смотрелкой проводника XP.




------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: ReportListener
piva

Сообщений: 18655
Откуда: Курган
Дата регистрации: 24.03.2004
Что-то у меня не так - поставил corel8 (ну что было под рукой) - не видит он ничего. Внутри файла EMF все нормально - вижу что там мои данные - а на просмотроеть нечем.
Ну да бог с ним. Если кому-то отсылать отчеты или хранить твердые копии - то вполне за глаза хватает JPG и TIFF (особенно меня убило то что 320кб TIFF файл RAR утрамбовал в 5 кил - я аж глазам не поверил )
К вопросу про HTML экспорт - я даже про absolute position в HTML никода не слышал )
Зато получается чертовски классно
Ratings: 0 negative/0 positive
Re: ReportListener
vfox

Сообщений: 761
Откуда: Moscow
Дата регистрации: 30.11.2005
Скажите пожалуйста, уважаемый PIVA!
А как с помощью метода OutputPage класса ReportListener вывести требуемую страницу отчета на принтер? Что-то я не могу это никак проделать!
Что надо подставлять в качесте eDevice и nDeviceType?
С уважением, Алексей
Ratings: 0 negative/0 positive
Re: ReportListener
piva

Сообщений: 18655
Откуда: Курган
Дата регистрации: 24.03.2004
Щас сразу и не скажу - переход на 9-ку отложился и пока мне не до нее - но если вспомню - скажу
Ratings: 0 negative/0 positive
Re: ReportListener
piva

Сообщений: 18655
Откуда: Курган
Дата регистрации: 24.03.2004
откопал тут старый код
Define Class HookText As ReportListener
Procedure OutputPage (nPageNo, eDevice,nDeviceType, nleft, nTop, nWidth, nHeight, nClipLeft,nClipTop, nClipWidth, nClipHeight)
eDevice='c:\xxx.tiff'
nDeviceType=Iif(nPageNo=1,101,201)
DoDefault(nPageNo, eDevice,nDeviceType)
Enddefine
Так вот думаю, что если страница будет только тебе нужная то DoDefault в остальных случаях NoDefault должно прокатить
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 26 (Гостей: 26)

© 2000-2024 Fox Club 
Яндекс.Метрика