What's New in DataFlex 2025 (Released April 2025)

DataFlex 2025 introduces new Dashboards, Composite Classes, a Navigation Designer and more.

Watch the What’s New in DataFlex 2025 Learning Center course.

 

Changes in DataFlex 2025 Build 25.0.30.78

Bug Fixes

 

 

Changes Between the final release previous versions in the DataFlex 2025 release cycle

This page lists all new features in DataFlex 2025.

See DataFlex 2025 Final Release Changes for the specific list of changes in DataFlex 2025 between Release Candidate 1 and the Final Release.

See DataFlex 2025 Release Candidate 1 Changes for the specific list of changes in DataFlex 2025 between Beta 2 and Release Candidate 1.

See DataFlex 2025 Beta 2 Changes for the specific list of changes in DataFlex 2025 between Beta 1 and Beta 2.

See DataFlex 2025 Beta 1 Changes for the specific list of changes in DataFlex 2025 between Beta 1 and Alpha 1.

 

Compatibility Notes

 

DF_DATE_4_STATE_ONLY_ON_PARSE is now turned on by default

We added the DF_DATE_4_STATE_ONLY_ON_PARSE attribute in DataFlex 24.0 and left the default as off. We are now changing the default of this property to be on, as this is the better behavior.

 

Overlap Fields are now Obsolete

Overlap fields have been deprecated since we introduced multi-segment relationships in DataFlex 11.0 (2005) and we have been encouraging developers to switch to newer, better alternatives ever since. As of DataFlex 20.0, when we added Unicode support, Overlap fields that overlap any non-ASCII fields no longer work and we have no plans to change this. Thus Overlap Fields are now officially obsolete.1

 

RunProgram no longer falls back to command prompt calls

RunProgram no longer falls back to command prompt calls (comparable to Shell). Note: if your program no longer starts, you will have to add the 'Shell' attribute.

 

Standard Password Hashing changes to the cWebSessionManagerStandard class

The cWebSessionManagerStandard class now does password hashing out of the box using the PBKDF2_HMAC_SHA_512 algorithm. This means that if you did not already yourself implement a hashing algorithm, and abstracted the UserLogin and/or other functions, the passwords in the database would now be what we would call “plain text passwords”.

See Standard Password Hashing for details and migration information.

 

The password column of WebAppUser must now be at least 128 characters long

If you have existing workspaces with WebApps using the WebAppUser table, you will need to adjust the password column to accommodate the new password length. Workspace with new WebApps will automatically get the table with the new column size.

 

We renamed incorrectly named (typo) constants in cWebSessionManagerStandard.pkg and Language_WebApp_xxx.inc

 

Codejock controls have been update to the latest released version (24.0.0)

There should be no impact on compiling your programs, but we encourage you to test your Windows applications.

 

The WebApp Designer is not a panel anymore

Instead of being a dockable panel within the Studio, the WebApp Designer is now shown as a tab. It behaves the same as the Windows Designer, so a file can be toggled between the editor and the designer using F7. A file can also be opened in a separate designer tab using the ‘Open designer in separate tab’ context menu item.

 

The Default Username and Password for WebApps has changed

The default username and password provided in the WebAppUser table for a new WebApp and the sample WebApps has changed from Guest and guest to admin and admin.


The Default for psAcceptTypes (cJsonHttpTransfer) has changed

The default value for the property psAcceptTypes has been changed from "text/*" to "application/json" in the class cJasonHttpTransfer.

 

Migration

The only change the migration wizard makes to workspaces already in versions 20.0 (and later) is to update the SWS file.

Workspaces currently in versions prior to 20.0 will have their filelist inspected for any OEM tables and their projects’ CFG files adjusted to accommodate compiling in 64 bits. Those workspaces may be adjusted further depending on the version of DataFlex the workspace is actually coming from.

 

JavaScript Engine migrated to EcmaScript6 (ES6) Classes

All the JavaScript code of the WebApp Framework has been refactored into actual JavaScript ES6 classes. Previous versions used so called ‘pseudo classes’ which was a custom-built class system using df.defineClass. Now that all supported modern browser support the ‘new’ JavaScript classes, the usage of these pseudo classes has been deprecated. This change will only be visible for developers doing JavaScript extensions to the WebApp Framework, like building custom controls.

It is recommended to migrate all custom controls to the new format. Pseudo classes could already be subclasses with actual JavaScript classes (as both are based on prototypes) so these will be compatible with older versions.

Support for subclassing using pseudo classes (df.defineClass) is added but has certain limitations. The constructor of the base class is called before the constructor of the subclass and base.constructor is now an empty function. Old style mixins (df.mixin) do not work with the new framework classes.

See the ES6 Conversion Guide for details of how to migrate your JavaScript classes to ES6.

 

New Features

Regular Expressions Class

The new cRegEx class is a runtime addition that provides the ability to use regular expressions in DataFlex programs without third-party dependencies and libraries. The new class is based on PCRE2 (Perl Compatible Regular Expressions) which is one, if not the most, popular and compatible RegEx standard. Developers can use this class for both convenience and improving performance of their applications. Finding, matching, substituting, and extracting in one single class!

Refactored and Extended API -- Beta 2 changes

The cRegEx API has been extended and refactored. To avoid confusion with the database find operations, the method names of Find, FindAll, FindAllGroups, FindAllExCallback have been changed into Match, MatchAll, MatchAllGroups and MatchAllCallback. Note that this means that Match now returns the offset of the first match, where 0 means no match.

For completeness, a couple of methods have been created - SubstituteAll and MatchAllOffsets – and also several properties to configure the regex behavior have been added (pbMultiline, pbGreedy, pbAnchored, pbIgnoreCase, pbUnicodeProperties).

Demo & Test View

The WebOrder sample now contains a view that demonstrates the regular expression engine. It also serves as an environment to test and develop regular expressions.  

Find the view in the menu under the “Demo > Regular Expressions”.

Studio Find in Files

Regular expressions can now be used when searching through multiple files. The Find in Files dialog has been modified to allow regular expressions to be entered.  

  

Dashboards

We added a set of controls to the product that allow for the creation of dynamic dashboards in DataFlex WebApps or via FlexTron in Windows applications. Dynamic dashboards are customizable by end users and consist of configurable tiles / widgets that work individually.

See Dashboards Quick Start for more information.

The cWebWidgetContainer class hosts a dashboard and is responsible for storing the dashboard configuration. The configuration consists of the layout and positioning of widgets and the configuration per widget.

The cWebWidget class represents a widget, multiple instances of a single widget can be placed on the dashboard where the widget configuration differentiates them. Widgets will normally be built using the composite class. cWebWidgetPalette is a helper class that is used to render a widget.

Studio support is added with the WebApp Designer being able to model widgets and templates are available for the dashboard and widget.

 

Composite Classes

The Composite Class is a new object-oriented class type that allows for creating compositions of multiple objects. This means that a Composite can be instantiated like a Class, but the scope in-between Composite and End_Composite is written like an object. This allows for nested objects and procedures which makes it very comparable to an instantiable template.

This new class type was initially added to help with the instantiation of multiple objects as a single component, like for example a cWebWidget, but can be used in many ways. The Composite is also very useful when dealing with complex Dynamic Objects as the framework will automatically pick up on the nested objects.

 

Navigation Designer

New in the Studio is the Navigation Designer panel. This panel helps with the development of drill-down applications. It visualizes the navigation paths between the views and widgets of an application by reading the WebRegisterPath instructions.  It also allows the generation of new views by dropping them from the palette on the designer. It suggests views based on the tables and their relations. From the Navigation Designer, views can be opened and deleted / removed as well.

See the Navigation Designer page for more information.

 

 

Configurable Object Names for Navigation Designer

When a block for a view was dragged from the palette onto the Navigation Designer, the objects created had a fixed name format: oSelect<Tablename>,  oZoom<TableName> or oZoomDetail<TableName>.

That has been changed to be configurable in the Studio, enabling developers to decide on the name applied at the object creation.  

This option can be configured in the Tools menu, Configure Workspace option. The block of Navigation Designer configurable options on the Workspace Preferences tab now includes three forms – Select, Zoom, Detail - where the name format can be entered using ${TableName} to determine a naming pattern for new objects.  

Notice that objects already created will not have their names changed to follow the defined pattern.

 

Standard Password Hashing

The WebApp Framework now supports out of the box password hashing.

 

Automatic Primary Key Columns

When creating a new table in the Studio, it can now automatically add an auto-increment column. For this, the Create New Table dialog has been extended with a checkbox, and when checked, the new table will automatically receive a <tablename>Id column and a unique index based on this column. When using SQL, this index will be marked as primary key and the column will be marked as identity column.

When using the embedded database, it will look for a system table named DFLastId and add an auto-increment column to it. New workspaces will have this DFLastId table, giving the smoothest experience for new developers.

Read more in Automatic Primary Key Columns.

 

Changes in Primary Key Creation -- Beta 2

Introduced in Beta 1, automatically creating a primary key during new table creation was configured through a simple checkbox – which defaulted to true. This feature has been enhanced in Beta 2 to offer an option for creating a primary key and to save what table will be remembered during this Studio session.

Read more in Automatic Primary Key Columns.

 

Configurable name for ID columns

The automatically created ID columns for the Auto Increment table were using a predefined, fixed name format: <TableName>ID.

That has now been made configurable and can be defined using the Tools menu, Configure Workspace option.  

In the Table Editor group, the form Primary key format is available for developers to define the name format for new ID columns using ${TableName}.

Note that column length is limited to 32 characters and the name of the table will be truncated to fit the combination defined as the format for column names.

 

Added COMP$TIMESTAMP for embedding of a compile time build timestamp

Some developers might want more specific build information of their program builds. Previously, developers might have done this using pre-compilation steps and custom scripts. This is no longer needed.

A new Define/Replace is globally available in your programs called COMP$TIMESTAMP which is defined as the UNIX UTC (number of seconds since 1 January 1970) timestamp as a constant UBigInt. We use a UNIX UTC timestamp to make sure that build timestamps are independent of locale.  

While custom calculations are possible depending on your use case, the Date & Time library is available to do any calculations in an easy manner.

Move COMP$TIMESTAMP to ullUnixUTC

 

Improved Performance when loading Workspaces  

The process to collect information required for view generation involves opening every table in the workspace, and retrieving and parsing every DDO associated with them. This caused a noticeable delay when starting the Studio, especially when a workspace had a great number of tables.

This process has been reviewed and improved, and it is now done during the initial opening of the Navigation Designer instead, lightening the load and removing the long wait when opening a workspace.  

As part of this review, the “Cannot open table…” errors when a database connection was not successful at the opening of a workspace have also been eliminated.

 

Composite Classes

The Composite Class is a new object-oriented class type that allows for creating compositions of multiple objects. This means that a Composite can be instantiated like a Class, but the scope in-between Composite and End_Composite is written like an object. This allows for nested objects and procedures which makes it very comparable to an instantiable template.

This new class type was initially added to help with the instantiation of multiple objects as a single component, like for example a cWebWidget, but can be used in many ways. The Composite is also very useful when dealing with complex Dynamic Objects as the framework will automatically pick up on the nested objects.

 

Configurable Object Names for Navigation Designer

When a block for a view was dragged from the palette onto the Navigation Designer, the objects created had a fixed name format: oSelect<Tablename>,  oZoom<TableName> or oZoomDetail<TableName>.

That has been changed to be configurable in the Studio, enabling developers to decide on the name applied at the object creation.  

This option can be configured in the Tools menu, Configure Workspace option. The block of Navigation Designer configurable options on the Workspace Preferences tab now includes three forms – Select, Zoom, Detail - where the name format can be entered using ${TableName} to determine a naming pattern for new objects.  

Notice that objects already created will not have their names changed to follow the defined pattern.

 

Web Themes are now configurable using CSS variables

The web themes have been adjusted to use CSS variables for their main colors and some dimensions. This allows configuration of the themes without changing them, which means less trouble during updates! The main variable names are shared between the themes, but most themes extend these with extra variables.

The full list of variables can be found at the top of the Theme.css file. Initially, themes will support the same configuration options that were already provided by the DataFlex Styler. These variables can be changed outside of the Theme.css file. It is recommended to place these inside CssStyle/Application.css.

Placing the following code in CssStyle/Application.css changes the main colors for the Df_Material theme.

:root{

    --df-MainDark: #567d2e;

    --df-MainRegular: #7CB342;

    --df-MainMedium: #89ba54;

    --df-MainLight: #a3c97a;

    --df-MainLight2: #cae0b3;

    --df-MainLight3: #e4efd9;

    --df-MainLight4: #f1f7ec;

}

 

 

Improvements and Bug Fixes

 

Studio

Redesigned the Start Center with new tabs and clean & modern look.

Implemented a new style for the Studio Dashboard.

  

 

Compiler

 

Connectivity

 

SQL Executor

 

DataDictionary Inspectors

 

Database Explorer

 

Debugger

 

Examples

 

Installer

 

Packages

 

Registration Program

 

Runtime

 

Studio

 

Web Controls

 

FlexTron

 

 

Web Framework

 

 

WebApp Administrator

 

 

Documentation

What's New
Tutorials
Tools / Studio
Development Guide
Language Reference
Class Reference
Deployment Guide
Miscellaneous

 

See Also

What's New