*----------------------------- * QUICKREPORTBUILDER.PRG *----------------------------- #DEFINE QUERY_TITLE_LOC "Creating a Quick Report" #DEFINE HEADER_QUERY_LOC "Company-standard name will be included. "+ ; "Would you like to add something?" #DEFINE FINISH_QUERY_LOC "Finished! "+CHR(13)+ ; "Would you like to adjust the contents?" #DEFINE COMPANY_HEADER_LOC "ABC Company"
* Флажки возвращаемых величие:--------- #DEFINE EVENT_PASSED_TO_VFP 0 #DEFINE EVENT_HANDLED_BY_BUILDER 1 #DEFINE FRX_DISCARD_CHANGES 0 #DEFINE FRX_RELOAD_CHANGES 2
* Типы событий перехватчика:----------- #DEFINE EVENTTYPE_REPORTOPEN 7 #DEFINE EVENTTYPE_OBJECTCREATE 2 #DEFINE EVENTTYPE_REPORTSAVE 6 #DEFINE EVENTTYPE_REPORTCLOSE 8 #DEFINE EVENTTYPE_PROPERTIES 1
* Режимы обработок ReportBuilder.App: #DEFINE MODE_HANDLE_CLASS 1 #DEFINE MODE_FORCE_DEBUG 2 #DEFINE MODE_FORCE_NATIVE 3
* стандартный набор FRX #DEFINE OBJTYPE_TEXT 5 #DEFINE OBJTYPE_FIELD 8 #DEFINE OBJTYPE_FONTRES 23 * ----------------------------
#DEFINE MB_YESNO 4 #DEFINE MB_ICONQUESTION 32 #DEFINE IDYES 6 #DEFINE IDNO 7 * ----------------------------
LPARAMETERS returnFlags, eventType, commandClauses, designerSessionId
* Этот построитель пригоден лишь для быстрых отчетов "quick report". * Критерий: - Должен быть раскладкой REPORT, но не LABEL * - Должен быть использован командной CREATE REPORT FROM...
LOCAL BuilderModule BuilderModule = HOME()+"ReportBuilder.App"
IF commandClauses.IsReport AND NOT EMPTY(commandClauses.FROM)
LOCAL oFrxHelper oFrxHelper = NEWOBJECT("frxCursor", HOME()+"FFC\_frxcursor.vcx")
DO CASE CASE m.eventType = EVENTTYPE_REPORTOPEN * Это первое событие для быстрого отчета. * Во-первых, заменим шрифтовые ресурсы и информацию и шрифте, используемые
* замените шрифт и информацию о шрифте * в заголовке, в соответствии с вашими требованиями,так как * в этом простом примере имеются некоторые жесткозаданные * метрики для высот. * Курсор FRX находится в текущей рабочей области: REPLACE frx.fontface WITH "Courier New" ; FOR RECNO() = 1 OR frx.objtype = OBJTYPE_FONTRES LOCATE FOR frx.objtype = OBJTYPE_FONTRES
* Теперь, добавьте запись ресурса шрифта для нашего * "designed" выражения: SCATTER MEMVAR MEMO m.penred = 255 m.fontface = "Tahoma" m.fontstyle = 1 INSERT INTO frx FROM MEMVAR
* Теперь, повторно используйте переменные памяти, изменяя их значения, * для установки записи спроектированного выражения: m.uniqueid = SYS(2015) m.objtype = OBJTYPE_TEXT m.objcode = 0 m.timestamp = oFrxHelper.getFrxTimeStamp() m.vpos = 20 m.hpos = 20 m.height = 3000 m.width = 50000 m.fillchar = "C" m.penred = 255 STORE -1 TO m.fillred, m.fillgreen, m.fillblue m.mode = 1 m.stretch = .T. m.top = .T. m.spacing = 2 m.offset = 2 m.resettotal = 1 m.supalways = .T. m.suprpcol = 3 m.supgroup = 0 m.totaltype = 0 m.expr = INPUTBOX(HEADER_QUERY_LOC, ; QUERY_TITLE_LOC, ; COMPANY_HEADER_LOC)
DO CASE CASE EMPTY(m.expr) m.expr = COMPANY_HEADER_LOC
CASE ATC(COMPANY_HEADER_LOC,m.expr) = 0 m.expr = COMPANY_HEADER_LOC + " " + ALLTR(m.expr)
ENDCASE m.expr = ["]+m.expr+["]
INSERT INTO frx FROM MEMVAR
* Наконец, сообщите дизайнеру о том, чтобы использовались наши изменения: returnFlags = FRX_RELOAD_CHANGES
CASE m.eventType = EVENTTYPE_REPORTSAVE * Это последнее событие в быстром отчете.
IF NOT EMPTY(m.BuilderModule) AND ; MESSAGEBOX(FINISH_QUERY_LOC,; MB_YESNO +MB_ICONQUESTION,; QUERY_TITLE_LOC) = IDYES
* Дайте пользователю шанс установить или ликвидировать * объекты определенных типов: SCAN ALL FOR INLIST(frx.objtype, ; OBJTYPE_FIELD, OBJTYPE_TEXT) * Отметьте объект, как "selected" так чтобы построитель мог * с ним работать: REPLACE frx.curpos WITH .T. * Вызовите приложение построителя, ; * подделывая обычное событие дизайнера отчета: do (BuilderModule) with ; -1, EVENTTYPE_PROPERTIES, ; m.commandClauses, ; m.designerSessionId REPLACE frx.curpos WITH .F. ENDSCAN m.returnFlags = FRX_RELOAD_CHANGES ENDIF
* Найдите компонент для выражения DATE(), созданный * процессом Quick Report и превратите его в DATETIME(): LOCATE FOR frx.objtype = OBJTYPE_FIELD AND ; UPPER(ALLTRIM(frx.expr)) == "DATE()" LOCAL liWidth liWidth = oFrxHelper.GetFruTextWidth( ; TRANSFORM(DATETIME()),; frx.fontface, frx.fontsize ) REPLACE frx.expr WITH "DATETIME()", ; frx.width WITH m.liWidth
* Найдите компоненты _pageno и слегка исправьте их: LOCATE FOR frx.objtype = OBJTYPE_TEXT ; AND ATC(["PAGE],frx.expr) > 0 IF FOUND() REPLACE frx.expr WITH ["Page "+TRANSFORM(_PAGENO)],; frx.objtype WITH OBJTYPE_FIELD, ; frx.hpos WITH (frx.hpos - (frx.width*2)), ; frx.width WITH frx.width*3 SKIP * Удалите другой объект _pageno который следует за * "Page" в обычном быстром отчете: DELETE ENDIF
* Мы должны проинструктировать дизайнер, чтобы он одобрил наши изменения: returnFlags = FRX_RELOAD_CHANGES
OTHERWISE returnFlags = EVENT_PASSED_TO_VFP
ENDCASE
ELSE * Параметры направляются по ссылке: do (BuilderModule) with m.returnFlags, ; m.eventType, ; m.commandClauses, ; m.designerSessionId ENDIF RETURN
|