logo
small logo
  • Продукты
  • Купить
  • Поддержка
  • Статьи
  • Клиентская панель Поддержка
  • Главная
  • /
  • Поддержка
  • /
  • FAQ
  • /
  • FastReport 4 VCL

FastReport® VCL 4

Версия: 4.15.13 Дата: 04 июля 2014 г.
  • Документация
  • Деинсталляция
  • Лицензия
  • FAQ

Какая версия поставляется с C + + Builder ХЕ2 Professional?

FR Embarcadero edition

Как использовать FR в нескольких потоках?

Перед запуском отчета надо установить :

1
2
TfrxReport.EngineOptions.EnableThreadSafe := True; 
TfrxReport.EngineOptions.SilentMode := True;

 

Как отключить использование глобального списка датасетов при использовании TfrxReport в потоке ?

По умолчанию FR использует глобальный список датасетов который инициализируется в модуле frxClass, при создании экземпляра TfrxDBDataset он добавляется в этот список. В связи с этим не возможно использовать датасеты с одинаковыми именами (даже в разных потоках).
Для использования локального списка датасетов нужно использовать следующий код (начиная с версии 4.5.46):

1
2
3
4
frxReport.EngineOptions.UseGlobalDataSetList := False;
frxReport.EnabledDataSets.Clear();
frxReport.EnabledDataSets.Add(frxDataSet);
frxReport.LoadFromFile(ReportName);

 

При построении отчета с кросс таблицей появляется ошибка «Could convert variant of type (String) into type (Double)».

Если в ячейке кросс таблицы используются строковые значения, то нужно отключить агрегатную функцию в редакторе «Кросс - таблицы».

В отчёте требуется вписать текст в фиксированный по ширине TfrxMemoView, используя уменьшение размера шрифта. Как это реализовать?

Используйте функцию 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');

 

How can you transfer an array of variables from Delphi into FR ?
1
2
3
4
5
var a: variant;
begin
 a := VarArrayOf([1,2,3]);
 frxReport1.Script.Variables['a'] := a;
end;

 

При компиляции проекта выдаётся сообщение 'Class TfrxButtonControl not found' (TfrxRichView, TfrxCrossView, TfrxOLEView,TfrxBarCodeView, TfrxCheckBoxView, TfrxGradientView, TfrxChartView, TfrxADOQuery и т.д.).

Добавьте в отчёт компонент TfrxDialogControls (TfrxRichObject, TfrxCrossObject, TfrxOLEObject, TfrxBarCodeObject, TfrxCheckBoxObject, TfrxGradientObject, frxChartObject, TfrxADOComponents и т.д) с палитры компонентов Fast Report или добавьте в секцию uses модули frxDCtrl, frxRich, frxCross, frxOLE, frxBarcode, frxChBox, frxGradient, frxChart, frxADOComponents.

How can you code dataset navigation connected to the report but not connected to any band in report script ?
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.

 

Как конвертировать отчеты из Report Builder в Fast Report ?

Добавьте в секцию uses модуль ConverterRB2FR. В рантайме в дизайнере отчётов Fast Report появится возможность открыть отчёты Report Builder и пересохранить в формате Fast Report.

В скрипте пытаюсь установить границы у Memo: Memo1.Frame.Typ := [ftLeft, ftRight, ftTop, ftBottom]. Получаю ошибку.

 Скрипт Fast Report не поддерживает множества. Нужно делать так:

1
Memo1.Frame.Typ := ftLeft + ftRight + ftTop + ftBottom; 

 



Как в заголовок окна предварительного просмотра вставить своё наименование отчета ?

Чтобы в заголовок вставить свое наименование отчета, выполните:

1
frxReport1.ReportOptions.Name := 'Мой отчёт';

 

У меня в дизайнере отчётов пропал инспектор объектов (дерево данных, стандартная панель инструментов)

Зайдите в дизайнере в меню Вид|Настройки и нажмите кнопку Восстановить настройки

How can you put the last record into master data on a new page ?
1
2
3
4
procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
begin
 if MasterData1.DataSet.RecNo = MasterData1.DataSet.RecordCount-1 then Engine.NewPage;
end;

 

Как конвертировать отчеты из QuickReport в Fast Report ?

Добавьте модуль ConverterQR2FR в uses секцию и:

1
2
3
4
5
conv := TConverterQr2Fr.Create;
conv.Source := QuickRep1;
conv.Target := FReport;
conv.Convert;
FReport.SaveToFile('converted_fromQR.fr3');

 

В превью текст, отображаемый в TfrxMemoView, отличается от TfrxRichView, несмотря на то, что тип и размер шрифта одинаков.

Установите свойство TfrxRichView.Wysiwyg в False.

После закрытия окна превью в Delphi не удаётся получить значения переменных отчёта

Перед формированием отчёта добавьте:

1
frxReport1.EngineOptions.DestroyForms:=False;

 

Каким образом загрузить в скрипте RTF-файл в TfrxRichView?
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 отсутствует панель с кнопками, подобная той, которая есть в стандартном окне предварительного просмотра. Можно ли создать свою панель, аналогичную стандартной?

Конечно, можно. Вы можете создать панель с кнопками и использовать следующие методы 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;

 

Каким образом можно реализовать редактирование TfrxRichView, TfrxPictureView в окне предварительного просмотра посредством стандартных диалоговых окон редактирования TfrxRichView, TfrxPictureView?
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;

 

В дизайнере при вводе текста в мемо с установленным размером шрифта в 6 пт текст в мемо невозможно прочесть

Зайдите в дизайнере в меню Вид|Настройки и снимите опцию Использовать шрифт объекта

Пропали цвета в заголовках бэндов. Что делать?

В дизайнере в меню Вид-Настройки включите опцию "Показывать заголовки бэндов"

Создал отчёт с помощью визарда. Теперь не могу изменить цвет, шрифт элементов отчёта

Визард создал отчёт с использованием стилей. Вам нужно либо изменить соответствующий стиль, либо очистить стиль объекта

Каким образом можо сменить тип бумаги при печати отчёта?

Доступ ко всем полям структуры 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;

 

Каким образом поменять строку коннекта для TfrxADODataBase, чтобы избежать появления сообщения об ошибке, если у пользователя строка коннекта отлична от строки коннекта, установленной разработчиком в шаблоне отчёта?

Для реализации такой функциональности нужно запретить коннект при загрузке отчёта в событии 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;

 

В отчёте формируются две TfrxReportPage. На первой странице выводятся данные для лицевой стороны листа, на второй - для обратной. Для печати в дуплексе необходимо выводить поочерёдно лицевую и обратную сторону. Как это можно реализовать?

Вы можете пересортировать страницы превью после формирования отчёта: 

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, приложение выдаёт ошибку "Operation is not allowed because object is open". В 3-й версии было возможно. Как решить проблему с изменением данных о подключении к БД?

Попробуйте установить ADODataBase.Connected=False перед изменением параметров соединения, а потом восстанавливайте соединение

Подскажите как программно скрыть столбец в DBCrossView?

Попробуйте просто устанавливать ширину=0 

1
2
3
4
5
procedure Cross1OnCalcWidth(ColumnIndex: Integer; ColumnValues: Variant; var Width: Extended); 
begin 
if ColumnIndex=0 then 
Width:=0; 
end;

 

Каким образом можно вывести пустые ячейки до конца страницы, если MasterData1 содержит 3-5 строк данных?

Добавьте в отчёт ещё один MasterData2 с пустыми ячейками и управляйте значением MasterData2.RowCount в скрипте в обработчике подвала данных

Как можно повторить печать MasterData требуемое количество раз? Количество задано в одном из полей записи

Добавьте в отчёт бэнд DetailData. Установите DetailData.RowCount=1 (Это обязательно!) В событии MasterData1OnBeforePrint устанавливайте DetailData.RowCount:= На бэнде DetailData расположите мемо с полями из датасета, привязанного к MasterData. Высоту MasterData установите равной 0: MasterData.Height=0

Каким образом можно получить доступ к RTF тексту? (что то типа string s:=Rich.RichText.Lines.RTF)

В приведенном коде при клике на 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;

 

В скрипте отчёта значения Page1.PaperHeight, Page1.TopMargin и т.п. представлены в мм, тогда как значения высоты объектов - в пикселях. Каким образом перевести мм в пиксели?

Используйте в скрипте константы 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';

Необходимо передать в отчёт Unicode строку. Как это сделать?

Передавайте строку в кодировке 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;

 

Как добавить в скрипт функцию SendToBack?
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);

 

Возможно ли менять стиль шрифта в TfrxMemoView в зависимости от состояния заголовка группы (свёрнут/развёрнут)?

Для этого нужно зарегистрировать в скрипте отчёта пользовательскую функцию, которая будет возвращать состояние заголовка группы

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.Visible := False не скрывает Page1

Устанавливать видимость страницы отчёта Вы можете до начала его формирования, например, в главной процедуре отчёта. В 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;

 

В версии FastReport2 при создании MasterBand'а есть возможность выбрать Virtual DataSet. В FR4 такого пункта нет

Задайте у бэнда свойство RowCount

Как загрузить содержимое тектового файла в TfrxMemoView?
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;

 

Работаю в Delphi 6. Возникает ошибка INVALID VARIANT ...

Для коректной работы FastReport, для Delphi6 требуется Update2.

Как русифицировать пакеты FR ?

Способ 1:
В каталоге Res\russian запустите mk.bat и перекомпилируйте пакеты.
Способ 2:
Запустите утилиту "Recompile Wizard" (recompile.exe), выберите версию IDE и версию FR, выберите "Change language to" и Russsian из выпадающего списка, нажмите "Compile".

Могу я одновременно установить в среде Delphi и использовать FastReport 4 и FastReport 3.* ?

Нет, FastReport 4 использует те же имена классов, что и FastReport 3.

Как правильно устанавливать новые версии (сборки) Fast Report ?

Перед установкой новой версии необходимо полностью удалить предыдущую:
- Выполнить деинсталляцию предыдущей версии;
- Удалить все frx*.dcu , fs*.dcu, frx*.bpl, fs*.bpl, dclfrx*.bpl, dclfs*.bpl из Windows\System32 (если есть) и Borland\Project\BPL;
- Убедится, что предыдущая версия удалена полностью;
- Установить новую версию.

При компиляции проекта получаю ошибку "... Compiled with different Version of fs_interpreter.TfsScript", что это может быть ?

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

 


Как улучшить качество экспортируемой картинки в PDF экспорте ?

Установите свойство TfrxPDFExport.PrintOptimized := True;

В PDF экспорте TfrxRichView экспортируется как картинка , можно ли экспортировать TfrxRichView в PDF как текст ?

Нет.

Требует ли экспорт в RTF, XLS, XML наличия установленных в системе Microsoft Word, Microsoft Excel?

Экспорт в RTF требует наличия установленного в системе Microsoft Word, XLS - Microsoft Excel. Экспорт в XML не требует установки каких-либо приложений.

Почему числа при экспорте в Microsoft Excel экспортируются как строки?

Это происходит в том случае если у TfrxMemoView.DisplayFormat.Kind установлен в fkText. Установите TfrxMemoView.DisplayFormat.Kind в fkNumeric.

Как передать необходимые параметры прямо в отчёт, чтобы интерактивное окно диалога экспорта не появлялось, и экспорт проходил "тихо", без заполнения дополнительных данных, имени файла и т.д.

Установите у фильтра экспорта свойства ShowDialog, ShowProgress в False и заполните DefaultPath и FileName.

В DMP отчёте во всех мемо выбран сжатый шрифт, но отчёт печатается обычным шрифтом. Что делать?

Выберите в диалоге в комбобоксе Esc-команды требуемый тип команд или задайте в коде frxDotMatrixExport1.EscModel:=1; // Epson Generic

Каким образом распечатать DMP отчёт на USB принтере?

Напрямую распечатать 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;

 

В программе шаблоны отчётов загружаются из файлов, расположенных в каталоге \Reports относительно исполняемого файла. Первый раз шаблон загружается нормально, формируется отчёт, и экспортируется в любой из форматов, при повторной загрузке - пустой отчёт

Вы используете относительные пути при загрузке шаблонов отчётов. При экспорте отчёта пользователь сохраняет файл в каталог, отличный от каталога программы. Поэтому шаблон отчёта при повторной загрузке не загружается, т.к. меняется текущий каталог. Во избежание подобной ситуации используйте абсолютные пути при загоузке шаблонов отчёта ExtractFilePath(Application.ExeName)+'Reports\test.fr3'

Пропадает отчёт из предварительного просмотра (TfrxPreview) после экспорта отчёта frxReport1.Export(frxPDFExport1). Что нужно сделать?

Делайте так:

1
2
3
frxPreview1.Lock; 
frxReport1.Export(frxPDFExport1); 
frxPreview1.UnLock;

 или так:

1
frxPreview1.Export(frxPDFExport1);

 

При сохранении отчета в виде pdf текст в виде TfrxRichView смотрится хуже (размытый какой-то, нечеткий) чем, если конвертировать с TfrxMemoView.Нельзя хотя бы качество картинки улучшить?

Видимо это из-за того, что TfrxRichView конвертится, как картинка, а TfrxMemoView - как текст. Установите свойство 

1
TfrxPDFExport.PrintOptimized := True;

 

Подскажите, есть ли возможность сохранить экспортированный в PDF отчет в BLOB-поле баы данных без сохранения его на жестком диске

Установите свойство TfrxPDFExport.Stream

logo
  • +7(800)551-75-80
  • info@fastreport.ru
  • Ростов-на-Дону, Россия, 344082, ул.Обороны 24, офис 311
  • Купить
  • Загрузить
  • Документация
  • Отзывы
  • Как деинсталировать
  • Онлайн поддержка
  • FAQ
  • Видео уроки
  • Форум
  • Статьи
  • Наши Новости
  • Пресса о нас
  • Реселлеры
  • Нестандартное лицензирование
  • ВУЗам
  • Карьера
  • Контакты

© 1998-2022 ООО «Фаст Репортс»

  • Согласие с обработкой персональных данных
  • Не является публичной офертой