Ultimate VCL

A set of tools for creating reporting infrastructure for Delphi business applications and cross-platform development

v. 2025.2.0
What reports can Ultimate VCL do

What reports can Ultimate 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 and Benefits Ultimate VCL

Transports
Save prepared reports to the cloud storages: Google Drive, Next Cloud, Box, Dropbox in a couple of mouse clicks for convenient delivery to your clients
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.
Client-server components
Build reports directly on the WEB using standard FastReport VCL components without the need to connect the client directly to the database server.
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.
Source code
This set of components includes FastReport source codes. Maximum convenience for companies wishing to adapt the code to their needs.
Helpful additions
Ultimate includes systems for multidimensional analysis: FastCube VCL and FMX, as well as FastConverter .FP3 plugin for exporting reports in all possible formats.
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.

Ultimate 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

Ultimate 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. Ultimate 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.

Client-Server components

Build reports directly on WEB by using client-server technology with standard FastReport tools without the need for a direct connection to a database server. You can manage several client requests at the same time in separate threads, thus minimizing the server's response time.

The TfrxReportServer component is an autonomous HTTP server with the capability to build reports. The report server can build several reports simultaneously, log events, and collect data. For using the already existing solutions based on other HTTP servers, you can integrate them with the FastReport server with a CGI mechanism. Reports can be built into an already-working system (site). HTTP- servers and report servers can work on different computers and use SSL encryption.

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!

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.

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.

Ultimate 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.

Cross-platform developing

With the help of the FastReport FMX and FastCube FMX components included in the Ultimate VCL, it is possible to develop cross-platform reporting applications for Windows, macOS and Linux. This allows developers to create documents that will run on different operating systems without the need for additional configuration or recompilation.

Thanks to the FireMonkey environment compatible with Embarcadero RAD Studio, the creation of projects for various screen resolutions and device sizes is supported, ensuring the adaptability of applications on all devices.

Users on different operating systems can work with your application without having to install additional libraries or components. This simplifies the process of distributing and maintaining the application.

FastScript formulas

FastScript formulas

In Ultimate VCL, the FastScript package is used to perform non-standard calculations. Using scripts, you can calculate indicators and filters. You can set data processing after or simultaneously with standard indicators.

For indicators, you can set filters specified by the script. This filter is used if it is necessary to calculate indicators not for all rows of the original data set, but only for selected ones. The calculation filter can be applied to both measures based on standard aggregate functions and calculated measures.

Transports

Transports

Ultimate VCL allows exporting the prepared reports and export results into different cloud storages, such as FTP, Dropbox, OneDrive, Google Drive, Box.com, and others. It simplifies report-saving processes and makes them available to other users at any time and place.

Cloud services allow for automatic file backups, which reduces the risk of losing data in the event of equipment malfunctions or other emergency situations. Storing files in the cloud makes room for local storage, which comes in handy for users with limited space on a hard drive or SSD.

FastQueryBuilder

FastQueryBuilder

Create database inquiries with knowledge of SQL! You can use FastQueryBuilder in your applications written in Embarcadero Delphi, C++ Builder, RAD Studio (VCL and FMX - FireMonkey), and Lazarus for creating a simple SQL generator. Visual models of the request are kept for further use and editing.

FastQueryBuilder allows working with local and client-server databases by using BDE, ADO, IBX, and FIBPlus. A complete visual parameter setting of the requests can be built into any window of your application.

OLAP components

OLAP components

Ultimate VCL includes cross-tab components for VCL and FMX, an interactive tool for data presentation and analytical processing. The central part of the table displays the values of the indicators.

The cross-table consists of many areas: the header of the cross-table, the area of the filter fields, the vertical and horizontal headers of the dimensions, the vertical and horizontal header of the cross-table, the data area, the field list, the list of Top-N filters, the area of aggregate calculations for the selected cells, and scale control.

Delivery options

Features
from $1,299
Buy
from $899
Buy
from $499
Buy
from $499
Buy
from $499
Buy
from $399
Buy
FastReport Engine
VCL components
FMX components
Lazarus components
OLAP features
OLAP aggregation functions
Data connections
Reporting features
Report objects
Barcodes
Charts
Printing
Export in formats
Source Code
Convertors from
Transports

Resent articles

April 22, 2025

Working with XML and JSON Formats in FastScript

Currently, XML and JSON formats have emerged as the primary standards for data storage and information exchange between computer systems. At the request of users, classes for handling XML and JSON have been added to FastScript. In this article, we’ll take a closer look at how to work with these classes, explore their properties and methods, and also create reports from code using scripts.     XML Format To work with XML in scripts, 2 classes are used. These classes are focused on maximum speed and low memory consumption.   TfrXMLDocument – a class that encapsulates the functionality of an XML document. The following properties and methods are available in it. Class Properties and Methods Description procedure SaveToStream(Stream: TStream); Saves the XML to the passed stream. procedure LoadFromStream(Stream: TStream; AllowPartialLoading: Boolean = False); Loads the XML from the passed stream. procedure SaveToFile(const FileName: string); Saves the XML to a file with the specified name. procedure LoadFromFile(const FileName: string); Loads the XML from a file with the specified name. procedure Clear; Deletes all XML nodes from the tree, except the root node. The content of the node is NOT cleared. property Root: TfrXMLItem; Allows access to the root element of the tree. property AsText: string; Allows you to both get and set the XML as a string (for example, using this property, you can pass the XML to the report script using a report variable). property AutoIndent: Boolean; Determines how the output XML will be generated: as a single line or as indented 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. Class Properties and Methods Description function Add(AName:string):TfrXMLItem; Creates a child TfrXMLItem with the specified name and returns it. procedure Clear; Clears the list of child elements. procedure InsertItem(Index:integer; AItem: TfrXMLItem); Inserts a child element into the specified position. The element may belong to another document. function Find(AName:string):Integer; Searches the child elements for a TfrXMLItem with the specified name and returns it. If the element is not found, -1 is returned. If there are several elements with the specified name, the first one is returned. function FindItem(AName:string):TfrXMLItem; Searches the child elements for a TfrXMLItem with the specified name and returns it. If the element is not found, a new element with the specified name is created and returned. If there are several elements with the specified name, the first one is returned. function Root: TfrXMLItem; Returns the root element of the document. property Count:Integer; Returns the number of child nodes of the element. property Items[AIndex:Integer]: TfrXMLItem; Returns a child element by its index. property Prop[AName:string]:string; Returns or sets the value of the node’s attribute with the specified name. property Name: string; The tag name of the element. property Parent: TfrXMLItem; The name of the parent element. Root is nil. property Text:string; A string containing a list of node parameters in the format Name1="Value1" Name2="Value2"… Special characters in this string are quoted. procedure Delete(AIndex: Integer); Deletes a child element with AIndex. procedure DeleteProp(const APropName: string); Deletes the node’s attribute with the specified name. property Value: string; The text that is located between the opening and closing tag of the element. function PropExists(APropName:string):Boolean; Helps to determine whether an element has an attribute with the specified name. function IndexOf(AItem: TfrXMLItem):Integer; Returns the index of the passed element. function GetPropNames(ANames:TStrings); Fills the passed list of strings with the names of the TfrXMLItem attributes.   Let’s try to build a report using classes for working with XML. For example, we will display data from the "country.xml" file in the report, but we will not use TClientDataSet, and will use direct access to the XML file. We create a new report, go to the editing mode, put MasterData on the report. And add several Memo on top to display the data. We will also create an OnBeforePrint event for the MasterData object. The final report script code will look like this: 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. Let’s go ahead and run the report. To make it easier to read, we’ve also added column headers.     JSON Format Let’s smoothly transition from XML to JSON format. To work with it in FastReport, 2 classes are also used—TfrJSON and TfrJSONArray. In this case, these classes are simply a wrapper around classes from System.JSON in the Delphi platform or similar classes in Lazarus.   TfrJSONObject — a class that encapsulates functions for working with JSON objects. Class Properties and Methods Description function Create(const JSONstring: string); Creates a JSON object and populates it from the provided string. function IsValid:Boolean; Returns True if the object contains valid JSON. procedure LodFromFile(const AFilName:string); Loads data from the specified file. If the object contains data, it will be lost. procedure LoadFromtStream(const AStream:TStream); Loads data from the provided stream. If the object contains data, it will be lost. function ToString:string;   Returns a string containing the textual representation of the JSON object. procedure SaveToFile(const AFileName: string); Saves the textual representation of the JSON object to a file. procedure SaveToStream(AStream: TStream Saves the textual representation of the JSON object to a stream. function IsNameExists(const AName:string); Returns True if the object has a property with the specified name. function IsNameValueExists(const Name, Value: string): boolean; Returns True if the object has a property with the specified name and its value matches the specified value. function Count:Integer; Returns the total number of properties in the JSON object. property Names[AIndex:Integer]:string; Returns the name of the property at the specified index. Property ValueType[IndexOrName:Variant]:TfrJSONType; Returns the type of the property at the specified index or name. The type can be one of the following values:- jsUnknown–—The type of the property is unknown (a parsing error occurred or a property with such an index or name is missing). - jsNumber—The property has a numeric type. - jsString—The property has a string type. - jsBoolean—The property has a boolean type (true/false). - jsNull—The type of the property is null (no value is assigned). - jsList—The type of the property is a JSON array. - jsObject—The type of the property is a nested JSON object. The properties below allow you to retrieve the values of the JSON object in one form or another. In all these properties, indexing is performed either by the property number in the list of properties or by its name. Note that AsString[‘1’] <> AsString[1]. Also, if you try to get the value of a property using an inappropriate method, errors may occur and incorrect property values may be returned. For example, if a property has the type "Object" or "Array", then when you try to get its value using the AsString property, you will get an empty string. In other cases, AsString will return the string representation of the property’s value. Class Properties and Methods Description property AsObject[IndexOrName: Variant]: TfrxJSON; Allows you to retrieve a nested JSON object. property AsArray[IndexOrName: Variant]: TfrJSONArray; Allows you to retrieve a nested JSON array. Property AsString[IndexOrName: Variant]: string; Allows you to retrieve the value of a property as a string. This retrieval method can be applied to properties of other types, except for objects and arrays. For boolean values, a string containing the value "True" or "False" will be returned. For numbers with a fractional part, a dot will always be used as the fractional part separator, regardless of regional settings. property AsNumber[IndexOrName: Variant]: Extended; Allows you to retrieve the value of a property as a number. If the property has a non-numeric type, 0 will be returned. property AsBoolean[IndexOrName: Variant]: Boolean; Allows you to retrieve the value of a property as a boolean value. If the property has another type, False will be returned. To return a field of type null, you’ll have to put in a little effort. There isn’t a dedicated method for that. However, you can use the ValueType property, which returns jsNull for a field of type null, or use the AsString property, which returns the string ‘null’. Let’s take a closer look at the methods for manipulating object properties. Class Methods Description Procedure Delete(AName: String);   Removes a property with the specified name from the object. function AddObject(const AName: string): Integer Adds a child empty object with the specified name to the object. function AddArray(const AName: string): Integer; Adds an empty array with the specified name to the object. function AddString(const AName, AValue: string): Integer; Adds a string with the specified name to the object. function AddBool(const AName: string; AValue: boolean): Integer; Adds a boolean value with the specified name to the object. function AddNumber(const AName: string; AValue:Extended): Integer; Adds a numeric real value with the specified name to the object. function AddInteger(const AName: string; AValue:Integer): Integer; Adds a numeric integer value with the specified name to the object. function AddNull(const AName: string): Integer; Adds a null value with the specified name to the object. The methods return an integer, which is the index of the added element in the list of all fields. All methods that add fields to the object do not control the presence of existing fields with the same names. This procedure is the responsibility of the programmer using this class. Such control is necessary to prevent the appearance of multiple fields with the same names in the output JSON. The behavior of the system in this case is undefined—it depends on the parser that will further parse the received JSON. This means that any of the values with the same names may be used! The TJSONArray class encapsulates methods and properties for working with JSON arrays. In principle, the main properties are the same, but you can only access them by index. Only operations to access any element, get its value, or delete any element are supported. You cannot move elements in the array or change their type. Let’s consider the properties and methods for obtaining the values of elements in this class. Class Properties and Methods Description function Count:Integer; Returns the number of elements in the array. property ValueType[AIndex: Integer]: TfrJSONType; Returns the type of the array element with the specified index. property AsObject[AIndex: Integer]: TfrJSONObject; Returns an object providing access to the array element as a JSON object. Property AsArray[AIndex: Integer]: TfrJSONArray Returns an object providing access to the array element as a JSON array. property AsString[AIndex: Integer]: string; Returns the value of the array element as a string. property AsNumber[AIndex: Integer]: Extended; Returns the value of the array element as a number. property AsBoolean[AIndex: Integer]: Boolean; Returns the value of the array element as a boolean value. When dealing with arrays, like with objects, you need to carefully approach extracting the values of elements. Depending on the type of the value, you should use the appropriate method to retrieve it. The methods for manipulating elements of a JSON array are described below. Class Properties and Methods Description procedure Delete(AIndex:Integer); Deletes an array element at the specified index. function AddObject: Integer; Adds a nested JSON object to the end of the array. function AddArray: Integer; Adds a nested JSON array to the end of the array. function AddString(const AValue: string): Integer; Adds a string to the end of the array. function AddBool(AValue: boolean): Integer; Adds a boolean value to the end of the array. function AddNumber(AValue:Extended): Integer; Adds a floating-point number to the end of the array. function AddInteger(AValue: Integer): Integer; Adds an integer to the end of the array. function AddNull: Integer; Adds null to the end of the array. All of these methods return the position of the element added to the array. You cannot insert an element into the middle of the array; this is a limitation of the base classes in System.JSON.     Specifics of Using Classes to Access JSON When using objects, it’s important to remember that after using wrapper objects, you must remove all of them from the code. Note that if you want to get a child object or array, but instead there’s a scalar value or no value at all, the property will return nil, and an exception will occur when accessing that property further. Avoid using methods that are not intended to work with values of specific types stored in an element to retrieve those values. It’s important to note that property names of objects are case-sensitive, meaning "Item1" and "item1" are considered different names! You can only set values for object elements if the type of those values matches the type that is defined for the element. If you need to redefine the type of an element, delete it and add a new one with the same name and the type you want. Entering new values for array elements is not possible. You need to delete the JSON array and then recreate it with the values you want. Let’s use the classes from the description above and write a script that extracts data (without type information) from an XML file and puts it into a JSON object. 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; And let’s try to build a report based on the obtained data (first, place the appropriate MasterData and Memo components on the report page): 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.   You can also use these objects in Delphi code—simply include the frXML and frJSON modules in the uses statement.     Conclusion In this article, we explored the use of classes for working with JSON and XML in FastReport. If you’re a developer working not just with reports but also with Delphi and Lazarus, utilizing these classes will help minimize issues when switching between environments—your experience will be consistent across both IDEs. For your convenience, we’ve included two examples in this article demonstrating report generation using XML and JSON. You can open and run these examples directly in FastReportDemo, which comes with the FastReport distribution. You might need to configure the reports before running them—just make sure to specify the correct path to the data file "country.xml," which can be found both in the DemoCenter and in the folder with the examples. Download Examples
Read
April 22, 2025

Working with the TfrShellTreeView Component in FastReport VCL

FastReport isn’t just about report components—it has a lot more to offer! In particular, there are several components that you can use in your applications just like the other Delphi components, and we’re always adding more to the library. In this article, we’ll check out one of these: TfrShellTreeView. This component is designed to display elements of the file system and is partially equivalent to components such as TDirectoryListBox, TDirectoryOutline in Delphi, and TShellTreeView in Lazarus. If you want to see how it looks without launching the IDE, that’s the "tree" you see on the left in the explorer window.   This component works great in Windows and Linux, for both Delphi and Lazarus. It doesn’t support FMX development. TfrShellTreeView leverages a lot of operating system features. For instance, in Windows, you can treat zip archives like regular folders and even mess with their contents—extracting and adding files. Some features might not be available in Linux, depending on which version you’re running. But don’t worry: showing the tree and selecting elements will always work on any OS. The main property of TfrShellTreeView that manages interaction with the operating system is OptionsShell.   ContextMenu — specifies whether to show the system context menu for the selected file. ShowFolder — this property displays folders. ShowHidden — this property indicates whether hidden files will be visible or not. ShowNonFolders — this property displays regular files (not folders). TrackShellChanges — this property is designed to monitor changes in the file system. If you have any folder open in the component and it gets modified (for instance, if you copy a file into it), a new node representing that file will be automatically added to the component. TfrShellTreeView supports a set of hotkeys specific to the standard file dialog or Explorer in Windows (Ctrl+С, Ctrl+V, Delete, etc.) with standard dialogs. Also, the TfrShellTreeView component supports Drag&Drop of file system elements both within itself and from other (but not all) file managers. The OptionsBehavior.AllowDragDrop property is used to allow Drag&Drop operations. Dragging is carried out using operating system functions. The remaining properties are similar to those in the TTreeView and TfrTreeView components. However, it is worth noting that they are grouped by type of use: OptionsBehavior, OptionsSelection, OptionsShell, OptionsView. This will allow you to quickly find the properties you need. As mentioned above, the component is designed to display the computer’s file system. By default, the component is configured to display the root folder of your system: "Desktop" in Windows or "/" in Linux. However, the capabilities of the component are not limited to this.  Let’s place the TfrShellTreeView component on the form and open its editor:   The TfrShellTreeView editor looks similar to the editors of the TTreeView and TfrTreeView components, but it has 2 new buttons: New shell Root Item. New shell Root SubItem. As we can see in the editor screenshot, the component can contain: Regular nodes, containing only text, such as "New simple item 1". Nodes with a location in the file system, such as "This Computer", "Lazarus", "data". We will refer to such nodes as shell nodes. Regular and child nodes are created and edited in the same way as in regular TreeViews. Nodes that have a link to a file structure element are created using the "New shell Root Item" buttons. This will create a shell node of the same level as the current one. If you click on "New shell Root SubItem", a child shell node will be created in relation to the current node. Please note that you cannot create child nodes for a shell node, but you can for a regular node.  Editing shell nodes comes down to specifying which folder the given node is linked to. You can set the binding to a folder using constants of the TfrRootNodes type. These constants define places such as the desktop, autostart, and so on. If you set the rfCustomPath constant, it becomes possible to add a path to the file system folder in the directory tree below. You can also set this path using the editing window located below the directory tree. For example, the screenshot below sets the path to the Lazarus folder located on drive C:\.   Like a regular TreeView, regular nodes of the component can be assigned icons. Shell nodes cannot be assigned icons; they use icons set in the operating system. For nodes, the icon index added in the ImageIndex property is actually used. The remaining icon indexes are not used. Also, due to the peculiarities of using the component, some other properties are not implemented. For example, there is no possibility of multiple selection of elements. The most frequently used property is, of course, TfrShellTreeView.SelectedPath. If a shell node is selected, then this property contains the path to the folder to which this node points. Otherwise, this property is equal to an empty string. In addition, working with the component is also available programmatically. You can add a regular (non-shell) node in the same ways as a regular TTreeView. frShellTreeView1.Items.Add(nil,Edit1.Text); //add a root node with text from Edit1 Adding a node to the currently selected node: 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; Removing a node is also easy. For example, this is how the currently selected node is removed: procedure TForm1.Button2Click(Sender: TObject); var N:TfrShellTreeViewNode; begin N:=(frShellTreeView1.Selected) as TfrShellTreeViewNode; if N=nil then exit; frShellTreeView1.Items.Delete(N); end; However, to remove a node, you can simply call its Free method. Unfortunately, the component currently does not support generating events that occur when the file system folders associated with it change. The rest of the component’s functionality largely coincides with the standard TreeView. In conclusion, FastReport is not only a tool for creating reports, but also a source of additional components that can be used in Delphi applications. TfrShellTreeView provides a convenient way to display file system elements and can be useful in various projects. The FastReport component library is constantly updated, which makes this tool even more attractive to developers.
Read
April 21, 2025

How RFID Tags Work in FastReport VCL

RFID tags are a modern way to ID products, quickly replacing barcodes. What makes RFID tags different is they use radio signals. This lets you scan large quantities of items fast, saving a bunch of time. RFID tags are also used to identify employees within companies. In this article, we'll check out how RFID tags work with the new TfrxDeviceCommand object in FastReport VCL.     Features of RFID Structure The structure of an RFID tag consists of four data banks: Reserved Bank: Contains two passwords: access password and kill password. The first password allows management of access to specific banks or parts of the tag's memory. The second password is used for permanently disabling the tag or its reusability (if such a function is supported). Each password has a length of no more than 32 bits. Product Code Bank Tag ID Bank User Data Bank All banks except the first can have varying capacities or may be locked by suppliers; all this is described in the specifications of the tag. The standards for formatting data in these banks are described in this document. For local use, any data formatting that is convenient for the user to work with can be employed.  TfrxDeviceCommand object was created for the implementation of tags in FastReport VCL, where the RFID tag is one of the possible presets. Currently, this is the only preset, but we plan to expand this category in the future. In version 2025.1.8, this object is processed only via ZPL export (other exports currently skip it). We plan to extend its processing to other exports upon request.     Features of the TfrxDeviceCommand Object It is not a visual object, meaning it does not appear in the preview (only in the designer). It does not have height and width. The position within the container (Page or Band) is used solely in the designer for better visibility. In other words, the position does not affect the processing order during export. It can be understood that during export, TfrxDeviceCommand has its own separate queue. A separate queue for a single preset is an excessive solution. However, it is still worth considering the parameters of the TfrxDeviceCommand object that influence the specified queue.    To configure the processing time, the object has a field called ProcessingTime, which can take 2 values: ptBeforeView processes before the entire content of the container); ptAfterView (after the content of the container). If the container has multiple TfrxDeviceCommand objects with the same ProcessingTime, the Order field (ranging from 0 to MaxInt) will be required. Suppose there are 3 TfrxDeviceCommand objects in the container with the following parameters: ProcessingTime = ptAfterView , Order = 1; ProcessingTime = ptBeforeView, Order = 0; ProcessingTime = ptAfterView , Order = 0; When exporting the container, the processing order will be as follows: The second object (ProcessingTime = ptBeforeView, Order = 0); The content of the container; The third object (ProcessingTime = ptAfterView, Order = 0); The first object (ProcessingTime = ptAfterView, Order = 1); Additionally, this object has the following fields: DeviceType — used to select a preset; currently, there is only one value, dtRFIDLabel, and it cannot be changed for now. DeviceProperties — contains fields, the list of which changes depending on the selected DeviceType. This is where the content of the current preset (RFID labels) is stored.     How to Configure the Content of the Object The content can be configured not only in the object inspector but also in the editor.   Translation into other languages besides English is not available to avoid confusion with specialized terminology. The editor is divided into tabs, each containing properties for a specific memory bank, along with one tab for additional label options. Some fields are duplicated to support filling expressions (for example, from the database). In the reserved data bank, passwords can only be entered in the format of a hexadecimal number consisting of eight characters. Furthermore, without a non-zero access password, it will not be possible to control access modes. In other data banks, you can choose the recording format: either a hexadecimal number or a string in ASCII encoding. For more information on RFID support in ZPL, you can refer to the official documentation.  This object for FastReport VCL is the first of its kind. However, new presets for this object will be implemented in the future.
Read
Fast Reports
  • 800-985-8986 (English, US)
  • +31 97 01025-8466 (English, EU)
  • +49 30 56837-3928 (German, DE)
  • +55 19 98147-8148 (Portuguese, BR)
  • info@fast-report.com
  • 66 Canal Center Plaza, Ste 505, Alexandria, VA 22314

© 1998-2025 Fast Reports Inc.