Форум » [x]Harbour » Существует ли в FastReport возможность динамически » Ответить

Существует ли в FastReport возможность динамически

PSP: "рулить" обрамлением текстового поля? Т.е., к примеру, рисовать или нет рамку в зависимости от содержимого поля?

Ответов - 5

Sergey Spirin: PSP пишет: Т.е., к примеру, рисовать или нет рамку в зависимости от содержимого поля? Конечно можно. Вообще говоря, скриптом можно рулить всем, что есть в FR Насчет обрамления, например: [pre2]procedure Memo8OnBeforePrint(Sender: TfrxComponent); begin if bla-bla then TfrxMemoView(Sender).Frame.Typ := ftLeft + ftTop; end; [/pre2]

PSP: Спасибо.

Sergey Spirin: Да не за что Спрашивай, что не понятно. Данный вопрос, наверное, возник потому, что "не прошло" просто: [pre2]Sender.Frame.Typ := ftLeft + ftTop;[/pre2] Так? Если так, то тут надо понять, что Pascal и C языки типизированные и с такой передачей в параметре объекта возникают полиморфные нюансы, которых нет в нетипизированных языках. JavaScript и BasicScript в фасте - нетипизированные языки и там такое присвоение пройдёт. В Pascal и C ситуация следующая, этот обработчик события может "обслуживать" много разных типов объектов, поэтому в обработчиках параметр Sender имеет тип TfrxComponent, это общий предок для вообще всех объектов FR. В реальности же передаваться может любой из его потомков. TfrxMemoView(Sender) - это приведение Sender к типу TfrxMemoView. Если в обработчик могут передаваться объекты разных типов и вызывать надо специфические (а не общие) их методы, то нужно будет писать так: [pre] if Sender is TfrxMemoView then TfrxMemoView(Sender).Frame.Typ := ftLeft + ftTop else if Sender is TfrxPictureView then.... [/pre]


PSP: Серёж, спасибо за разъяснения. Честно говоря, я еще не пытался использовать скрипты. Вот возникла ситуация, когда придётся. Еще раз спасибо!

Andrey: Вопрос к знатокам FastReport, а может и дело не в Фасте ? Столкнулся с проблемой: Никак не могу понять, что за тип переменной в Фасте - FrPrn ? PRIVATE FrPrn //----------- Now load and init FastReport -------------------------------------- FrPrn := frReportManager():new(cFileFastDll) //---------- Set the same icon for FastReport windows ---------- FrPrn:SetIcon( "FAST_ICO" ) Это типа переменная ОБЪЕКТ ? Как в OLE-объекте ? А как тогда ее передавать по ссылке в другие функции ? Поясню кодом: В функции (которую вызываю раньше чем инициализация переменных FastReport) пишу следующее: //////////////////////////////////////////////////////////////// // Функция ввода диска и маски файлов для передачи на форму Fastreport PROCEDURE DoUserDirFr3() LOCAL aDir, I := 1, oAddFrPrn PUBLIC DirNameFr3 M->DirNameFr3 := FormaMain.Text_2.Value aDir := Directory(DirName) oAddFrPrn:SetUserDataSet("Dir", "F_NAME;F_SIZE;F_CREATION_DATE",; {||I := 1}, {||I := I + 1}, ; {||I := I - 1}, {||I > Len(aDir)},; {|aField|xx := IF(aField="F_NAME",1, IF(aField="F_SIZE", 2, 3)) , aDir[I, xx]}) MyViewFR4( M->cSetPathExe + "FrhViewFr3.fr3" , 1, oAddFrPrn ) RETURN Далее: ////////////////////////////////////////////////////////////////////// #include "FastRepH.ch" #include "mydefines.ch" FUNCTION MyViewFR4( cFileForm, nShowDesignReport, oAddFrPrn ) LOCAL cFile, aDemoFile, nI, cText DEFAULT nShowDesignReport TO 2 DEFAULT oAddFrPrn TO NIL ...... MyFastReport4( cFileForm , nShowDesignReport, oAddFrPrn ) RETURN NIL //////////////////////////////////////////////////////////////// FUNCTION MyFastReport4( cFileForm, nShowDesignReport, oAddFrPrn ) LOCAL cText, cFileFastDll := M->cSetPathExe + "FrSystH411.dll" PRIVATE FrPrn //----------- Now load and init FastReport -------------------------------------- FrPrn := frReportManager():new(cFileFastDll) //---------- Set the same icon for FastReport windows ---------- FrPrn:SetIcon( "FAST_ICO" ) // ------------ Init FastReport -------------------------------------- InitFr4( @FrPrn, cFileForm ) //----------- Load file form FastReport ---------------------- FrPrn:LoadFromFile( cFileForm ) // ------------ Init FastReport Vars and Function ------------ InitFr4VarsFunc( @FrPrn ) // ------------ AADD Vars for FastReport ------------ IF oAddFrPrn # NIL // Нужно добавить oAddFrPrn к FrPrn ??? Как это сделать ? ENDIF IF nShowDesignReport == 1 FrPrn:ShowReport() ELSE FrPrn:DesignReport() ENDIF FrPrn:ClearDataSets() //-------- Unload FastReport ------------------------------------------------------------- FrPrn:DestroyFR() ..... Пример для директории взят в 6.fr3 в ДЕМО Но там инициализация Фаста вверху программы FrPrn := frReportManager():new(cFileFastDll), а у меня получается, что я сначала задаю объект обработки, а инициализация Фаста еще не была. Как сделать в таком случае ?



полная версия страницы