Ja, für Kunden mit einem gültigen Abonnement
Ja, sie ist unter diesem Link zu finden: Richtlinie für die technische Unterstützung
Anfragen können von Benutzern per E-Mail an support@fastreport.ru, über das Kontaktformular auf der Website des Kundenpanels, über den Online-Chat oder per Telefon +7(800)551-75-80 gestellt werden.
Ja, auf vertraglicher Grundlage.
Durch die Registrierung einer Softwarelizenz erhalten Sie das Recht, Ihre eigenen Anwendungsprogramme unter Verwendung der im Produkt enthaltenen Software zu schreiben und zu kompilieren. Alle Kopien der Software, die Sie erstellen und weitergeben, müssen einen Hinweis auf das Urheberrecht des Lizenzgebers enthalten. Weitere Informationen finden Sie in der Lizenzvereinbarung.
Grundsätzlich haben unsere Produkte drei Lizenztypen: Single License ist eine Lizenz für eine Benutzerstation, für einen Entwickler. Team License ist eine Lizenz für 4 Benutzerstationen, enthält zusätzlich eine Lizenz für den Build-Server. Site License ist eine Lizenz für unbegrenzte Anzahl von Benutzerstationen, die geografisch in einem Standort registriert sind, enthält zusätzlich eine Lizenz für den Build-Server.
Sie können Ihre Lizenz in Ihrem Bedienfeld verlängern. Die Verlängerung umfasst den technischen Support und die Produktaktualisierungen. Sie ist zum halben Vollpreis pro Jahr erhältlich. Wenn Ihre Lizenz abgelaufen ist, haben Sie zwei Möglichkeiten: - Verlängerung der Lizenz. Dadurch erhalten Sie weiterhin den technischen Support und die Produktaktualisierungen. – Weitere Verwendung von FastReport VCL. In diesem Fall können Sie die neuesten Produktaktualisierungen nicht nutzen und keinen technischen Support erhalten.
Ja, auf einem Server unter Windows, wenn Sie die IDE von Embarcadero verwenden oder wenn Sie Lazarus verwenden, auf einem Server unter Windows, unter Linux (Multithreading-Einschränkungen), enthält FastReport VCL ab der Enterprise-Version eine Reihe von Serverkomponenten
Mit der Veröffentlichung von FastReport VCL 2023.2 werden IDEs nur ab Delphi 2010 und bis zu den aktuellsten Versionen unterstützt.
Bevor Sie den Bericht ausführen, müssen Sie Folgendes installieren:
TfrxReport.EngineOptions.EnableThreadSafe := True;
TfrxReport.EngineOptions.SilentMode := True;
Standardmäßig verwendet FR eine globale Datensatzliste, die im frxClass-Modul initialisiert wird. Wenn eine Instanz von TfrxDBDDataset erstellt wird, wird sie zu dieser Liste hinzugefügt. Aus diesem Grund ist es nicht möglich, Datensätze mit denselben Namen zu verwenden (auch nicht in verschiedenen Threads).
Um die lokale Datensatzliste zu verwenden, müssen Sie den folgenden Code verwenden (ab Version 4.5.46):
frxReport.EngineOptions.UseGlobalDataSetList := False;
frxReport.EnabledDataSets.Clear();
frxReport.EnabledDataSets.Add(frxDataSet);
frxReport.LoadFromFile(ReportName);
Verwenden Sie im Handler die TfrxMemoView.CalcWidth
Funktion
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;
Erstellen Sie eine Sprachdatei mit dem mkall.bat Dienstprogramm (das sich im Verzeichnis language befindet) und verbinden Sie die Sprache dynamisch:
uses frxRes;
frxResources.LoadFromFile('english.xml');
Verwenden Sie den folgenden Code:
var a: variant;
begin
a := VarArrayOf([1,2,3]);
frxReport1.Script.Variables['a'] := a;
end;
Verwenden Sie den folgenden Code:
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.
Fügen Sie das Modul ConverterRB2FR zum uses Arbeitsbereich hinzu. Zur Laufzeit ist es im Fast Report-Berichtsdesigner möglich, Report Builder-Berichte zu öffnen und sie im Fast Report-Format erneut zu speichern.
Das Fast Report-Skript unterstützt keine Sätze. Sie müssen folgendes machen:
Memo1.Frame.Typ := ftLeft + ftRight + ftTop + ftBottom;
Fügen Sie die TfrxDialogControls-Komponente (TfrxRichObject, TfrxCrossObject, TfrxOLEObject, TfrxBarCodeObject, TfrxCheckBoxObject, TfrxGradientObject, frxChartObject, TfrxADOComponents usw.) aus der Palette der Fast-Report-Komponenten zum Bericht hinzu oder fügen Sie die Module frxDCtrl, frxRich, frxCross, frxOLE, frxBarcode, frxChBox, frxGradient, frxChart, frxADOComponents zum uses-Arbeitsbereich hinzu
Um Ihren Berichtsnamen in den Titel einzufügen, führen Sie Folgendes aus:
frxReport1.ReportOptions.Name := 'Mein Bericht';
Gehen Sie im Designer zum Menü Ansicht|Einstellungen und klicken Sie auf die Schaltfläche Einstellungen wiederherstellen
procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
begin
if MasterData1.DataSet.RecNo = MasterData1.DataSet.RecordCount-1 then Engine.NewPage;
end;
Fügen Sie das Modul ConverterQR2FR zum uses Arbeitsbereich hinzu und:
conv := TConverterQr2Fr.Create;
conv.Source := QuickRep1;
conv.Target := FReport;
conv.Convert;
FReport.SaveToFile('converted_fromQR.fr3');
Setzen Sie die Eigenschaft TfrxRichView.Wysiwyg
auf False.
Bevor Sie einen Bericht erstellen, fügen Sie folgendes hinzu:
frxReport1.EngineOptions.DestroyForms:=False;
Verwenden Sie den folgenden Code:
Rich1.RichEdit.Lines.LoadFromFile()
Verwenden Sie den folgenden Code:
frxReport1.Engine.StopReport;
Wenn Sie die Anzahl der Spalten für eine Seite festlegen, werden die Datensätze von unten nach oben angezeigt, und wenn Sie die Anzahl der Spalten für ein Band festlegen, werden die Datensätze von links nach rechts angezeigt.
Verwenden Sie den folgenden Code: ``` 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 // Hinzufügen einer neuen Schaltfläche Button := TSpeedButton.Create(TfrxPreviewForm(frxReport1.PreviewForm).ToolBar); Button.Parent:=TfrxPreviewForm(frxReport1.PreviewForm).ToolBar; Button.Caption:='My Button'; Button.Width:=60; Button.Left:=650; // Handler der neuen Schaltfläche Button.OnClick:=ButtonClick; end; ``` Sie können einer Standardvorschau auch eine Schaltfläche nicht über das OnPreview-Ereignis, sondern über das OnEndDoc hinzufügen. Diese Option ist in zwei Fällen nützlich: 1) Wenn der Handler dieser Schaltfläche etwas mit den Vorschaudaten macht. In diesem Fall ist es unerwünscht, eine Schaltfläche über das OnPreview zu erstellen, da sie während der Berichtserstellung aktiv ist. 2) Wenn die zusätzliche Schaltfläche in Abhängigkeit von einer Bedingung erscheinen soll, die im Vorschaudialog (frxDialogPage) festgelegt ist.
++++++++++++ Für die Schaltfläche PDF-Export ``` 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. ```
Verwenden Sie den Code ``` 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; ```
Natürlich können Sie das. Sie können ein Bedienfeld mit Schaltflächen erstellen und die folgenden TfrxPreview-Methoden
für jede frxPreview1.Print Schaltfläche verwenden;
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;
Verwenden Sie den Code ``` 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; ```
Ähnlich wie beim Vorschaufenster: ``` 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 // die Schaltflächen ERSCHEINUNGSBILD KOPIEREN und SERVICE TEXT sind ausgeblendet TfrxDesignerForm(Sender).ObjectsTB1.Buttons[i].Visible:=False; TfrxDesignerForm(Sender).DataTree.FunctionsTree.Visible:=False; TfrxDesignerForm(Sender).DataTree.ClassesTree.Visible:=False; end; end; ```
Gehen Sie im Designer in das Menü Ansicht|Einstellungen und deaktivieren Sie die Option Objektschrift verwenden
Aktivieren Sie im Designer im Menü Ansicht-Einstellungen die Option "Bandüberschriften anzeigen"
Der Wizard hat den Bericht mithilfe von Stilen erstellt. Sie müssen entweder den entsprechenden Stil ändern oder den Objektstil löschen
Auf alle Felder der DEVMODE-Struktur kann über das OnPrintPage-Ereignis zugegriffen werden. Um beispielsweise das Feld DM_MEDIATYPE zu ändern, können Sie diesen Code verwenden (gleiches gilt für andere Felder): ``` 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 DMMEDIATYPE; 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(DMMEDIATRANSPARENCY) else if idx = 1 then ChangeMediaType(DMMEDIAGLOSSY) else ChangeMediaType(DMMEDIASTANDARD); inc(idx); end; ```
Um diese Funktion zu implementieren, müssen Sie die Verbindung während des Ladens des Berichts im Ereignis TfrxReport.OnBeforeConnect blockieren ``` 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; ```
Sie können einen Text sowohl in der Vorschau im TfrxReport.OnEndDoc-Ereignis
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; // als auch direkt vor dem Drucken der Seite im TfrxReport.OnPrintPage
Ereignis hinzufügen
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;
Sie können die Vorschauseiten nach der Berichterstellung neu sortieren:
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;
Versuchen Sie,
ADODataBase.Connected=False
zu setzen, bevor Sie die Verbindungsparameter ändern, und stellen Sie dann die Verbindung wieder her
Versuchen Sie einfach, die Breite=0 zu setzen
procedure Cross1OnCalcWidth(ColumnIndex: Integer; ColumnValues: Variant; var Width: Extended);
begin
if ColumnIndex=0 then
Width:=0;
end;
Fügen Sie ein weiteres MasterData2
mit leeren Zellen zum Bericht hinzu und steuern Sie den Wert von MasterData2.RowCount
im Skript im Fußzeilendaten Handler
Fügen Sie dem Bericht ein DetailData-Band
hinzu. Setzen Sie DetailData.RowCount=1
(Dies ist obligatorisch!) Legen Sie im Ereignis MasterData1OnBeforePrint
DetailData.RowCount:=
fest. Platzieren Sie im DetailData-Band ein Memo mit Feldern aus dem mit MasterData
verknüpften Datensatz. Setzen Sie die MasterData
-Höhe auf 0: MasterData.Height=0
Wenn Sie im gegebenen Code auf TfrxRichView klicken, wird dessen Inhalt in Memo1 im Dialogformular kopiert:
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;
Verwenden Sie im Skript die Konstanten fr01cm
(zur Umrechnung von mm in Pixel) und fr1cm
(zur Umrechnung von cm in Pixel)
In 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);
...
Im Script: Code frxRTFExport1.FileName := 'myFilename.rtf';
`
Verwenden Sie den folgenden Code
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);
Dazu müssen Sie im Berichtsskript eine benutzerdefinierte Funktion registrieren, die den Status der Gruppenüberschrift zurückgibt
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;
und im Berichtsskript selbst den Status der Gruppenüberschrift prüfen und den erforderlichen Schriftstil einstellen
procedure GroupHeader1OnBeforePrint(Sender: TfrxComponent);
begin
if CheckDrillState(GroupHeader1.DrillName) <> - 1 then
Memo6.Font.Style := fsBold
else
Memo6.Font.Style := 0;
end;
Verwenden Sie den folgenden Code ``` unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, frxClass, fsitools, fsxml, 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. ```
Sie können die Sichtbarkeit der Berichtsseiten vor dem Beginn der Berichterstellung festlegen, z. B. in der Hauptprozedur des Berichts. Ihr Code wird in Page1.OnBeforePrint
nicht funktionieren.
Erstellen Sie einen Bericht, in dem zu Beginn seiner Ausführung ein Dialogfeld angezeigt wird. Wählen Sie In diesem Dialogfeld eine von zwei Optionen aus: den aktuellen Bericht weiter auszuführen oder daraus einen neuen Bericht aufzurufen. Wenn ein neuer Bericht aufgerufen wird, muss das Vorschauformular des ersten Berichts geschlossen werden. Andernfalls kommt es zum folgenden: Wenn Sie den zweiten Bericht vom ersten Bericht aus aufrufen, funktioniert er und zeigt die Daten an, und wenn Sie das Vorschaufenster des zweiten Berichts schließen, sehen Sie ein leeres Vorschaufenster des ersten Berichts. Als nächstes verwenden Sie eine benutzerdefinierte Funktion in 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;
//im Script:
procedure Button1OnClick(Sender: TfrxComponent);
var rep: TfrxReport;
begin
rep := TfrxReport.Create(Report);
rep.EngineOptions := Report.EngineOptions;
rep.LoadFromFile('TestReport2.fr3');
rep.ShowReport;
CloseReport;
end;
Legen Sie die RowCount
-Eigenschaft des Bandes fest
Ja
Nur durch das Hinzufügen einer Seite mit einer Seitennummer. Sie können einen Bericht erstellen, die gleiche Anzahl von Seiten mit Nummern hinzufügen und sie dann neu sortieren
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, aber Sie können auch andere verwenden
Ja, Sie müssen entweder selbst interne Datensätze erstellen oder nach Implementierungen suchen
Ja, fügen Sie eine Bedingung mit TQRLabel zu Ihrem Klassennamen im Konvertermodul hinzu.
Das Skript wird nicht konvertiert
Es gibt noch keine Unterstützung für geerbte Formulare
Setzen Sie Stream.Position := 0;
Übergeben Sie die Zeichenfolge in UTF8-Kodierung. Beispielsweise kann das Zeichen „Durchmesser“ mit dem folgenden Code übergeben werden:
frxReport1.Script.Variables['test']:= UTF8Decode('⌀');
Kompatibel, es gibt jedoch einige Besonderheiten, die auf Seite 54 beschrieben sind Another way to use TfsScript without fsGlobalUnit (for example, in multi-thread environment) https://www.fastreport.ru/public_download/fs_en.pdf
Wenn in einer Zelle der Kreuztabelle Zeichenkettenwerte verwendet werden, müssen Sie die Aggregatfunktion im Editor "Kreuztabelle" deaktivieren.
Der folgende Handler überschreibt den Handler der Schaltfläche Öffnen ``` 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. ```