Да, для клиентов с действующей лицензией.
Регистрация одной лицензии программного обеспечения дает Вам право на написание и компиляцию Ваших собственных прикладных программ, использующих программное обеспечение, содержащееся в Продукте. Все копии программного обеспечения, которые Вы пишете и распространяете, должны включать указание на авторские права Лицензиара. Больше информации Вы можете найти в лицензионном соглашении.
В основном наши продукты имеют три типа лицензирования: Single License – лицензия на одно рабочее место. На одного разработчика. Team License – 4 рабочих места. Дополнительно включает лицензию для Build сервера. Site License – неограниченное количество рабочих мест, зарегистрированных по одному географическому адресу. Дополнительно включает лицензию для Build сервера.
Вы можете продлить лицензирование в вашей контрольной панели. Продление включает в себя техническую поддержку и обновления продуктов. Она доступна по 1/2 от полной стоимости в год. Когда ваша лицензия истекла, у Вас есть два варианта: - Продлить лицензию. Это позволит Вам получать техническую поддержку и обновления продуктов. - Продолжать использовать FastReport VCL. В этом случае, у Вас не будет возможности использовать последние обновления продукта и получать техническую поддержку.
Да, наша команда старается осуществлять поддержку актуальных версий Lazarus для Windows, для версий Linux иногда встречаются ограничения, а версию для macOS, мы на данном этапе не поддерживаем.
Продукт FastReport VCL на данном этапе не имеет официальной поддержки фреймворком CrossVCL
Да наш продукт совместим с фреймворком UniGUI.
Поддержка есть в версии для Lazarus.
Нет, поддержки macOS нет, используйте FastReport FMX
Да, на сервере с 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 и пересохранить в формате FastReport VCL.
Скрипт Fast Report не поддерживает множества. Нужно делать так:
Memo1.Frame.Typ := ftLeft + ftRight + ftTop + ftBottom;
Чтобы в заголовок вставить свое наименование отчета, выполните:
frxReport1.ReportOptions.Name := 'Мой отчёт';
Зайдите в дизайнере в меню Вид|Настройки и нажмите кнопку Восстановить настройки.
Используйте событие OnBeforePrint
:
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;
Попробуйте установить 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
Каким образом можно получить доступ к 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;
Используйте в скрипте константы 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('Гё');
Используйте код
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;
Используйте код
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.
Устанавливать видимость страницы отчёта Вы можете до начала его формирования, например, в главной процедуре отчёта. В Page1.OnBeforePrint Ваш код не сработает.
Создал отчет в котором вначале его выполнения появляется диалоговое окно. В диалоге я выбираю одно из двух значений: продолжить выполнение текущего отчета или вызать из него новый отчет. При вызове нового отчета мне нужно закрыть форму предварительного просмотра первого отчета. Иначе получается так: Вызываю из первого отчета второй, он отрабатывает, показывает данные, я закрываю окно пр.просмотра второго отчета дальше вижу пустое окно пр. просмотра первого отчета. Используйте пользовательскую функцию В 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.
procedure Memo1OnBeforePrint(Sender: TfrxComponent);
var S: TStringList;
begin
S:=TStringList.Create;
S.LoadFromFile('C:\test.txt');
Memo1.AnsiText:=S.Text;
S.Free;
end;
Начиная с версии FastReport VCL 2023.2 осуществляется поддерживает IDE только, начиная с версии Delphi 2010 и до самых актуальных на данный момент.
Да.
Только добавлением страницы с номером страницы. Можно сформировать отчёт, добавить такое же количество страниц с номерами, а затем пересортировать их
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;