Skip to content

What's New in DataFlex 2026

DataFlex 2026 introduces a Package Manager, Web Control Loading Optimizations, Web Control Dark Mode and more.

See DataFlex 2026 Beta 1 Changes for the list of bug fixes and improvements between Alpha 2 and Beta 1. See DataFlex 2026 Alpha 2 Changes for the list of bug fixes and improvements between Alpha 1 and Alpha 2. See DataFlex 2026 Alpha 1 Changes for the list of bug fixes and improvements new to DataFlex 2026.

New Features

Package Manager

This long awaited feature brings the DataFlex Library management logic to the next level. It adds the ability to automatically install libraries from the cloud or git repositories.

See the Package Manager page for detailed information.

New in Beta 1, df-cli and the Package Manager were expanded further with:

  • Software Bill of Materials (SBOM) generation in CycloneDX 1.6 JSON format using df-cli sbom.
  • Dependency overrides in .sws files, making it easier to pin packages, work against local package sources during development and adjust package behavior without changing dependency declarations.
  • A new df-cli run command that builds a project when needed and launches it directly from the workspace.
  • --write-errors support for build and build-file, allowing compiler errors to be written to .err files.
  • SSH support for Git package dependencies, including git@... and ssh://... repository URLs.
  • Improved Git version resolution when version constraints are used.
  • Package search without a required search term.
  • CDN support for HTML includes, including integrity, crossorigin, module, async and defer attributes.
  • Improved handling of legacy INI workspaces, including better preservation of comments, blank lines and preferred class settings.

For the complete list of command, workspace and compatibility details, see Package Manager.

Web Control Loading Optimizations

When loading web controls into a browser or when using FlexTron, DataFlex serializes all client web properties for each cWebObject instance into JSON. This process has been optimized by first serializing class properties and then, for each object, only serializing class properties that have actually changed. The serialized classes are then stored in a cache. This greatly reduces the load time of large WebApps and large Views and reduces the size of the HTTP response significantly.

Selection Forms and List Filtering

DataFlex 2026 adds cWebSelectionForm, a selection form for choosing a single value from suggestions. Selection forms can also include action rows in their suggestion popups, such as advanced search or application-specific actions.

cWebList now supports filtering rows by setting psFilter. By default, filtering matches visible columns. Set pbSearchHiddenColumns to include hidden columns.

Web Control Dark Mode

This feature builds on top of the CSS variables introduced in 25.0 and adds dark mode support for the following themes:

  • Material
  • Flat touch
  • Flat desktop

This feature also introduces two new properties to cWebApp/cLocalWebAppHost. Those properties are:

  • peThemePreference
  • peSystemPreference

peSystemPreference is a read only property that reads the system preference of the end user. This will tell you if they have a dark or light mode preference set in their browser. The possible values are spLightMode and spDarkMode.

peThemePreference is what decides which version of the theme the end user will be seeing. This property has three different values:

  • tpLightMode — lets the current theme run in light mode
  • tpDarkMode — lets the current theme run in dark mode
  • tpSystemPreference — lets the user's browser settings decide if it should use dark or light mode.

Support for Multiple cLocalWebAppHosts

This feature adds support for multiple cLocalWebAppHosts in one project. Previously it was only possible to have one cLocalWebAppHost in a project. This was due to the WebApp framework using global handles for the WebApp (ghoWebApp), session manager (ghoWebSessionManager), WebResourceManager (ghoWebResourceManager) and the WebViewStack (ghoWebViewStack). Because these objects were being moved to a global handle two of the same objects could not properly coexist in the same project.

To fix this issue the WebResourceManager, WebSessionManager and WebViewStack are now properties on the host object instead of global handles. These handles can now be retrieved in the following ways:

  • Move (Host(Self)) to hoWebApp
  • Move (ResourceManager(Self)) to hoWebResourceManager
  • Move (SessionManager(Self)) to hoWebSessionManager
  • Move (ViewStack(Self)) to hoWebViewStack

To prevent applications that are converting from 25.0 to 26.0 from breaking, global handles will still continue to work. We do, however, intend to remove these global handles entirely in the future. It is recommended to change the global handles in your code to the functions above.

Dialogs in the Drill-Down model

Dialogs (cWebModalDialog) can now be used within the drill-down model. This means that they can be opened using NavigateForward / NavigateBegin / NavigatePath and also take part in the history management and state hash of the WebApp. So when a dialog is opened like this the page can be refreshed or a link can be sent to someone which will restore the state into the dialog. Popup can also still be used to show a dialog without drill-down and history management logic (also within a drill-down application).

We also extended the Navigation Designer with the option to generate modal dialog selects (or lookups). This is part of our effort to improve the drill-down model usability on desktop.

Create New

The create new dialog has been redesigned. The new create new dialog has been built inside of a FlexTron container and aims to help new developers find where they need to be more easily.

Some of the improvements that have been made to make it more accessible:

  • Only project types will show when opening the create new dialog in a workspace without a project, steering new users towards creating a project and not something else.
  • Most names and descriptions have been changed to make it more clear what a wizard does, some descriptions also link to the learning center to explain certain concepts.
  • Added a only show relevant checkbox that only shows wizards usable for the current project type.
  • Works in both light and dark mode.

Hardening (Improved Security) of All DataFlex Applications

To continue updating security in DataFlex applications, in 26.0 we focused on runtime application security. What this means is that we turned on hardening settings on the actual DataFlex runtime. This will improve a lot of results for security audits. With version 26.0, DataFlex now successfully passes the https://github.com/microsoft/binskim executable tests. We will continue improving this even further in the future.

Through testing, there as some runtime issues that might arise from our code which we explain below.

  • DataExecutionPrevention (DEP) — A hardware and software security feature in operating systems like Windows that stops malicious code from running in memory areas meant for data. The expected impact of this at runtime is practically none.

  • Control Flow Guard (CFG) — A Windows platform security feature designed to prevent memory corruption attacks by enforcing strict checks on where an application's code can execute. It places tight restrictions on indirect calls, making it significantly harder for attackers to hijack program control flow. Since DataFlex is a programming language/runtime, the chances were already relatively low. Expected impact is practically none.

  • Address Space Layout Randomization (ASLR) — A crucial cybersecurity defense that randomizes memory locations for program components (stack, heap, libraries, executable) to thwart memory corruption attacks like buffer overflows, making it difficult for attackers to predict addresses and inject malicious code, thereby increasing system security by adding unpredictability to exploits.

    Through testing it has come to light that some non-conforming 64-bit code might pose issues. We have seen cases where External_Function calls that should have a Pointer Type parameter. For example, CreateMutexA (Handle(Pointer, Integer, Pointer)) was defined as (Handle(Integer, Integer, Integer)) because under 32-bit, a pointer fit into an integer. Because we didn't have address randomization turned on by coincidence, passed pointers might have fit into the passed values, while now they are sliced, losing the upper bytes, as now they might be bigger than an integer more often. This means that if you see weird behavior concerning External_Function calls, be sure to check against the actual definition.

Excel Import

This new wizard lets you convert an Excel sheet into a database. This has support for both SQL and embedded database backends. The wizard is capable of automatically detecting the best data type for each column. It is also capable of checking if a field can be used as a primary key. If it is not capable of finding a field that could act as a primary key it will prompt you to automatically create a new primary key field using the DFLastId logic.

You can start this wizard from the 'Other Files & Sources' tab of the Create New dialog (File > Create New in the Studio).

Import Studio Preferences

A new dialog to allow for the reset of the current customizations and selection of preference settings to be imported is available in the Tools menu. Import either from previous versions of DataFlex detected on your machine or from an external JSON file generated by the also new Export Studio Preferences option.

Export Studio Preferences

Generate a JSON file containing settings that may be imported by the Studio to apply your customizations to other systems.

Compatibility Notes

Workspace File Formats have Changed in DataFlex 26.0

To support the Package manager, the formats of Studio workspace (.SWS) files and workspace configuration files (.WS files) will be converted.

  • After migrating a workspace to 26.0, the Studio will convert your .SWS file format from INI to JSON. This will take the workspace paths from the Config.ws file and move them into the JSON SWS file. From this point on, the Config.ws file is generated and will only be needed in a deployment environment.
  • If you want to change your workspace paths, you can do that in the .SWS file. The next time you open the workspace in the Studio or change the paths via the "Configure Workspace" panel, the Config.ws file will be updated.

If you intend to continue working on the same workspaces in older versions of DataFlex, you will need to maintain .SWS and .WS files in the old formats for this purpose.

Updated Minimum MSSQL Client Version

The default minimum client version for MSSQL has been updated to version 13.

We had the default set to version 10, the client for SQL Server 2008. We now updated it to use a more recent client version. The new default is set to 13, that comes with SQL Server 2016. That may impact your development as well as deployment environments.

Codejock controls have been updated to the latest released version (24.3.0)

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

SerializeObject(cWebObject) Compatibility warning

The signature SerializeObject of cWebObject has changed. This private function is known to be augmented in subclasses. This will now result in compiler errors. Classes can be adjusted to use the new PreSerializeObject or PostSerialieObject messages (which are private messages, but intended to be overridden by subclasses of cWebObject) or the public OnLoad event.

See Also

What's New