Вопросы и ответы
Вопросы по лицензированию .NET решения Delphi и Lazarus решения Online Designer Reporting FMX Analysis VCL МоиОтчеты Облако

Delphi и Lazarus решения

Оказываем мы ли техподдержку FastReport VCL?

Да, для клиентов с действующей подпиской.

У нас есть где-нибудь Положение об оказании технической поддержки?

Да, его можно найти по ссылке: Положение об оказании технической поддержки

Куда можно обратиться за техподдержкой FastReport VCL?

Запросы могут быть отправлены Пользователем с помощью электронной почты на адрес support@fastreport.ru, через форму обращения на сайте из клиентской панели лк.быстрыеотчеты.рф, через онлайн-чат на быстрыеотчеты.рф, либо по телефону +7(800)551-75-80.

Нужно ли прикладывать файл лицензии FastReport VCL к своему разрабатываемому продукту?

Регистрация одной лицензии программного обеспечения дает Вам право на написание и компиляцию Ваших собственных прикладных программ, использующих программное обеспечение, содержащееся в Продукте. Все копии программного обеспечения, которые Вы пишете и распространяете, должны включать указание на авторские права Лицензиара. Больше информации Вы можете найти в лицензионном соглашении.

Пожалуйста, объясните подробно, в чём разница основных типов лицензирования?

В основном наши продукты имеют три типа лицензирования: Single License – лицензия на одно рабочее место. На одного разработчика. Team License – 4 рабочих места. Дополнительно включает лицензию для Build сервера. Site License – неограниченное количество рабочих мест, зарегистрированных по одному географическому адресу. Дополнительно включает лицензию для Build сервера.

Сколько стоит продление лицензирования FastReport VCL? И что я от этого получу?

Вы можете продлить лицензирование в вашей контрольной панели. Продление включает в себя техническую поддержку и обновления продуктов. Она доступна по 1/2 от полной стоимости в год. Когда ваша лицензия истекла, у Вас есть два варианта:

  • Продлить лицензию.

Это позволит Вам получать техническую поддержку и обновления продуктов.

  • Продолжать использовать FastReport VCL.

В этом случае, у Вас не будет возможности использовать последние обновления продукта и получать техническую поддержку.

Возможно ли использовать FastReport VCL на сервере?

Да, на сервере с Windows если вы используете IDE от Еmbarcadero или если вы используете Lazarus, на сервере с Windows, c Linux (ограничения многопоточности), FastReport VCL, начиная с версии Enterprise, включает в себя набор серверных компонентов.

Какие версии IDE поддерживает продукт FastReport VCL?

Начиная с версии FastReport VCL 2023.2 осуществляется поддерживает IDE только, начиная с версии Delphi 2010 и до самых актуальных на данный момент.

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

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

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

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

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

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:
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 (лежит в каталоге с языком) и подключайте язык динамически:

uses frxRes;
frxResources.LoadFromFile('english.xml');

Как вы можете перенести массив переменных из Delphi в FastReport?

Используйте данный код:

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.

Как вы можете закодировать навигацию по набору данных, подключенную к отчету, но не подключенную ни к какому бэнду в скрипте отчета?

Используйте данный код:

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 не поддерживает множества. Нужно делать так:

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

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

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

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

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

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

Каким образом можно поместить последнюю запись из базы данных на отдельной странице?

Используйте следующий код:

procedure MasterData1OnBeforePrint(Sender: TfrxComponent); begin if MasterData1.DataSet.RecNo = MasterData1.DataSet.RecordCount-1 then Engine.NewPage; end;

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

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

conv := TConverterQr2Fr.Create;
conv.Source := QuickRep1;
conv.Target := FReport;
conv.Convert;
FReport.SaveToFile('converted_fromQR.fr3');

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

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

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

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

frxReport1.EngineOptions.DestroyForms:=False;

Каким образом загрузить в скрипте RTF-файл в TfrxRichView?

Используйте данный код:

Rich1.RichEdit.Lines.LoadFromFile()

Как остановить построение отчёта?

Используйте данный код:

frxReport1.Engine.StopReport;

Каким образом выводить колонки не сверху вниз, а слева направо?

Если задать количество столбцов для страницы, то записи будут выводиться снизу вверх, а если задать количество столбцов для бэнда, то слева направо.

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

Используйте данный код:

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 экспорта:

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.

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

Следующий обработчик переопределяет обработчик кнопки "Открыть":

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.

Есть список отчётов. Для предварительного просмотра при выборе отчёта необходимо показывать пользователю только первую страницу отчёта. Как это сделать?

Используйте код:

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;

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?

Используйте код:

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;

Каким образом скрыть кнопку в меню в дизайнере?

По аналогии с окном предварительного просмотра:

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 можно использовать такой код (по аналогии и для остальных полей):

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: 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:

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. На первой странице выводятся данные для лицевой стороны листа, на второй - для обратной. Для печати в дуплексе необходимо выводить поочерёдно лицевую и обратную сторону. Как это можно реализовать?

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

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;

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

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

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:

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 на диалоговой форме:

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:

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. Например, символ "диаметр" можно передать следующим кодом: frxReport1.Script.Variables['test']:= UTF8Decode('⌀');

Как добавить в скрипт функцию SendToBack?

Используйте код

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 в зависимости от состояния заголовка группы (свёрнут/развёрнут)?

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

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;

а в самом скрипте отчёта проверять состояние заголовка группы и устанавливать требуемый стиль шрифта

procedure GroupHeader1OnBeforePrint(Sender: TfrxComponent);
begin
if CheckDrillState(GroupHeader1.DrillName) <> - 1 then
Memo6.Font.Style := fsBold
else
Memo6.Font.Style := 0;
end;

Построение списка функций:

Используйте код

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.

Создал отчет в котором в начале его выполнения появляется диалоговое окно. В диалоге я выбираю одно из двух значений: продолжить выполнение текущего отчета или вызать из него новый отчет. При вызове нового отчета мне нужно закрыть форму предварительного просмотра первого отчета. Иначе получается так: Вызываю из первого отчета второй, он отрабатывает, показывает данные, я закрываю окно пр.просмотра второго отчета дальше вижу пустое окно пр. просмотра первого отчета.

Используйте пользовательскую функцию В Delphi:

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.

Работает ли FastReport с Delphi XE7 для создания 64-разрядного приложения?

Да.

Как я могу печатать номер страницы на обратной стороне каждого листа отчета?

Только добавлением страницы с номером страницы. Можно сформировать отчёт, добавить такое же количество страниц с номерами, а затем пересортировать их

var i, j: integer;
    page : TfrxReportPage;
begin
     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;

Какой драйвер используется для подключения ODBC для SQL сервера?

ADO, но можно и другие.

Использование как с TfrxBDEComponents невозможно и вместо этого всегда должны быть пары TfrxDBDataset и TDataSet?

Да, internal-датасеты нужно или делать самому или искать реализации.

Если у меня есть y собственных QR-компонентов (например, TMyQRLabel, которые изменяют только свойства по умолчанию), которые не конвертируются, есть ли способ преобразовать их так же?

Только если добавит в модуле конвертора, где условие с TQRLabel свое имя класса.

В QR вы можете написать некоторый код в событиях, например, перед печатью для полосы, есть ли способ также передать код при конвертации шаблонов?

Скрипт не конвертируется.

Если отчет QR наследуется от другого QR-отчета, то преобразование завершается неудачей, есть ли способ обойти это?

Поддержки унаследованных форм пока нет.

Как загружать и выгружать из базы данных? При чтении появляется ошибка “invalid format”

Установить Stream.Position := 0;

Совместим ли FastScript с многопоточностью?

Совместим, но есть особенности, описаны на 47-й странице руководства.

Ищите абзац, начинающийся с "Альтернативный способ, без использования fsGlobalUnit (для корректной работы в многопоточных приложениях)".