FR Embarcadero edition
Перед запуском отчета надо установить :
1 2 |
TfrxReport.EngineOptions.EnableThreadSafe := True; TfrxReport.EngineOptions.SilentMode := True; |
По умолчанию FR использует глобальный список датасетов который инициализируется в модуле frxClass, при создании экземпляра TfrxDBDataset он добавляется в этот список. В связи с этим не возможно использовать датасеты с одинаковыми именами (даже в разных потоках).
Для использования локального списка датасетов нужно использовать следующий код (начиная с версии 4.5.46):
1 2 3 4 |
frxReport.EngineOptions.UseGlobalDataSetList := False; frxReport.EnabledDataSets.Clear(); frxReport.EnabledDataSets.Add(frxDataSet); frxReport.LoadFromFile(ReportName); |
Если в ячейке кросс таблицы используются строковые значения, то нужно отключить агрегатную функцию в редакторе «Кросс - таблицы».
Используйте функцию TfrxMemoView.CalcWidth в обработчике TfrxMemoView.OnAfterData:
1 2 3 4 5 6 |
procedure Memo1OnAfterData(Sender: TfrxComponent); begin Memo1.Font.Size:=10; if Memo1.CalcWidth>Memo1.Width-Memo1.GapX*2 then Memo1.Font.Size:=Trunc(Memo1.Font.Size*((Memo1.Width-Memo1.GapX*2)/Memo1.CalcWidth)); end; |
Сделайте языковой файл утилитой mkall.bat (лежит в каталоге с языком) и подключайте язык динамически:
1 2 |
uses frxRes; frxResources.LoadFromFile('english.xml'); |
1 2 3 4 5 |
var a: variant; begin a := VarArrayOf([1,2,3]); frxReport1.Script.Variables['a'] := a; end; |
Добавьте в отчёт компонент TfrxDialogControls (TfrxRichObject, TfrxCrossObject, TfrxOLEObject, TfrxBarCodeObject, TfrxCheckBoxObject, TfrxGradientObject, frxChartObject, TfrxADOComponents и т.д) с палитры компонентов Fast Report или добавьте в секцию uses модули frxDCtrl, frxRich, frxCross, frxOLE, frxBarcode, frxChBox, frxGradient, frxChart, frxADOComponents.
1 2 3 4 5 6 7 8 9 10 |
var DS: TfrxDataSet; begin DS:=Report.GetDataset('Items'); DS.First; while not DS.Eof do begin ShowMessage(DS.Value('Part Name')); DS.NEXT; end; end. |
Добавьте в секцию uses модуль ConverterRB2FR. В рантайме в дизайнере отчётов Fast Report появится возможность открыть отчёты Report Builder и пересохранить в формате Fast Report.
Скрипт Fast Report не поддерживает множества. Нужно делать так:
1 |
Memo1.Frame.Typ := ftLeft + ftRight + ftTop + ftBottom;
|
Чтобы в заголовок вставить свое наименование отчета, выполните:
1 |
frxReport1.ReportOptions.Name := 'Мой отчёт';
|
Зайдите в дизайнере в меню Вид|Настройки и нажмите кнопку Восстановить настройки
1 2 3 4 |
procedure MasterData1OnBeforePrint(Sender: TfrxComponent); begin if MasterData1.DataSet.RecNo = MasterData1.DataSet.RecordCount-1 then Engine.NewPage; end; |
Добавьте модуль ConverterQR2FR в uses секцию и:
1 2 3 4 5 |
conv := TConverterQr2Fr.Create; conv.Source := QuickRep1; conv.Target := FReport; conv.Convert; FReport.SaveToFile('converted_fromQR.fr3'); |
Установите свойство TfrxRichView.Wysiwyg в False.
Перед формированием отчёта добавьте:
1 |
frxReport1.EngineOptions.DestroyForms:=False;
|
1 |
Rich1.RichEdit.Lines.LoadFromFile()
|
1 |
frxReport1.Engine.StopReport;
|
Если задать количество столбцов для страницы, то записи будут выводиться снизу вверх, а если задать количество столбцов для бэнда, то слева направо.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
uses frxClass, frxPreview, ComCtrls, ToolWin, Buttons; ... procedure TForm1.ButtonClick(Sender: TObject); begin ShowMessage('My Button pressed'); end; procedure TForm1.frxReport1Preview(Sender: TObject); var Button: TSpeedButton; begin // Добавление новой кнопки Button := TSpeedButton.Create(TfrxPreviewForm(frxReport1.PreviewForm).ToolBar); Button.Parent:=TfrxPreviewForm(frxReport1.PreviewForm).ToolBar; Button.Caption:='My Button'; Button.Width:=60; Button.Left:=650; // Обработчик новой кнопки Button.OnClick:=ButtonClick; end; |
Также кнопку в стандартный Preview можно добавить не из события OnPreview, а из OnEndDoc. Данные вариант полезен для двух случаев: 1) Когда обработчик этой кнопки, что то делает с данными предварительного просмотра. В этом случае создавать кнопку из OnPreview нежелательно, так как она будет активной еще во время построения отчета. 2) Когда доп. кнопка должна появится по некоторому условию, которое задается в предпечатном диалоге (frxDialogPage). +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Для кнопки PDF экспорта
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, frxClass, frxExportPDF, frxPreview, frxDsgnIntf, Menus; type TForm1 = class(TForm) frxReport1: TfrxReport; frxPDFExport1: TfrxPDFExport; SaveDialog1: TSaveDialog; procedure FormCreate(Sender: TObject); procedure frxReport1Preview(Sender: TObject); procedure PDFExport(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.PDFExport(Sender: TObject); begin if SaveDialog1.Execute then begin frxPDFExport1.FileName:=SaveDialog1.FileName; TfrxPreview(frxReport1.Preview).Export(frxPDFExport1); end; end; procedure TForm1.FormCreate(Sender: TObject); begin frxReport1.ShowReport; end; procedure TForm1.frxReport1Preview(Sender: TObject); var i, j, mi: integer; begin TfrxPreviewForm(frxReport1.PreviewForm).PdfB.OnClick:=PDFExport; for i := 0 to frxExportFilters.Count - 1 do begin if TfrxCustomExportFilter(frxExportFilters[i].Filter).ClassName = 'TfrxPDFExport' then mi:=i; end; TfrxPreviewForm(frxReport1.PreviewForm).ExportPopup.Items[mi].OnClick:=PDFExport; for i:=0 to TfrxPreviewForm(frxReport1.PreviewForm).RightMenu.Items.Count-1 do begin if TfrxPreviewForm(frxReport1.PreviewForm).RightMenu.Items[i].Caption=TfrxPreviewForm(frxReport1.PreviewForm).ExportB.Hint then begin for j:=0 to TfrxPreviewForm(frxReport1.PreviewForm).RightMenu.Items[i].Count-1 do if TfrxPreviewForm(frxReport1.PreviewForm).RightMenu.Items[i][j].Caption=TfrxPreviewForm(frxReport1.PreviewForm).ExportPopup.Items[mi].Caption then TfrxPreviewForm(frxReport1.PreviewForm).RightMenu.Items[i][j].OnClick:=PDFExport; end; if TfrxPreviewForm(frxReport1.PreviewForm).RightMenu.Items[i].Caption=TfrxPreviewForm(frxReport1.PreviewForm).PdfB.Hint then TfrxPreviewForm(frxReport1.PreviewForm).RightMenu.Items[i].OnClick:=PDFExport; end; end; end. |
Следующий обработчик переопределяет обработчик кнопки "Открыть"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
uses frxClass, frxPreview, frxPreviewPages, frxRes; type TForm1 = class(TForm) frxReport1: TfrxReport; procedure frxReport1Preview(Sender: TObject); procedure NewOnClick(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.frxReport1Preview(Sender: TObject); begin if frxReport1.PreviewForm is TfrxPreviewForm then begin TfrxPreviewForm(frxReport1.PreviewForm).OpenB.OnClick := NewOnClick; TfrxPreviewForm(frxReport1.PreviewForm).RightMenu.Items[3].OnClick := NewOnClick; end; end; procedure TForm1.NewOnClick(Sender: TObject); var OpenDlg: TOpenDialog; begin if frxReport1.Engine.Running then Exit; OpenDlg := TOpenDialog.Create(nil); try OpenDlg.Options := [ofHideReadOnly]; OpenDlg.Filter := frxResources.Get('clFP3files') + ' (*.fp3)|*.fp3'; if OpenDlg.Execute then begin TfrxPreview(frxReport1.Preview).LoadFromFile(OpenDlg.FileName); frxReport1.PreviewForm.Caption := OpenDlg.FileName; end; finally OpenDlg.Free; end; end; end. |
1 2 3 4 5 6 7 8 9 10 11 12 |
procedure TForm1.frxReport1Progress(Sender: TfrxReport; ProgressType: TfrxProgressType; Progress: Integer;) begin if Progress > 1 then frxReport1.Engine.StopReport; end; procedure TForm1.Button1Click(Sender: TObject); begin frxReport1.PrepareReport(); while frxReport1.PreviewPages.Count > 1 do frxReport1.PreviewPages.DeletePage(1); frxReport1.ShowPreparedReport; end; |
Конечно, можно. Вы можете создать панель с кнопками и использовать следующие методы TfrxPreview для каждой кнопки frxPreview1.Print;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
frxPreview1.LoadFromFile; frxPreview1.SaveToFile; frxPreview1.Export(Filter); frxPreview1.Find; frxPreview1.Zoom:=frxPreview1.Zoom + 0.25; frxPreview1.Zoom:=frxPreview1.Zoom - 0.25; frxPreview1.OutlineVisible := frxPreview1.OutlineVisible; frxPreview1.ThumbnailVisible:=not frxPreview1.ThumbnailVisible; frxPreview1.PageSetupDlg; frxPreview1.Edit; frxPreview1.First; frxPreview1.Prior; frxPreview1.PageNo := 1; frxPreview1.Next; frxPreview1.Last; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
uses frxRich, frxRichEditor, frxDesgn; procedure TForm1.frxReport1ClickObject(Sender: TfrxView; Button: TMouseButton; Shift: TShiftState; var Modified: Boolean); begin if Sender is TfrxRichView then with TfrxRichEditorForm.Create(Form1) do begin RichView := TfrxRichView(Sender); Modified := ShowModal = mrOk; Free; end; end; uses frxDesgn, frxEditPicture; procedure TForm1.frxReport1ClickObject(Sender: TfrxView; Button: TMouseButton; Shift: TShiftState; var Modified: Boolean); begin if Sender is TfrxPictureView then with TfrxPictureEditorForm.Create(Form1) do begin Image.Picture.Assign(TfrxPictureView(Sender).Picture); Modified := ShowModal = mrOk; if Modified then TfrxPictureView(Sender).Picture.Assign(Image.Picture); Free; end; end; |
По аналогии с окном предварительного просмотра:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
procedure TForm1.frxDesigner1Show(Sender: TObject); begin if Sender is TfrxDesignerForm then begin TfrxDesignerForm(Sender).OpenB.Visible:=False; end; end; procedure TForm1.frxDesigner1Show(Sender: TObject); var i: integer; begin if Sender is TfrxDesignerForm then begin for i:=0 to TfrxDesignerForm(Sender).ObjectsTB1.ButtonCount-1 do if TfrxDesignerForm(Sender).ObjectsTB1.Buttons[i].ImageIndex in [30, 32] then //скрываются кнопки КОПИРОВАНИЕ ВНЕШНЕГО ВИДА и СЛУЖЕБНЫЙ ТЕКСТ TfrxDesignerForm(Sender).ObjectsTB1.Buttons[i].Visible:=False; TfrxDesignerForm(Sender).DataTree.FunctionsTree.Visible:=False; TfrxDesignerForm(Sender).DataTree.ClassesTree.Visible:=False; end; end; |
Зайдите в дизайнере в меню Вид|Настройки и снимите опцию Использовать шрифт объекта
В дизайнере в меню Вид-Настройки включите опцию "Показывать заголовки бэндов"
Визард создал отчёт с использованием стилей. Вам нужно либо изменить соответствующий стиль, либо очистить стиль объекта
Доступ ко всем полям структуры DEVMODE можно получить событии OnPrintPage, к примеру для изменения поля DM_MEDIATYPE можно использовать такой код (по аналогии и для остальных полей) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
uses frxprinter; procedure frxReport1PrintPage(Page: TfrxReportPage; CopyNo: Integer); procedure ChangeMediaType(mType: Integer); begin if frxPrinters.Printer is TfrxPrinter then with TfrxPrinter(frxPrinters.Printer) do begin DeviceMode.dmFields := DeviceMode.dmFields or DM_MEDIATYPE; DeviceMode.dmMediaType := mType; SetPrintParams(Page.PaperSize, Page.PaperWidth, Page.PaperHeight, Page.Orientation, Page.Bin, Integer(Page.Duplex), frxReport1.PrintOptions.Copies); end; end; begin if idx = 0 then ChangeMediaType(DMMEDIA_TRANSPARENCY) else if idx = 1 then ChangeMediaType(DMMEDIA_GLOSSY) else ChangeMediaType(DMMEDIA_STANDARD); inc(idx); end; |
Для реализации такой функциональности нужно запретить коннект при загрузке отчёта в событии TfrxReport.OnBeforeConnect var Form1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
TForm1; Connect: Boolean; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin Connect:=False; frxReport1.LoadFromFile('C:\test.fr3'); Connect:=True; TfrxADODataBase(frxReport1.FindObject('ADODatabase1')).Connected := False; TfrxADODataBase(frxReport1.FindObject('ADODatabase1')).DatabaseName := 'Provider=Microsoft.Jet.OLEDB.4.0; User ID=Admin; Data Source=C:\Program Files\FastReports\FastReport 4\Demos\Main\demo.mdb'; TfrxADODataBase(frxReport1.FindObject('ADODatabase1')).Connected := True; frxReport1.ShowReport(); end; procedure TForm1.frxReport1BeforeConnect(Sender: TfrxCustomDatabase; var Connected: Boolean); begin if not Connect then Connected:=False; end; |
Можно добавить текст как в превью в событии TfrxReport.OnEndDoc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
procedure TForm1.frxReport1EndDoc(Sender: TObject); var p: TfrxReportPage; m: TfrxMemoView; i: integer; begin frxReport1.Preview.Lock; for i := 0 to frxReport1.PreviewPages.Count - 1 do begin p:=TfrxReportPage(frxReport1.PreviewPages.Page[i]); m:=TfrxMemoView.Create(p); m.CreateUniqueName; m.SetBounds(0, 0, (p.PaperWidth - p.RightMargin - p.LeftMargin) * fr01cm, (p.PaperHeight - p.TopMargin - p.BottomMargin) * fr01cm); m.Text := 'Demo'; m.Rotation := 45; m.Font.Size := 128; m.VAlign := vaCenter; m.HAlign := haCenter; frxReport1.PreviewPages.ModifyPage(i,p); end; frxReport1.Preview.UnLock; end; //так и перед непосредственной печатью страницы в событии TfrxReport.OnPrintPage procedure TForm1.frxReport1PrintPage(Page: TfrxReportPage; CopyNo: Integer); var m: TfrxMemoView; begin m:=TfrxMemoView.Create(page); m.CreateUniqueName; m.SetBounds(0, 0, (page.PaperWidth - page.RightMargin - page.LeftMargin) * fr01cm, (page.PaperHeight - page.TopMargin - page.BottomMargin) * fr01cm); m.Text := 'Demo'; m.Rotation := 45; m.Font.Size := 128; m.VAlign := vaCenter; m.HAlign := haCenter; end; |
Вы можете пересортировать страницы превью после формирования отчёта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
var i, j: integer; page : TfrxReportPage; begin frxReport1.PrepareReport(); j := frxReport1.PreviewPages.Count div 2; page := TfrxReportPage.Create(nil); for i := 0 to j - 2 do begin page.AssignAll(frxReport1.PreviewPages.Page[j + i]); frxReport1.PreviewPages.AddEmptyPage(i * 2 + 1); frxReport1.PreviewPages.ModifyPage(i * 2 + 1, page); frxReport1.PreviewPages.DeletePage(j + i + 1); end; page.Free; frxReport1.ShowPreparedReport; end; |
Попробуйте установить ADODataBase.Connected=False перед изменением параметров соединения, а потом восстанавливайте соединение
Попробуйте просто устанавливать ширину=0
1 2 3 4 5 |
procedure Cross1OnCalcWidth(ColumnIndex: Integer; ColumnValues: Variant; var Width: Extended); begin if ColumnIndex=0 then Width:=0; end; |
Добавьте в отчёт ещё один MasterData2 с пустыми ячейками и управляйте значением MasterData2.RowCount в скрипте в обработчике подвала данных
Добавьте в отчёт бэнд DetailData. Установите DetailData.RowCount=1 (Это обязательно!) В событии MasterData1OnBeforePrint устанавливайте DetailData.RowCount:= На бэнде DetailData расположите мемо с полями из датасета, привязанного к MasterData. Высоту MasterData установите равной 0: MasterData.Height=0
В приведенном коде при клике на TfrxRichView его содержимое копируется в Memo1 на диалоговой форме:
1 2 3 4 5 6 7 8 9 10 |
procedure Rich1OnPreviewClick(Sender: TfrxView; Button: TMouseButton; Shift: Integer; var Modified: Boolean); var st: TMemorystream; begin st:=TMemoryStream.Create; Rich1.RichEdit.StreamFormat:=0; Rich1.RichEdit.Lines.SaveToStream(st); st.Position:=0; Memo1.Lines.LoadFromStream(st); st.Free; DialogPage1.ShowModal; end; |
Используйте в скрипте константы fr01cm (для перевода мм в пиксели), fr1cm (для перевода см в пиксели)
В Delphi:
1 2 3 4 5 6 7 8 |
frxReport1.Script.AddClass(TfrxCustomExportFilter, 'TComponent'); frxReport1.Script.AddClass(TfrxCustomImageExport, 'TfrxCustomExportFilter'); frxReport1.Script.AddClass(TfrxBMPExport, 'TfrxCustomImageExport'); frxReport1.Script.AddClass(TfrxRTFExport, 'TfrxCustomExportFilter'); ... frxReport1.Script.AddObject('frxRTFExport1',frxRTFExport1); frxReport1.Script.AddObject('frxBMPExport1',frxBMPExport1); ... |
В скрипте: Код frxRTFExport1.FileName := 'myFilename.rtf';
Передавайте строку в кодировке UTF8. Например, символ "диаметр" можно передать следующим кодом
1 |
frxReport1.Script.Variables['test']:= UTF8Decode('Гё');
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
uses fs_iinterpreter; var i: integer; v: TfsCustomVariable; begin for i:=0 to frxReport1.Variables.Count-1 do if frxReport1.Variables.Items[i].Name[1]<>' ' then ShowMessage(frxReport1.Variables.Items[i].Name); for i := 0 to frxReport1.Script.Count - 1 do begin v := frxReport1.Script.Items[i]; if v is TfsMethodHelper then ShowMessage(v.Name+' '+TfsMethodHelper(v).Syntax+' '+TfsMethodHelper(v).Description); end; end; |
1 2 3 4 5 6 7 8 9 |
constructor TFunctions.Create(AScript: TfsScript); begin inherited Create(AScript); with AScript do begin with TfsClassVariable(Find('TfrxView')) do AddMethod('procedure SendToBack',CallMethod); end; end; initialization fsRTTIModules.Add(TFunctions); |
Для этого нужно зарегистрировать в скрипте отчёта пользовательскую функцию, которая будет возвращать состояние заголовка группы
1 2 3 4 5 6 7 8 9 |
function TForm1.frxReport1UserFunction(const MethodName: String; var Params: Variant): Variant; begin if MethodName = 'CHECKDRILLSTATE' then Result := frxReport1.DrillState.IndexOf(Params[0]); end; procedure TForm1.FormShow(Sender: TObject); begin frxReport1.AddFunction('function CheckDrillState(DrillName : string): integer'); end; |
а в самом скрипте отчёта проверять состояние заголовка группы и устанавливать требуемый стиль шрифта
1 2 3 4 5 6 7 |
procedure GroupHeader1OnBeforePrint(Sender: TfrxComponent); begin if CheckDrillState(GroupHeader1.DrillName) <> - 1 then Memo6.Font.Style := fsBold else Memo6.Font.Style := 0; end; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, frxClass, fs_itools, fs_xml, frxRes, frxrcDesgn, frxDesgn, ComCtrls; type TForm1 = class(TForm) frxReport1: TfrxReport; TreeView1: TTreeView; procedure FormShow(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormShow(Sender: TObject); var XML: TfsXMLDocument; procedure SetImageIndex(Node: TTreeNode; Index: Integer); begin Node.ImageIndex := Index; Node.StateIndex := Index; Node.SelectedIndex := Index; end; procedure AddFunctions(xi: TfsXMLItem; Root: TTreeNode); var i: Integer; Node: TTreeNode; s: String; begin s := xi.Prop['text']; if xi.Count = 0 then s := Copy(s, Pos(' ', s) + 1, 255) else { function } s := frxResources.Get(s); { category } if CompareText(s, 'hidden') = 0 then Exit; Node := TreeView1.Items.AddChild(Root, s); if xi.Count = 0 then Node.Data := xi; if Root = nil then Node.Text := frxResources.Get('dtFunc'); if xi.Count = 0 then SetImageIndex(Node, 52) else SetImageIndex(Node, 66); for i := 0 to xi.Count - 1 do AddFunctions(xi[i], Node); end; begin XML := TfsXMLDocument.Create; TreeView1.Images := frxResources.MainButtonImages; frxReport1.Script.AddRTTI; GenerateXMLContents(frxReport1.Script, XML.Root); TreeView1.Items.BeginUpdate; TreeView1.Items.Clear; AddFunctions(XML.Root.FindItem('Functions'), nil); TreeView1.FullExpand; TreeView1.TopItem := TreeView1.Items[0]; TreeView1.Items.EndUpdate; end; end. |
Устанавливать видимость страницы отчёта Вы можете до начала его формирования, например, в главной процедуре отчёта. В Page1.OnBeforePrint Ваш код не сработает
Создал отчет в котором вначале его выполнения появляется диалоговое окно. В диалоге я выбираю одно из двух значений: продолжить выполнение текущего отчета или вызать из него новый отчет. При вызове нового отчета мне нужно закрыть форму предварительного просмотра первого отчета. Иначе получается так: Вызываю из первого отчета второй, он отрабатывает, показывает данные, я закрываю окно пр.просмотра второго отчета дальше вижу пустое окно пр. просмотра первого отчета. Используйте пользовательскую функцию В Delphi:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
procedure TForm1.FormCreate(Sender: TObject); begin frxReport1.AddFunction('function CloseReport'); frxReport1.LoadFromFile('testReport1.fr3'); frxReport1.ShowReport(); end; function TForm1.frxReport1UserFunction(const MethodName: String; var Params: Variant): Variant; begin if MethodName='CLOSEREPORT' then frxReport1.PreviewForm.Close; end; //в скрипте: procedure Button1OnClick(Sender: TfrxComponent); var rep: TfrxReport; begin rep := TfrxReport.Create(Report); rep.EngineOptions := Report.EngineOptions; rep.LoadFromFile('TestReport2.fr3'); rep.ShowReport; CloseReport; end; |
Задайте у бэнда свойство RowCount
1 2 3 4 5 6 7 8 |
procedure Memo1OnBeforePrint(Sender: TfrxComponent); var S: TStringList; begin S:=TStringList.Create; S.LoadFromFile('C:\test.txt'); Memo1.AnsiText:=S.Text; S.Free; end; |
Да, используйте установочный файл - FR4*D11*.EXE.
Для коректной работы FastReport, для Delphi6 требуется Update2.
Способ 1:
В каталоге Res\russian запустите mk.bat и перекомпилируйте пакеты.
Способ 2:
Запустите утилиту "Recompile Wizard" (recompile.exe), выберите версию IDE и версию FR, выберите "Change language to" и Russsian из выпадающего списка, нажмите "Compile".
Нет, FastReport 4 использует те же имена классов, что и FastReport 3.
Перед установкой новой версии необходимо полностью удалить предыдущую:
- Выполнить деинсталляцию предыдущей версии;
- Удалить все frx*.dcu , fs*.dcu, frx*.bpl, fs*.bpl, dclfrx*.bpl, dclfs*.bpl из Windows\System32 (если есть) и Borland\Project\BPL;
- Убедится, что предыдущая версия удалена полностью;
- Установить новую версию.
1. Возможно, остались dcu от старых версий Fast Report или Fast Script, удалите их.
2. После установки Fast Report был установлен пакет Fast Script. Fast Script входит в пакет Fast Report (версии выше Basic) и отдельно его устанавливать не нужно.
Создавайте необходимые фильтры динамически, перед вызовом превью:
1 2 3 4 5 6 7 |
var frxRTFExport1:TfrxRTFExport; begin frxRTFExport1:=TfrxRTFExport.Create(Form1); frxReport1.PreviewOptions.Buttons:= frxReport1.PreviewOptions.Buttons+[pbExport]; frxReport1.ShowReport(); frxRTFExport1.Free; end |
Установите свойство TfrxPDFExport.PrintOptimized := True;
Нет.
Экспорт в RTF требует наличия установленного в системе Microsoft Word, XLS - Microsoft Excel. Экспорт в XML не требует установки каких-либо приложений.
Это происходит в том случае если у TfrxMemoView.DisplayFormat.Kind установлен в fkText. Установите TfrxMemoView.DisplayFormat.Kind в fkNumeric.
Установите у фильтра экспорта свойства ShowDialog, ShowProgress в False и заполните DefaultPath и FileName.
Выберите в диалоге в комбобоксе Esc-команды требуемый тип команд или задайте в коде frxDotMatrixExport1.EscModel:=1; // Epson Generic
Напрямую распечатать DMP отчёт на USB принтере не удастся. Поэтому в качестве альтернативы можно экспортировать DMP отчёт в текстовый файл, а затем этот файл загрузить в TfrxMemoView в обычный отчёт:
1 2 3 4 5 6 7 |
frxReport1.PrepareReport; if frxReport1.DotMatrixReport then begin frxReport1.Export(frxDotMatrixExport1); frxReport1.LoadFromFile('1.fr3'); end; frxReport1.ShowReport; //Отчёт 1.fr3 должен содержать MasterData1 с установленным свойствами: MasterData1.AllowSplit=True MasterData1.RowCount=1 MasterData1.Stretched=True и Мемо1 с установленными свойствами: Memo1.Font.Name=Courier New Memo1.Font.Size=11 Memo1.StretchMode=smActualHeight Обработчик Memo1.OnBeforePrint: procedure Memo1OnBeforePrint(Sender: TfrxComponent); begin Memo1.Memo.LoadFromFile('text.txt'); end; |
Вы используете относительные пути при загрузке шаблонов отчётов. При экспорте отчёта пользователь сохраняет файл в каталог, отличный от каталога программы. Поэтому шаблон отчёта при повторной загрузке не загружается, т.к. меняется текущий каталог. Во избежание подобной ситуации используйте абсолютные пути при загоузке шаблонов отчёта ExtractFilePath(Application.ExeName)+'Reports\test.fr3'
Делайте так:
1 2 3 |
frxPreview1.Lock; frxReport1.Export(frxPDFExport1); frxPreview1.UnLock; |
или так:
1 |
frxPreview1.Export(frxPDFExport1);
|
Видимо это из-за того, что TfrxRichView конвертится, как картинка, а TfrxMemoView - как текст. Установите свойство
1 |
TfrxPDFExport.PrintOptimized := True;
|
Установите свойство TfrxPDFExport.Stream