Да, для клиентов с действующей подпиской.
Да, его можно найти по ссылке: Положение об оказании технической поддержки
Запросы могут быть отправлены Пользователем с помощью электронной почты на адрес support@fastreport.ru, через форму обращения на сайте из клиентской панели лк.быстрыеотчеты.рф, через онлайн-чат на быстрыеотчеты.рф, либо по телефону +7(800)551-75-80.
Регистрация одной лицензии программного обеспечения дает Вам право на написание и компиляцию Ваших собственных прикладных программ, использующих программное обеспечение, содержащееся в Продукте. Все копии программного обеспечения, которые Вы пишете и распространяете, должны включать указание на авторские права Лицензиара. Больше информации Вы можете найти в лицензионном соглашении.
В основном наши продукты имеют три типа лицензирования: Single License – лицензия на одно рабочее место. На одного разработчика. Team License – 4 рабочих места. Дополнительно включает лицензию для Build сервера. Site License – неограниченное количество рабочих мест, зарегистрированных по одному географическому адресу. Дополнительно включает лицензию для Build сервера.
Вы можете продлить лицензирование в вашей контрольной панели. Продление включает в себя техническую поддержку и обновления продуктов. Она доступна по 1/2 от полной стоимости в год. Когда ваша лицензия истекла, у Вас есть два варианта:
Это позволит Вам получать техническую поддержку и обновления продуктов.
В этом случае, у Вас не будет возможности использовать последние обновления продукта и получать техническую поддержку.
Да, на сервере с Windows если вы используете IDE от Еmbarcadero или если вы используете Lazarus, на сервере с Windows, c Linux (ограничения многопоточности), FastReport VCL, начиная с версии Enterprise, включает в себя набор серверных компонентов.
Начиная с версии FastReport VCL 2023.2 осуществляется поддерживает IDE только, начиная с версии Delphi 2010 и до самых актуальных на данный момент.
Перед запуском отчета надо установить:
TfrxReport.EngineOptions.EnableThreadSafe := True;
TfrxReport.EngineOptions.SilentMode := True;
По умолчанию FR использует глобальный список датасетов который инициализируется в модуле frxClass, при создании экземпляра TfrxDBDataset он добавляется в этот список. В связи с этим невозможно использовать датасеты с одинаковыми именами (даже в разных потоках). Для использования локального списка датасетов нужно использовать следующий код (начиная с версии 4.5.46):
frxReport.EngineOptions.UseGlobalDataSetList := False;
frxReport.EnabledDataSets.Clear();
frxReport.EnabledDataSets.Add(frxDataSet);
frxReport.LoadFromFile(ReportName);
Если в ячейке кросс таблицы используются строковые значения, то нужно отключить агрегатную функцию в редакторе «Кросс - таблицы».
Используйте функцию 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');
Используйте данный код:
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.
Используйте данный код:
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 не поддерживает множества. Нужно делать так:
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;
Добавьте модуль ConverterQR2FR в uses секцию и:
conv := TConverterQr2Fr.Create;
conv.Source := QuickRep1;
conv.Target := FReport;
conv.Convert;
FReport.SaveToFile('converted_fromQR.fr3');
Установите свойство TfrxRichView.Wysiwyg в False.
Перед формированием отчёта добавьте:
frxReport1.EngineOptions.DestroyForms:=False;
Используйте данный код:
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 для каждой кнопки 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;
Используйте код:
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;
Зайдите в дизайнере в меню Вид|Настройки и снимите опцию Использовать шрифт объекта
В дизайнере в меню Вид-Настройки включите опцию "Показывать заголовки бэндов"
Визард создал отчёт с использованием стилей. Вам нужно либо изменить соответствующий стиль, либо очистить стиль объекта
Доступ ко всем полям структуры 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;
Для реализации такой функциональности нужно запретить коннект при загрузке отчёта в событии 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;
Вы можете пересортировать страницы превью после формирования отчёта:
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;
Вы можете пересортировать страницы превью после формирования отчёта:
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:
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 на диалоговой форме:
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:
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. Например, символ "диаметр" можно передать следующим кодом: frxReport1.Script.Variables['test']:= UTF8Decode('⌀');
Используйте код
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);
Для этого нужно зарегистрировать в скрипте отчёта пользовательскую функцию, которая будет возвращать состояние заголовка группы
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;
Задайте у бэнда свойство RowCount.
Да.
Только добавлением страницы с номером страницы. Можно сформировать отчёт, добавить такое же количество страниц с номерами, а затем пересортировать их
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;
ADO, но можно и другие.
Да, internal-датасеты нужно или делать самому или искать реализации.
Только если добавит в модуле конвертора, где условие с TQRLabel свое имя класса.
Скрипт не конвертируется.
Поддержки унаследованных форм пока нет.
Установить Stream.Position := 0;
Совместим, но есть особенности, описаны на 47-й странице руководства.
Ищите абзац, начинающийся с "Альтернативный способ, без использования fsGlobalUnit (для корректной работы в многопоточных приложениях)".