Reporting VCL

A set of VCL components with full source codes for creating reports and documents

v. 2025.2.0
What reports can Reporting VCL do

What reports can Reporting VCL do?

Practically any: invoices, financial reports, product catalogs with color profile support, restaurant menus, sales details, questionnaires with electronic forms, airline tickets, utility bills, and much more. If you have data that needs to be made visually understandable, FastReport is the perfect solution for you.

Features und Vorzüge Reporting VCL

Lots of components
A variety of elements are available for building reports in the designer: from text and images to mathematical formulas and 3D diagrams.
Quick access to the report and data structure
From the report tree and properties tree, you can edit the report structure, parameters, and filters, as well as data sources with global styles.
Compatibility and integration
Reporting VCL is part of the unified FastReport ecosystem on Delphi. Reports created in the Lazarus solution will work in the Reporting VCL and vice versa.
Smooth transition from other solutions
Our report generator instantly converts your reports from Quick Report, Report Builder, and Rave Reports in FastReport format.
Flexible and open architecture
If FastReport's functionality is not enough for you, you can improve it by creating and connecting your objects (export filters, databases) to your reports.
System.Drawing (GDI)
The familiar System.Drawing with GDI graphics functions is used to create graphical elements, render text, and manage graphic images.
The template designer in your application

The template designer in your application

The modern editor offers many tools for creating report templates. The flexible architecture allows you to create editors for existing and new objects. The template designer can be integrated into your application. We support localization for more than 30 languages.

Reporting VCL is a band—oriented report generator with a rich set of bands for creating various types of reports. You can collect common elements (title, basement, business details, logos) into a basic report and inherit them for other reports. The function of nested reports is supported.

Data processing

Data processing

Reporting VCL supports data sorting and filtering, master-detail relationships. Everything is set up with a few mouse clicks. It is possible to connect to FireDAC, ADO, BDE, DBX, IBX and FIBPlus to access most databases, including Oracle.

The report can contain data from tables, queries, and database connections. Reporting VCL has a scripting engine that supports PascalScript, C++ Script, BasicScript, and JScript. Reports can include dialog forms for requesting parameters before building. Dialog controls allow you to connect data and filter it without writing code.

Exports to convenient formats

Exports to convenient formats

Filters for exporting the finished report to many formats: PDF, RTF, XLSX, XML, DOCX, TXT, CSV, Excel OLE, PowerPoint, HTML, MHT, XPS, JPEG, BMP, PNG, Open Document Format (ODT, ODS, ODP), XAML, Scalable Vector Graphics (SVG), ZPL, etc.

Reporting VCL allows you to quickly convert reports with editable fields (such as text fields, combo boxes, checkboxes, radio buttons, and graphics fields) into PDF documents without connecting additional libraries. Save your reports in popular formats: PDF 1.4-1.7, PDF/A-1a, PDF/A-1b, PDF/A-2a, PDF/A-2b, PDF/A-3a, PDF/A-3b, which are secure, accessible, and reliable.

Ultimate VCL

This set of components is part of the Ultimate solution, with which you can create your business projects on all familiar VCL, Lazarus, and FMX platforms. Additionally, the package includes FastScript for fast processing of scripts of any complexity, as well as the visual SQL query builder FastQueryBuilder. In addition, you will have access to client-server reporting tools on VCL and Lazarus.

Preview and print

Preview and print

The pre-prepared report can be examined in detail in the Report Viewer's preview window. Our component supports working with parameters, multi-level detailing, and interactive reports.

You can define a response to a mouse click on an object in the preview window. For example, you can build and display another report that shows detailed information about the object the user clicked on.

Printing reports

Additional printing settings

The following options are available for you: cutting large report pages into small ones, printing several small pages on one large one, and printing in a preset format with scaling.

Do you need to print a report containing A3 pages on a regular A4 printer? Now it's not a problem!

Lieferoptionen

Features
ab 1.299 €
ab 899 €
ab 499 €
FastReport Engine
VCL-Komponenten
FMX Komponenten
Lazarus Komponenten
OLAP-Funktionen
OLAP-Aggregationsfunktionen
Datenverbindungen
Berichterstellungsfunktionen
Berichtsobjekte
Barcodes
Diagrammtypen
Druckfunktionen
Exportformate
Quellcode
Konverter von
Datenübertragungswege (Transports)

Neueste Artikel

22. April 2025

Umgang mit XML- und JSON-Formaten in FastScript

XML und JSON sind inzwischen zu den wichtigsten Standards für die Datenspeicherung und den Informationsaustausch zwischen Computersystemen geworden. Als Reaktion auf Benutzeranfragen wurden Klassen für die Arbeit mit XML und JSON zu FastScript hinzugefügt. In diesem Artikel sehen wir uns genauer an, wie man mit diesen Klassen arbeitet, über welche Eigenschaften und Methoden sie verfügen und wie man Berichte aus Skriptcode erstellt.     XML-Format In Skripten werden 2 Klassen verwendet, um mit XML zu arbeiten. Diese Klassen sind auf maximale Leistung und geringen Speicherverbrauch ausgerichtet.   TfrXMLDocument – ist eine Klasse, die die Funktionalität eines XML-Dokuments kapselt. Die folgenden Eigenschaften und Methoden sind in dieser Klasse verfügbar. Eigenschaften und Methoden der Klasse Beschreibung procedure SaveToStream(Stream: TStream); speichert XML im übergebenen Stream procedure LoadFromStream(Stream: TStream; AllowPartialLoading: Boolean = False); lädt XML aus dem übergebenen Stream hoch procedure SaveToFile(const FileName: string); speichert XML in einer Datei mit dem angegebenen Namen procedure LoadFromFile(const FileName: string); lädt XML aus einer Datei mit dem angegebenen Namen hoch procedure Clear; Entfernt alle XML-Knoten aus dem Baum außer dem Stammknoten. Der Inhalt des Knotens wird NICHT geleert. property Root: TfrXMLItem; ermöglicht den Zugriff auf das Stammelement des Baums property AsText: string; ermöglicht, XML als Zeichenkette abzurufen und festzulegen (mit dieser Eigenschaft können Sie beispielsweise XML mithilfe einer Berichtsvariablen an ein Berichtsskript übergeben) property AutoIndent: Boolean; legt fest, wie die XML-Ausgabe generiert werden soll: als einzelne Zeile oder als eingerückter Text   TfrXMLNode – a class that encapsulates the properties of an XML document node. You cannot create an object of this type directly. It is created by calling the Add() method of the element to which you want to add a child element. Let’s take a closer look at the properties and methods of the TfrXMLNode class. Eigenschaften und Methoden der Klasse Beschreibung function Add(AName:string):TfrXMLItem; erstellt ein untergeordnetes TfrXMLItem Element mit dem angegebenen Namen und gibt es zurück procedure Clear; löscht die Liste der untergeordneten Elemente procedure InsertItem(Index:integer; AItem: TfrXMLItem); fügt ein untergeordnetes Element an der angegebenen Position ein; das Element kann zu einem anderen Dokument gehören function Find(AName:string):Integer; sucht unter den untergeordneten Elementen ein TfrXMLItem mit dem angegebenen Namen und gibt es zurück. Wenn das Element nicht gefunden wird, wird -1 zurückgegeben. Wenn es mehrere Elemente mit dem angegebenen Namen gibt, wird das erste von ihnen zurückgegeben function FindItem(AName:string):TfrXMLItem; sucht unter den untergeordneten Elementen ein TfrXMLItem mit dem angegebenen Namen und gibt es zurück. Wenn das Element nicht gefunden wird, wird ein neues Element mit dem angegebenen Namen erstellt und zurückgegeben. Wenn es mehrere Elemente mit dem angegebenen Namen gibt, wird das erste von ihnen zurückgegeben. function Root: TfrXMLItem; gibt das Stammelement des Dokuments zurück property Count:Integer; Gibt die Anzahl der untergeordneten Knoten des Elements zurück property Items[AIndex:Integer]: TfrXMLItem; gibt ein untergeordnetes Element anhand seines Indexes zurück property Prop[AName:string]:string; gibt den Wert des Knotenattributs mit dem angegebenen Namen zurück oder legt ihn fest  property Name: string; Name des Element-Tags property Parent: TfrXMLItem; Name des übergeordneten Elements. Bei Root ist es gleich nil property Text:string; Eine Zeichenkette mit einer Liste von Knotenparametern in der folgenden Form: Name1=”Value1” Name2=”Value2”… Sonderzeichen sind in dieser Zeichenkette Escapezeichen. procedure Delete(AIndex: Integer); löscht das untergeordnete Element mit dem AIndex-Index  procedure DeleteProp(const APropName: string); löscht ein Knotenattribut mit dem angegebenen Namen property Value: string; Text, der zwischen dem öffnenden und dem schließenden Tag des Elements steht function PropExists(APropName:string):Boolean; hilft festzustellen, ob ein Element ein Attribut mit dem angegebenen Namen hat function IndexOf(AItem: TfrXMLItem):Integer; gibt den Index des übergebenen Elements zurück function GetPropNames(ANames:TStrings); Füllt die übergebene Zeichenkettenliste mit TfrXMLItem-Attributnamen   Versuchen wir, einen Bericht mithilfe von Klassen für das Arbeiten mit XML zu erstellen. Als Beispiel werden wir Daten aus der Datei „country.xml“ in einem Bericht anzeigen, dabei jedoch nicht TClientDataSet verwenden, sondern auf die XML-Datei direkt zugreifen. Erstellen Sie einen neuen Bericht, wechseln Sie in den Bearbeitungsmodus und fügen Sie MasterData in den Bericht ein. Und obendrauf fügen Sie mehrere Memos hinzu, um die Daten anzuzeigen. Erstellen Sie außerdem das OnBeforePrint Ereignis für das MasterData-Objekt.  Der endgültige Code des Berichtsskripts sieht wie folgt aus: var doc: TfrXMLDocument; item: TfrXMLItem; IIndex: Integer;   procedure MasterData1OnBeforePrint(Sender: TfrxComponent); var cur: TfrXMLItem; S: string; begin cur := item[IIndex]; mmNum.Text := cur.Prop['Code']; mmName.Text := cur.Prop['Name']; mmCapital.Text := cur.Prop['Capital']; mmArea.Text := cur.Prop['Area']; mmPopulation.Text := cur.Prop['Population']; mmContinent.Text := cur.Prop['Continent']; Inc(IIndex); end;   begin Doc := TfrXMLDocument.Create; Doc.LoadFromFile('..\..\Data\country.xml'); item := Doc.Root[1]; IIndex := 0; MasterData1.RowCount := item.count; end. Führen Sie den Bericht aus. Zur besseren Lesbarkeit haben wir auch Spaltenüberschriften hinzugefügt.     JSON Format Wechseln wir vom XML-Format zu JSON-Format. FastReport verwendet auch 2 Klassen um mit JSON zu arbeiten. Das sind TfrJSON und TfrJSONArray. In diesem Fall sind diese Klassen nur ein Wrapper um Klassen von System.JSON in der Delphi Plattform oder ähnliche Klassen in Lazarus.   TfrJSONObject ist eine Klasse, die Funktionen für die Arbeit mit JSON-Objekten kapselt.  Eigenschaften und Methoden der Klasse Beschreibung function Create(const JSONstring: string); erzeugt ein JSON-Objekt und füllt es mit der übergebenen Zeichenkette function IsValid:Boolean; gibt True zurück, wenn das Objekt gültiges JSON enthält procedure LodFromFile(const AFilName:string); lädt Daten aus der angegebenen Datei. Wenn das Objekt Daten enthält, gehen diese verloren procedure LoadFromtStream(const AStream:TStream); lädt Daten aus dem übergebenen Stream. Wenn das Objekt Daten enthält, gehen diese verloren function ToString:string;   gibt eine Zeichenkette zurück, die die alphabetische Darstellung des JSON-Objekts enthält procedure SaveToFile(const AFileName: string); speichert die alphabetische Darstellung eines JSON-Objekts in einer Datei procedure SaveToStream(AStream: TStream speichert die alphabetische Darstellung eines JSON-Objekts in einem Stream function IsNameExists(const AName:string); gibt True zurück, wenn das Objekt eine Eigenschaft mit dem angegebenen Namen hat function IsNameValueExists(const Name, Value: string): boolean; gibt True zurück, wenn das Objekt eine Eigenschaft mit dem angegebenen Namen hat und ihr Wert mit dem angegebenen Wert übereinstimmt function Count:Integer; gibt die Gesamtzahl der Eigenschaften eines JSON-Objekts zurück property Names[AIndex:Integer]:string; gibt den Namen der Eigenschaft mit dem angegebenen Index zurück Property ValueType[IndexOrName:Variant]:TfrJSONType; gibt den Typ der Eigenschaft mit dem angegebenen Index oder Namen zurück. Der Typ kann einer der folgenden Werte sein: – jsUnknown – der Eigenschaftstyp ist unbekannt (es ist ein Parsing-Fehler aufgetreten oder es gibt keine Eigenschaft mit diesem Index oder Namen).– jsNumber – die Eigenschaft ist vom numerischen Typ.– jsString – die Eigenschaft ist vom Zeichenkettentyp.– jsBoolean – die Eigenschaft ist vom Booleschen Typ (true/false).– jsNull – der Eigenschaftstyp ist null (der Wert ist nicht festgelegt).– jsList – der Eigenschaftentyp ist ein JSON-Array.– jsObject – der Eigenschaftstyp ist ein verschachteltes JSON-Objekt. Mit den folgenden Eigenschaften können Sie die Werte eines JSON-Objekts in der einen oder anderen Form abrufen. Bei allen diesen Eigenschaften erfolgt die Indizierung entweder über die Eigenschaftsnummer in der Eigenschaftsliste oder über ihren Namen. Beachten Sie, dass AsString[‘1’] <> AsString[1] nicht gleich sind. Auch wenn Sie versuchen, den Eigenschaftswert mit einer ungeeigneten Methode abzurufen, können Fehler auftreten und falsche Eigenschaftswerte zurückgegeben werden. Wenn eine Eigenschaft beispielsweise vom Typ „Objekt“ oder „Array“ ist und Sie versuchen, ihren Wert mithilfe der Eigenschaft „AsString“ abzurufen, erhalten Sie eine leere Zeichenkette zurück. In anderen Fällen gibt AsString eine Zeichenkettendarstellung des Eigenschaftswerts zurück. Eigenschaften und Methoden der Klasse Beschreibung property AsObject[IndexOrName: Variant]: TfrxJSON; ermöglicht es, ein verschachteltes JSON-Objekt abzurufen property AsArray[IndexOrName: Variant]: TfrJSONArray; ermöglicht es, ein verschachteltes JSON-Array abzurufen Property AsString[IndexOrName: Variant]: string; ermöglicht es, den Eigenschaftswert als Zeichenkette anzurufen. Diese Methode kann auf Eigenschaften von anderen Typen als Objekten und Arrays angewendet werden. Für logische Werte wird eine Zeichenkette mit dem Wert „True“ oder „False“ zurückgegeben. Bei Zahlen mit einem Bruchteil wird unabhängig von den regionalen Einstellungen immer ein Punkt als Dezimaltrennzeichen verwendet. property AsNumber[IndexOrName: Variant]: Extended; ermöglicht es, den Eigenschaftswert als Zahl abzurufen. Wenn die Eigenschaft nicht numerisch ist, wird 0 zurückgegeben property AsBoolean[IndexOrName: Variant]: Boolean; ermöglicht es, den Eigenschaftswert als Booleschen Wert abzurufen. Wenn die Eigenschaft von einem anderen Typ ist, wird False zurückgegeben.  Um ein Nullfeld zurückzugeben, müssen Sie sich etwas mehr Mühe geben. Im Allgemeinen gibt es keine solche Methode. Sie können jedoch die ValueType-Eigenschaft verwenden, die für ein Nullfeld jsNull zurückgibt, oder die AsString-Eigenschaft verwenden, die die Zeichenkette „null“ zurückgibt. Betrachten wir näher die Methoden zur Behandlung von Objekteigenschaften. Methoden der Klasse Beschreibung Procedure Delete(AName: String);   löscht die Eigenschaft des Objekts mit dem angegebenen Namen function AddObject(const AName: string): Integer fügt dem Objekt ein leeres untergeordnetes Objekt mit dem angegebenen Namen hinzu function AddArray(const AName: string): Integer; fügt dem Objekt ein leeres Array mit dem angegebenen Namen hinzu function AddString(const AName, AValue: string): Integer; fügt dem Objekt eine Zeichenkette mit dem angegebenen Namen hinzu function AddBool(const AName: string; AValue: boolean): Integer; fügt dem Objekt einen booleschen Wert mit dem angegebenen Namen hinzu function AddNumber(const AName: string; AValue:Extended): Integer; fügt dem Objekt einen numerischen reelen Wert mit dem angegebenen Namen hinzu function AddInteger(const AName: string; AValue:Integer): Integer; fügt dem Objekt einen numerischen Ganzzahlwert mit dem angegebenen Namen hinzu function AddNull(const AName: string): Integer; Fügt dem Objekt einen Nullwert mit dem angegebenen Namen hinzu Die Methoden geben eine Ganzzahl zurück, die den Index des hinzugefügten Elements in der Liste aller Felder darstellt. Alle Methoden, die einem Objekt Felder hinzufügen, überwachen nicht, ob bereits Felder mit gleichem Namen vorhanden sind. Die Verantwortung dafür liegt beim Programmierer, der diese Klasse verwendet. Diese Überwachung ist notwendig, um zu verhindern, dass mehrere Felder mit denselben Namen in der JSON-Ausgabe erscheinen. Das Verhalten des Systems in diesem Fall ist nicht definiert - es hängt vom Parser ab, der das empfangene JSON weiter parst. Das bedeutet, dass jeder beliebige Wert mit demselben Namen in der Arbeit erscheinen kann!  Die Klasse TJSONArray kapselt Methoden und Eigenschaften für die Arbeit mit JSON-Arrays. Die Grundeigenschaften sind grundsätzlich gleich, aber auf sie kann nur per Index zugegriffen werden. Es werden nur Operationen unterstützt, die auf ein beliebiges Element zugreifen, seinen Wert abfragen oder ein Element löschen. Es ist nicht möglich, Elemente im Array zu verschieben oder ihren Typ zu ändern. Betrachten wir die Eigenschaften und Methoden zum Abrufen der Werte von Elementen in dieser Klasse. Eigenschaften und Methoden der Klasse Beschreibung function Count:Integer; gibt die Anzahl der Elemente in einem Array zurück property ValueType[AIndex: Integer]: TfrJSONType; gibt den Typ des Array-Elements mit dem angegebenen Index zurück property AsObject[AIndex: Integer]: TfrJSONObject; gibt ein Objekt zurück, das den Zugriff auf ein Array-Element als JSON-Objekt ermöglicht Property AsArray[AIndex: Integer]: TfrJSONArray gibt ein Objekt zurück, das den Zugriff auf ein Array-Element als JSON-Array ermöglicht property AsString[AIndex: Integer]: string; gibt den Wert eines Array-Elements als Zeichenkette zurück property AsNumber[AIndex: Integer]: Extended; gibt den Wert eines Array-Elements als Zahl zurück property AsBoolean[AIndex: Integer]: Boolean; gibt den Wert eines Array-Elements als booleschen Wert zurück Wie bei einem Objekt sollten Sie beim Abrufen von Werten von Array-Elementen vorsichtig sein. Je nach dem Wert-Typ sollten Sie die entsprechende Methode verwenden, um ihn abzurufen. Nachfolgend werden Methoden zum Bearbeiten von Elementen eines JSON-Arrays beschrieben. Eigenschaften und Methoden der Klasse Beschreibung procedure Delete(AIndex:Integer); lLöscht ein Array-Element mit einem angegebenen Index function AddObject: Integer; fügt ein verschachteltes JSON-Objekt am Ende des Arrays hinzu function AddArray: Integer; fügt ein verschachteltes JSON- Array am Ende des Arrays hinzu function AddString(const AValue: string): Integer; fügt eine Zeichenkette am Ende des Arrays hinzu function AddBool(AValue: boolean): Integer; fügt einen booleschen Wert am Ende des Arrays hinzu function AddNumber(AValue:Extended): Integer; fügt eine reelle Zahl am Ende des Arrays hinzu function AddInteger(AValue: Integer): Integer; fügt eine Ganzzahl am Ende des Arrays hinzu function AddNull: Integer; fügt Null am Ende des Arrays hinzu Alle diese Methoden geben die Position des zum Array hinzugefügten Elements zurück. Sie können kein Element in die Mitte eines Arrays einfügen – dies ist eine Einschränkung der Basisklassen in System.JSON.     Besonderheiten der Verwendung von Klassen für den JSON-Zugriff  Bei der Verwendung von Objekten ist zu beachten, dass alle Wrapper-Objekten nach ihrer Verwendung aus dem Code entfernt werden müssen.  Bitte beachten Sie, wenn Sie ein untergeordnetes Objekt oder Array abrufen möchten und stattdessen ein Skalarwert oder überhaupt kein Wert vorhanden ist, gibt die Eigenschaft „nil“ zurück und der weitere Zugriff auf eine solche Eigenschaft führt zu einer Ausnahme. Sie sollten keine Methoden verwenden, die nicht für die Arbeit mit Werten bestimmter Typen ausgelegt sind, die in einem Element gespeichert sind, um diese Werte abzurufen.  Beachten Sie auch, dass bei den Namen der Objekteigenschaften zwischen Groß- und Kleinschreibung unterschieden wird, d.h., „Item1“ und „item1“ sind unterschiedliche Namen! Sie können den Objektelementen nur dann Werte zuweisen, wenn der Typ dieser Werte mit dem Typ übereinstimmt, der dem Element zugewiesen ist. Wenn Sie einen Elementtyp neu definieren müssen, löschen Sie dieses Element und fügen Sie ein neues Element mit demselben Namen und dem erforderlichen Typ hinzu. Es ist nicht möglich, neue Werte für Array-Elemente einzugeben. Sie müssen ein JSON-Array löschen und es dann mit den gewünschten Werten neu erstellen. Verwenden wir die oben beschriebenen Klassen und schreiben ein Skript, das Daten (ohne Typinformationen) aus einer XML-Datei extrahiert und in ein JSON-Objekt einfügt. procedure XMLToJSON; var XML: TfrXMLDocument; xi, xi1: TfrXMLItem; I, J: Integer; JO: TfrJSONObject; JA, JA1: TfrJSONArray; SL: TStringList; begin XML:=TfrXMLDocument.Create; XML.LoadFromFile('.\..\..\data\country.xml'); JO:=TfrJSONObject.Create('{}'); JO.AddArray('data'); JA:=JO.AsArray['data']; xi:=X.Root[1]; xi1:=xi.Items[0]; SL:=TStringList.Create; xi1.GetParamNames(SL); for I:=0 to xi.Count - 1 do begin xi1:=xi.Items[I]; JA1:=JA.AsArray[JA.AddArray]; for J:=0 to SL.Count-1 do JA1.AddString(xi1.Prop[SL[J]]); JA1.Free; end; JA.Free; JO.SaveToFile('.\..\..\data\country.json'); JO.Free; SL.Free; end; Versuchen wir nun, einen Bericht auf der Grundlage der erhaltenen Daten zu erstellen (fügen Sie die entsprechenden Komponenten MasterData und Memo auf der Berichtsseite ein): var J:TfrJSONObject; A:TfrJSONArray; curr:Integer;   procedure MasterData1OnBeforePrint(Sender: TfrxComponent); var A1:TfrJSONArray; begin A1:=A.AsArray(curr); Memo1.Memo.Text:=A1.AsString[0]; Memo2.Memo.Text:=A1.AsString[1]; Memo3.Memo.Text:=A1.AsString[2]; Memo4.Memo.Text:=A1.AsString[3]; Memo5.Memo.Text:=A1.AsString[4]; Memo6.Memo.Text:=A1.AsString[5]; A1.Free; curr := curr + 1; end;   begin J:=TfrJSONObject.Create(''); J.LoadFromFile('.\..\..\data\country.json'); A:=J.AsArray[0]; MasterData1.RowCount:=A.Count; curr:=0; end.   Sie können diese Objekte auch im Delphi-Code verwenden - verbinden Sie einfach die frXML- und frJSON-Module in der uses-Anweisung.      Schlussfolgerung In diesem Artikel haben wir die Verwendung von Klassen für die Arbeit mit JSON und XML in FastReport betrachtet. Wenn Sie sowohl in Delphi als auch in Lazarus nicht nur Berichte entwickeln, wird die Verwendung dieser Klassen Probleme reduzieren, wenn Sie von einer Umgebung zur anderen wechseln. In beiden IDEs ist das Verhalten gleich.  Zu Ihrem Komfort haben wir zwei Beispiele beigefügt, die die Erstellung von XML- und JSON-basierten Berichten veranschaulichen. Sie können sie sofort in FastReportDemo öffnen und ausführen, das im Lieferumfang von FastReport enthalten ist. Möglicherweise müssen Sie die Berichte vor dem Start konfigurieren – geben Sie den richtigen Pfad zur Datendatei „country.xml“ an. Sie befindet sich sowohl im DemoCenter als auch im Ordner mit den Beispielen.  Beispiele herunterladen
Weiterlesen
22. April 2025

Umgang mit der TfrShellTreeView-Komponente in FastReport VCL

Nicht jeder weiß, dass FastReport nicht nur Berichtskomponenten, sondern noch viel weitere Komponenten enthält. Insbesondere gibt es mehrere Komponenten, die Sie wie andere Delphi-Komponenten in Ihren Anwendungen verwenden können. Die Bibliothek solcher Komponenten wird ständig erweitert. In diesem Artikel betrachten wir eine dieser Komponenten, nämlich die TfrShellTreeView.  Diese Komponente dient zur Anzeige von Elementen des Dateisystems und ist teilweise analog zu Komponenten wie TDirectoryListBox, TDirectoryOutline in Delphi und TShellTreeView in Lazarus. Wenn Sie sehen möchten, wie sie aussieht, ohne die IDE auszuführen, ist dies der „Baum“, den Sie links im Explorer-Fenster sehen.   Die Komponente funktioniert auf Windows- und Linux-Betriebssystemen für Delphi und Lazarus problemlos. Die FMX Entwicklungsumgebung wird nicht unterstützt.  Die TfrShellTreeView-Komponente verwendet viele Betriebssystemfunktionen. Zum Beispiel können Sie unter Windows auf Zip-Archive als Ordner zugreifen und sogar deren Inhalt bearbeiten: Dateien extrahieren und hinzufügen. Unter Linux sind einige der Funktionen der Komponente je nach installierter Linux-Version möglicherweise nicht verfügbar. Wichtiger Hinweis: Die Anzeige der Baumstruktur und die Auswahl von Elementen darin sind unter jedem Betriebssystem verfügbar. Die Haupteigenschaft von TfrShellTreeView, die die Interaktion mit dem Betriebssystem steuert, ist die OptionsShell.   ContextMenu – diese Eigenschaft gibt an, ob das Systemkontextmenü für die ausgewählte Datei angezeigt werden soll. ShowFolder – diese Eigenschaft ist für die Anzeige von Ordnern zuständig. ShowHidden – diese Eigenschaft gibt an, ob versteckte Dateien sichtbar sind oder nicht. ShowNonFolders – Diese Eigenschaft ist für die Anzeige von normalen Dateien (nicht von Ordnern) zuständig. TrackShellChanges – Diese Eigenschaft ist dafür zuständig, auf Änderungen im Dateisystem zu reagieren. Wenn ein Ordner in der Komponente geöffnet ist, so wird bei einer Änderung (z. B. beim Kopieren einer Datei dorthin) automatisch auch ein Knoten, der auf diese Datei verweist, zur Komponente hinzugefügt. TfrShellTreeView unterstützt eine Reihe von Hotkeys, die typisch für einen Standard-Dateidialog oder den Explorer in Windows sind (Ctrl+С, Ctrl+V, Delete usw.). Die TfrShellTreeView-Komponente unterstützt auch Drag&Drop von Dateisystemelementen sowohl intern als auch von anderen (aber nicht allen) Dateimanagern. Die OptionsBehavior.AllowDragDrop Eigenschaft wird verwendet, um Drag&Drop-Operationen zu erlauben. Drag&Drop wird mit Funktionen des Betriebssystems durchgeführt. Andere Eigenschaften sind denen der Komponenten TTreeView und TfrTreeView ähnlich. Es ist jedoch zu beachten, dass sie je nach Art der Verwendung in Gruppen eingeteilt sind: OptionsBehavior, OptionsSelection, OptionsShell, OptionsView. So können Sie die benötigten Eigenschaften schneller finden. Wie bereits erwähnt, ist die Komponente dafür ausgelegt, das Dateisystem Ihres Computers anzuzeigen. Standardmäßig ist die Komponente so konfiguriert, dass sie den Stammordner Ihres Systems anzeigt: „Desktop“ unter Windows oder „/“ unter Linux. Die Fähigkeiten der Komponente sind jedoch nicht darauf beschränkt.  Fügen Sie die TfrShellTreeView-Komponente ins Formular ein und öffnen Sie den Editor:   Der TfrShellTreeView ähnelt sich im Aussehen den Editoren der TTreeView und TfrTreeView Komponenten, verfügt jedoch über zwei neue Schaltflächen:  New shell Root Item. New shell Root SubItem. Wie wir auf dem Editor-Bildschirm sehen können, kann die Komponente Folgendes enthalten: Normale Knoten, die nur Texte enthalten, wie z.B. „New simple item 1“.  Knoten mit einem Ort im Dateisystem, wie z.B. „Dieser Computer“, „Lazarus“, „Daten“. Diese Knoten werden als Shell-Knoten bezeichnet.  Normale und untergeordnete Knoten werden auf die gleiche Weise wie in normalen TreeViews erstellt und bearbeitet.  Knoten, die einen Verweis auf ein Dateistrukturelement haben, werden mit der Schaltfläche „New shell Root Item“ erstellt. Dadurch wird ein Shell-Knoten der gleichen Ebene wie der aktuelle Knoten erstellt. Wenn Sie auf „New shell Root SubItem“ klicken, wird ein untergeordneter Shell-Knoten in Bezug auf den aktuellen Knoten erstellt.  Bitte beachten Sie, dass ein Shell-Knoten keine untergeordneten Knoten erstellen kann, ein normaler Knoten jedoch schon.  Beim Bearbeiten von Shell-Knoten muss angegeben werden, an welchen Ordner der Knoten gebunden ist. Die Bindung an einen Ordner kann über TfrRootNodes Konstanten festgelegt werden. Diese Konstanten definieren Orte wie den Desktop, automatisches Laden usw. Wenn Sie die rfCustomPath Konstante festlegen, können Sie im folgenden Verzeichnisbaum einen Pfad zu einem Dateisystemordner hinzufügen. Sie können diesen Pfad auch über das Bearbeitungsfenster unterhalb des Verzeichnisbaums festlegen. Zum Beispiel ist im untenstehenden Bildschirm der Pfad zum Lazarus Ordner auf dem Laufwerk C:\ festgelegt.    Wie bei einer normalen TreeView-Komponente können Sie den regulären Komponentenknoten Symbole zuweisen. Den Shell-Knoten können keine Symbole zugewiesen werden, sie verwenden die im Betriebssystem festgelegten Symbole. Für Knoten wird der tatsächliche Symbolindex verwendet, der in der ImageIndex Eigenschaft hinzugefügt wird. Andere Symbolindexe werden nicht verwendet. Aufgrund der Besonderheiten bei der Verwendung der Komponente sind auch einige andere Eigenschaften nicht implementiert. Beispielsweise gibt es keine Möglichkeit, mehrere Elemente auszuwählen. Die am häufigsten verwendete Eigenschaft ist natürlich die TfrShellTreeView.SelectedPath. Wenn ein Shell-Knoten ausgewählt ist, enthält diese Eigenschaft den Pfad zu dem Ordner, auf den dieser Knoten verweist. Andernfalls ist diese Eigenschaft gleich der leeren Zeichenkette.  Darüber hinaus ist der Umgang mit der Komponente durch Programm möglich. Sie können einen normalen (nicht-Shell-) Knoten auf die gleiche Weise hinzufügen wie einen normalen TTreeView.  frShellTreeView1.Items.Add(nil,Edit1.Text); //einen Stammknoten mit dem Text aus Edit1 hinzufügen Hinzufügen eines Knotens zum aktuell ausgewählten Knoten: procedure TForm1.Button5Click(Sender: TObject); var N:TfrShellTreeViewNode; begin N:=(frShellTreeView1.Selected) as TfrShellTreeViewNode; if N=nil then Exit; frShellTreeView1.Items.AddChild(N,Edit1.Text); end; Das Löschen eines Knotens ist ebenso einfach. So wird zum Beispiel der aktuell ausgewählte Knoten gelöscht: procedure TForm1.Button2Click(Sender: TObject); var N:TfrShellTreeViewNode; begin N:=(frShellTreeView1.Selected) as TfrShellTreeViewNode; if N=nil then exit; frShellTreeView1.Items.Delete(N); end; Um einen Knoten zu löschen, können Sie jedoch einfach seine Free-Methode aufrufen. Leider unterstützt die Komponente derzeit nicht die Generierung von Ereignissen, die auftreten, wenn die zugehörigen Dateisystemordner geändert werden. Die übrige Funktionalität der Komponente entspricht weitgehend der Standard-TreeView.  Zusammenfassend lässt sich sagen, dass FastReport nicht nur ein Tool zum Erstellen von Berichten ist, sondern auch eine Quelle für zusätzliche Komponenten, die in Delphi-Anwendungen verwendet werden können. Die TfrShellTreeView bietet eine bequeme Möglichkeit, Dateisystemelemente anzuzeigen und kann in verschiedenen Projekten nützlich sein. Die Bibliothek der FastReport-Komponenten wird ständig erweitert, was dieses Tool für Entwickler noch attraktiver macht.
Weiterlesen
21. April 2025

Funktionsweise von RFID-Tags in FastReport VCL

RFID-Tags sind eine moderne Technologie, die zur Identifizierung von Artikeln verwendet wird und Barcodes ersetzt. Der Hauptunterschied besteht darin, dass RFID-Tags Funksignale verwenden. Dadurch können große Warensendungen schnell gescannt werden, was zu einer erheblichen Zeitersparnis führt. Darüber hinaus werden RFID-Tags aktiv zur Identifizierung von Mitarbeitern in Unternehmen eingesetzt. In diesem Artikel betrachten wir das Funktionsprinzip von RFID-Tags in FastReport VCL mit dem neuen TfrxDeviceCommand-Objekt.     Merkmale der RFID-Struktur Die Struktur eines RFID-Tags besteht aus vier Datenblöcken: Reservierter Block, der zwei Passwörter enthält: ein Zugangspasswort und ein Löschpasswort. Mit dem ersten Passwort können Sie den Zugang zu den bestimmten Blöcken oder Teilen des Tagspeichers steuern. Das zweite Passwort wird verwendet, um das Tag dauerhaft zu deaktivieren oder wiederzuverwenden (sofern eine solche Funktion unterstützt wird). Jedes Passwort ist maximal 32 Bit lang. Block mit elektronischem Produktcode. Block mit Tag-ID. Block mit Benutzerdaten. Alle Blöcke außer dem ersten können unterschiedlicher Größe sein oder von Lieferanten geblockt werden. Diese Daten werden in den Tag-Eigenschaften beschrieben. Die Datenformatierungsstandards dieser Datenbanken werden in diesem Dokument beschrieben. Zum lokalen Gebrauch können Sie jede beliebige Datenformatierung verwenden, mit der der Benutzer bequem arbeiten kann.  Um Tags in FastReport VCL zu implementieren, wurde ein TfrxDeviceCommand Objekt erstellt, in dem ein RFID-Tag eine der möglichen Voreinstellungen ist. Im Moment ist dies die einzige Voreinstellung, aber wir planen, diese Kategorie in Zukunft zu erweitern. In Version 2025.1.8 wird dieses Objekt nur von ZPL beim Exportieren verarbeitet (andere Exporte überspringen es). Es ist geplant, die Verarbeitung dieses Objekts auf andere Exporte bei Anfragen zu erweitern.     Merkmale des TfrxDeviceCommand-Objekts  Nicht visuell, d.h. es wird nicht in der Vorschau angezeigt (nur im Designer). Keine Höhe und Breite. Die Position innerhalb des Containers (Seite oder Band) dient ausschließlich der besseren Übersichtlichkeit im Designer. Mit anderen Worten: Die Position hat keinen Einfluss auf die Verarbeitungswarteschlange beim Exportieren. Man kann sich das so vorstellen, dass beim Export das TfrxDeviceCommand-Objekt eine eigene, separate Warteschlange hat.  Eine separate Warteschlange ist für eine einzelne Voreinstellung eine überschüssige Lösung. Es lohnt sich jedoch, die Parameter des TfrxDeviceCommand-Objekts zu berücksichtigen, die die angegebene Warteschlange beeinflussen.   Um die Verarbeitungszeit zu konfigurieren, verfügt das Objekt über ein „ProcessingTime“ Feld, das zwei Werte annehmen kann: ptBeforeView (Verarbeitung vor dem gesamten Inhalt des Containers); ptAfterView (Verarbeitung nach dem Inhalt des Containers). Wenn der Container mehrere TfrxDeviceCommand Objekte mit der gleichen ProcessingTime hat, dann muss das Order-Feld (0 bis MaxInt) verwendet werden. Nehmen wir an, der Container enthält 3 TfrxDeviceCommand-Objekte mit folgenden Parametern: ProcessingTime = ptAfterView , Order = 1; ProcessingTime = ptBeforeView, Order = 0; ProcessingTime = ptAfterView , Order = 0; Wenn der Container exportiert wird, sieht die Verarbeitungsreihenfolge wie folgt aus: das zweite Objekt (ProcessingTime = ptBeforeView, Order = 0); Inhalt des Containers; das dritte Objekt (ProcessingTime = ptAfterView , Order = 0); das erste Objekt (ProcessingTime = ptAfterView , Order = 1); Dieses Objekt enthält außerdem die folgenden Felder:  DeviceType - wird zum Auswählen einer Voreinstellung verwendet. Derzeit gibt es nur einen dtRFIDLabel Wert und es ist noch nicht möglich, ihn zu ändern. DeviceProperties - enthält Felder, deren Liste sich je nach ausgewähltem DeviceType ändert. Hier wird der Inhalt der aktuellen Voreinstellung (RFID-Tags) gespeichert.     Anpassung des Inhalts eines Objekts  Sie können den Inhalt nicht nur im Objektinspektor, sondern auch im Editor anpassen.   Es gibt nur eine englische Übersetzung und keine anderen Übersetzungen, um Verwechslungen bei hochspezialisierten Begriffen zu vermeiden. Der Editor ist in Registerkarten unterteilt, wobei jede Registerkarte Eigenschaften für eine bestimmte Speicherbank und eine Registerkarte mit anderen Tag-Optionen enthält. Einige Felder werden dupliziert, um das Ausfüllen mit Ausdrücken (beispielsweise aus einer Datenbank) zu unterstützen. Passwörter werden nur in den reservierten Datenblock im hexadezimalen Zahlenformat aus acht Zeichen eingegeben. Darüber hinaus können die Zugangsmodi nicht ohne ein festgelegtes Zugangspasswort mit einem Wert ungleich Null gesteuert werden. In den übrigen Datenblöcken können Sie das Eingabeformat wählen: entweder eine hexadezimale Zahl oder eine ASCII-Zeichenkette. Weitere Informationen zur RFID-Unterstützung in ZPL finden Sie in der offiziellen Dokumentation. Dieses Objekt ist für FastReport VCL das erste seiner Art. Zukünftig werden jedoch neue Voreinstellungen für dieses Objekt implementiert.
Weiterlesen

Kostenlos testen

Any other questions?

Contact the manager
Fast Reports
  • 800-985-8986 (Englisch, USA)
  • +31 97 01025-8466 (Englisch, EU)
  • +49 30 56837-3928 (Deutsch, DE)
  • +55 19 98147-8148 (Portugiesisch, BR)
  • info@fast-report.com
  • 66 Canal Center Plaza, Ste 505, Alexandria, VA 22314

© 1998-2025 Fast Reports Inc.