Blog Options


<< September 2019 >>



Most Recent Post  |  Next Post  |  Previous Post  |  Index List

9 speakers, 9 countries, 12 sessions, 5 Embarcadero MVPs


Monday, September 30, 2019

Our upcoming two TMS Training Days on November 14 and November 15 in Düsseldorf promise to be the most valuable days ever we have organized for Delphi developers using or interested in using Delphi and components from TMS software.

The first day is TMS Business Masterclass and focuses on the TMS Business Subscription line of tools with TMS Aurelius ORM and TMS XData REST server technology as headlines. The second day is TMS Dev Intensive and brings the latest on TMS VCL UI controls, TMS Flexcel, TMS FixInsight, TMS Cryptography, TMS WEB Core v1.3. On the TMS Dev Intensive day we will also reveil for the first time in public a groundbreaking and brand new product for Delphi developers.

We spared no effort and have organized to fly in 9 speakers for you out of 9 different countries. 8 out of the 9 speakers are working actively on TMS products, 1 wrote a book on a TMS product and 5 out of 9 speakers have the prestigious Embarcadero MVP title.

We are proud to present our speaker list:

Adrian Gallero, Uruguay
Bruno Fierens, Belgium
Holger Flick, USA
John Kouraklis, United Kingdom
José Leon Serna, Spain
Marion Candeau, France
Roman Kassebaum, Germany
Roman Yankovsky, Russia
Wagner R. Landgraf, Brazil

In the coming days, we will present here in this blog details about the speakers and the sessions. Stay tuned. Don't wait to register for your seat on either the TMS Business Masterclass, TMS Dev Intensive day or both as seats are limited and are going fast!

Bruno Fierens


This blog post has not received any comments yet. Add a comment.

Implicit integral operator in TMS Analytics & Physics 3.0


Thursday, September 26, 2019

The main new capability of TMS Analytics & Physics 3.0 library is symbolic integration. As the integration realized, the library now allows using ‘implicit’ integral operator in math expressions. Implicit operators allow writing math expressions in short form and manipulate with them without using explicit formula. For example, the expression ‘sin(n*x)+(A*x+B)^2x’ contains implicit indefinite integral and the library allows making operations with the expression without using explicit formula of the integral. Implicit integral operator syntax is the following:

where is the integral operator; is the derivative operator symbol; expression – symbolic expression, integrand of the operation; V – integration variable; L1, L2 – limits of integration. The limits can be omitted, so, the implicit operator can be used for definite and indefinite integrals. There are some examples of syntactically correct expressions with the implicit integral operator:

Let us consider an example of how to calculate the value of an expression, containing an implicit integral operator:

The evaluation of the expression containing the indefinite integral implemented with the same method Calculate of the TTranslator class. It allows not using explicit expression of the integration. Internal evaluation system of the library implements the symbolic integration inside the core algorithm. Nevertheless, all required data must be provided for the algorithm to process the expression. Namely, all required variables must be added to the instance of the translator:
  • translator.Add('A',-1);
  • translator.Add('B', 2);
  • translator.Add('n', 3);
  • translator.Add('x', 0.5);

Another example is using implicit expression for the definite integral:

One difference between the examples is that the latter does not require the ‘x’ variable value for handling the expression. This is because after using Newton-Leibniz axiom for the definite integral, the expression depends only on ‘A’, ‘B’ and ‘n’ variables. The explicit expression for all implicit operations can be found using the ‘Explicit’ method of the TTranslator class as in the following code:

As the limits of the definite integral are constant and the integrand expression contains only ‘x’ variable the result of the evaluation is constant too, namely ‘392/3’. Nevertheless, it is a symbolic expression, not a floating value. Math expressions with implicit integral operations can be converted into the TeX format to draw as math formulae ( There are some examples of the expressions and drawn formulae:

The version 3.0 is already available. Source code of the demo project for the article can be downloaded from here.

Masiha Zemarai


This blog post has received 2 comments. Add a comment.

TMS certified consulting partner: C-QUEL


Wednesday, September 25, 2019

As announced in May 2019, we've started our network of TMS certified consulting partners to make development easier for you. These are partner companies we know, have a long term relationship with and that we know have deep and expert level knowledge in Delphi and our TMS software component products.

We want to introduce our partners to you, who they are and what they can possibly do for you! Our first partner is C-QUEL

Company history:

It all started in 1984 where Filip learned to code in Turbo Pascal, and with the birth of C-Quel 30 years later in 2014.

C-Quel is located in the northern region of Belgium, near the Dutch and German border. A small team of high skilled Delphi (and Pascal) addicts convert every idea into a great digital tool. Uniqueness of C-Quel is that we understand the “art” of listening. We don’t live by the clock, we don’t have business hours but live by the credo “Solution Driven Software”.

Technologies used:

  • Tools: Delphi – Free Pascal – Angular – FireMonkey – Swift
  • Platforms: Windows – Linux – macOS (and of course all mobile platforms)
  • Databases: Firebird – PostgreSQL – MS SQL Server – Pervasive DBMS – SQLite
  • Components: TMS VCL Components – TMS FNC Components – TMS WEB Core – TMS Aurelius
  • Lots of custom development: e.g. Belgoprocess (nuclear waste management) – General Lease (biggest Belgian lease company)

TMS Partnership:

Partnering with TMS was rather obvious because C-Quel and TMS Software are complementary. TMS builds the tools, C-Quel builds the solution. Not only Delphi development is important, but also the Delphi developer. That’s why Bruno & Filip started Be-Delphi… and as we all know: Be-Delphi is the place to be for all of your Delphi development – questions – tips & tricks – examples – tools – etc.

Did you know…

…that 66% of the Belgian Embarcadero MVP’s consists of TMS and C-Quel team members?


If you have a Delphi problem… if no one else can help… you can find us… maybe you can hire… C-Quel

We plan for extending our network of consulting partners in the coming months and years. If your organisation is interested in becoming such partner, feel free to reach out & discuss.
Visit the partners landing page for more information and details!

Masiha Zemarai


This blog post has not received any comments yet. Add a comment.

Increased RAD level for ORM development with TMS Aurelius


Thursday, September 12, 2019

The new released version 4.8 of TMS Aurelius, brings RAD with ORM to a new level!

&quot;Photo by AbsolutVision on Unsplash&quot;

New design-time components

There are now three new components available for design-time: TAureliusManager, TAureliusDBSchema and TAureliusModelEvents.

They are just wrappers around existing classes, but they make it even easier to getting started with Aurelius. Here is how you can start using Aurelius with SQLite for example.

Drop the components on the form

First step is simply to drop TAureliusConnection, TAureliusDBSchema and TAureliusManager components on the form. This will also automatically add extra needed units to the uses clause.

Aurelius design-time components

Configure the database connection

You can then double click AureliusConnection1 component to configure your database connection. It brings the dialog below (if you are going to use a 3rd-party component to access the database, like FireDAC for example, just drop a TFDConnection in the form before double-clicking the TAureliusConnection):

Aurelius connection configuration

You can then properly configure the connection. In the example above, we will use native SQLite and simply inform the name of the database file, in this case test.db (if using 3rd party like FireDAC, just choose the Adapter Mode and associate with the TFDConnection component).

Associate other components with the connection

Both TAureliusManager and TAureliusDBSchema components provide functionality that deals with the database. We need to specify which database we are going to use.

Both components have a Connection property that you use to associate to a TAureliusConnection component. That is as simple as that, just open the object inspector and associate the AureliusConnection1 component to boht AureliusDBSchema1 and AureliusManager1 components.

TAureliusDBSchema inspector

TAureliusManager inspector

Write your entities

This is the same as it ever was. We are working with an ORM which means we need entity classes, of course. Let's create in our project a new unit named Entities and add a very simple class entity to it.

Here is the unit full source code. Don't forget that if you have an existing database, you can always automaticaly generate the entities from the existing database structure.

unit Entities;

uses Aurelius.Mapping.Attributes;

  [Entity, Automapping]
  TCustomer = class
  strict private
    FId: Integer;
    FName: string;
    property Id: Integer read FId write FId;
    property Name: string read FName write FName;



Update database structure

Our SQLite database doesn't exist and will be created automatically when we run our application. But there will be no tables in it. That is not a problem for Aurelius, which can create all the needed structure for us.

With the new TAureliusDBSchema component we dropped on the form, it gets even easier. All we have to do is call method UpdateDatabase. We can do it from the OnCreate event of the form so our database automatically gets all tables and fields it needs when the application is started:

procedure TForm4.FormCreate(Sender: TObject);

All set: Use the manager!

That is it. We have our database ready, we have the manager component in the form, we can simply start using Aurelius right away. For example, we can drop a TButton component and a TEdit component on the form and add the following code to create a new customer:

procedure TForm4.Button1Click(Sender: TObject);
  Customer: TCustomer;
  Customer := TCustomer.Create;
  Customer.Name := Edit1.Text;

Ready-to-use features

TMS Aurelius source code is very modular and each functionality is in a different unit. That means that usually you need to keep adding the specific unit you need to the uses clause. The nice thing about using Aurelius design-time components is that they add the needed units for you.

For example, you can start writing queries right away, without the need to manually add Aurelius.Criteria.Base or Aurelius.Criteria.Linq units to the uses clause.

Actually, even from code you don't need to do that anymore. You can now just use a single Aurelius.Linq unit which holds everything you need. But that is not even needed when using TAureliusManager component. Just write the queries you want:

procedure TForm4.Button2Click(Sender: TObject);
    'First customer starting with "W" is: ' +

Using events with TAureliusModelEvents

Handling events in TMS Aurelius is now easier than ever thanks to the TAureliusModelEvents component.

For example, if you want to intercept and log all SQL statements executed, just drop the component in the form:

TAureliusModelEvents component

Then create an event handler for the OnSqlExecuting event.


Then simply add the following event handler code, drop a TMemo in the form, and you have a logger of the executed SQL statements in a few seconds!

procedure TForm4.AureliusModelEvents1SQLExecuting(Sender: TObject;
  Args: TSQLExecutingArgs);

New Where Attribute

Design-time components are not the only new feature in latest TMS Aurelius. A nice addition is the Where attribute. You can now use it to add additional filtering to your entities or many-valued associations (lists).

This is very handy to implement soft deletes for example (flag entities that have been deleted without actually deleting them).

Here is how you would use it:

  [Entity, Automapping]
  [Where('{Deleted} <> ''T''')]
  TCustomer = class
    FId: integer;
    FName: string;

Whenever you try to retrieve customers, those which Deleted field in database contains T will not be retrieved. You can also use the clause in many-valued associations:

  [ManyValuedAssociation([], CascadeTypeAll)]
  [Where('{Status} = ''New''')]
  FNewCustomers: TList<TCustomer>;

It's interesting to note that the Where clause above of the TCustomer entity will still apply, meaning the NewCustomers list will only bring customers which Status field are equal to New and Deleted field different than T.

Expanding blobs in TMS XData

There are updates in other products of TMS Business product line as well. TMS XData got a nice addition: the $expand query option now also expands blobs inlined the returned JSON.

Usually if you request a resource from the server that contains a blob property, it will come as a proxy reference to minimize traffic. For example, a request to a customer that contains a Photo property:


Might bring something like this (extra info removed):

  "Id": 1,
  "Name": "Wilbur",
  "Photo@xdata.proxy": "Customer(6)/Photo"

But with the $expand clause you can now ask the Photo property to come inline in JSON as base64 string:


The request above will bring a response like this (base64 string value is not a real photo of course):

  "Id": 1,
  "Name": "Wilbur",
  "Photo": "T0RhdGE"

This is also valid for retriving entity lists as well.

TMS RemoteDB performance improvements

Last but not least in this great TMS Business update, TMS RemoteDB got its performence improved, especially in the situations where queries have lots of parameters, or return a significant amount of data.

Get in touch

Don't forget to subscribe to our channels to receive updated information as soon as it's released! Subscribe to our Youtube channel, and also subscribe to our newsletter to receive news via e-mail.

Have you enjoyed this update as much as I did? Leave your comment below and let us know!

Wagner R. Landgraf


This blog post has received 2 comments. Add a comment.

Symbolic integration in TMS Analytics & Physics 3.0


Tuesday, September 10, 2019

The main new feature of TMS Analytics & Physics 3.0 is symbolic integration. The version allows calculate symbolic expressions of indefinite and definite integrals and analytically evaluate definite integrals on the specified intervals.
Symbolic integration can be implemented with very simple code. Here is the example of typical code template to get symbolic expression of an indefinite integral:
  f, i: string;
  f:= ...;

    i:= translator.Integral(f, 'x');
    on ex:Exception do ; // handle the exception ‘ex’

  // using symbolic expression ‘i’ of the integral
Here ‘translator’ is an instance of the TTranslator class, which realizes all methods for symbolic integration; ‘f’ is the function to integrate. The ‘Integral’ method calculates analytical expression of indefinite integral by ‘x’. Assigning various expressions to the ‘f’ function, we get symbolic expressions of the integrals:
f = ‘(A*x+1)^(1/3)+1/(2-x/B)^(2/3)’
i = ‘3/4*(A*x+1)^(4/3)/A-(2-x/B)^(1/3)*3*B’

f = ‘(e^x-e^-x)*x^2-A*B^(x/2-1)’
i = ‘x^2*e^x-2*(x*e^x-e^x)+x^2*e^-x-2*(-x*e^-x-e^-x)-A*B^(x/2-1)/ln(B)*2’

f = ‘2*sin(x)-B*cos(a-x/2)+tan(x/2)^2’
i = ‘-2*cos(x)+B*sin(a-x/2)*2+2*(tan(1/2*x)-1/2*x)’
It should be noted here that symbolic integration can handle not all math expressions. For example, not all math operators allow analytical integration. If the method fails to calculate some integral – special exception with according message will be thrown. There is another overloaded version of the ‘Integral’ method that allows calculating symbolic expressions for definite integrals. The code for the case is the following:
  f, x1, x2, i: string;
  f:= 'A*e^x-sin(x)/2';
  x1:= 'Pi';
  x2:= 'sin(y)';

    i:= translator.Integral(f, 'x', x1, x2);
    on ex:Exception do ; // handle the exception ‘ex’

  // using symbolic expression ‘i’ of the definite integral
Here ‘x1’ and ‘x2’ are the lower and the higher limits of definite integral. The method ‘Integral’ uses Newton-Leibniz axiom for calculating definite integrals. For the specified integrand f=’A*e^x-sin(x)/2’, symbolic expression of the definite integral is i=’A*e^sin(y)+1/2*cos(sin(y))-A*e^p-1/2*cos(p)’.

Note that the integration limits must not depend on the integration variable (‘x’ in the examples). The limits can contain other variable names, functions, operators and other expressions. If the limits are constant and no other variable used in the integrand, then the result expression can be simplified. For example, using f=’2*x^2’, x1=’3’, x2=’5’ in the code above, we get i=’196/3’. Nevertheless, the result value is symbolic expression. To evaluate definite integrals (calculate numerical value), one must use the ‘Integrate’ method of the TTransaltor class as in the following code:
  f, x1, x2: string;
  iv: TValue;
  i: TFloat;
  f:= '2*x^2';
  x1:= '3';
  x2:= '5';

    iv:= translator.Integrate(f, 'x', x1, x2);
    i:= iv.AsType();
    on ex:Exception do ; // handle the exception ‘ex’

  // using float value ‘i’ of the definite integral
Now i=65.3333333333333 and it is float value of the definite integral.

Note that when evaluating definite integrals the integrand expression can contain other variable or even functions of other variables. However, these variables must be added to the translator instance for the evaluation process. For example, adding the following variables
  translator.Add('B', 2);
  translator.Add('n', 3);
we can evaluate definite integral for f=’sin(n*x)+e^(x/n)’, x1=’A’, x2=’B’ and getting the value i=3.04355393035906.

TMS Analytics & Physics library realizes base integration rules (sum rule, multiplication by constant and so on); provides default integrators for all algebraic, base special and transcendental functions; realizes integration by-parts algorithms for special expression types. The library also allows implementing user-defined integrators for special cases of functions and expressions. Thus, the functionality of symbolic integration can be easily extended.

The version 3.0 is already available. Source code of the demo project for the article can be downloaded from here.

Bruno Fierens


This blog post has not received any comments yet. Add a comment.

TMS Training Days 2019: Announcement


Monday, September 09, 2019

We have two upcoming training days for you. One is an entire day devoted to TMS Business Subscription Tools and the other to discover what is new in TMS products and what is coming! You can choose to attend just one training day or both days.

In-depth training day on TMS Business tools, especially on TMS XData, with the expert himself Wagner Landgraf, architect TMS Business Tools.
For this training the attendees can bring their own laptop to work with and follow examples. Technical facilities are provided.
Limited number of seats available to ensure direct interaction!


Never before so many TMS experts and Embarcadero MVPs have been brought together to update you on the latest advancements in TMS products. On this day, we will also unveil for the first time in public what is probably the most groundbreaking product for Delphi developers TMS is working on since 1995.
Our first sessions have been confirmed with Adrian Gallero, Bruno Fierens, José Léon Serna, Marion Candau, Roman Kassebaum, Roman Yankovsky and Wagner Landgraf.

Tentative agenda with already confirmed sessions

The sessions will start at 9 am.

  • "TMS VCL UI Pack modernized, high-DPI, VCL Styles, new components and new features" by Bruno Fierens
  • "Introducing Flexcel 7.0: what's new & what's coming" by Adrian Gallero
  • "Bringing your Delphi code to a higher level with TMS FixInsight" by Roman Yankovsky
  • "Using TMS Cryptography Pack for secure PDF signing", by Marion Candau
  • "Taking the wraps of our upcoming groundbreaking product for Delphi developers" by José Léon Serna and Bruno Fierens
  • "TMS WEB Core v1.3 for web, PWA and cross-platform Electron apps" by Bruno Fierens and Roman Kassebaum
+ more topics in the works that will be announced shortly

Note: All sessions will be presented in English.

Meet the experts

To maximize the value of this day, the opportunity will be given, as alternative to the regular sessions, to meet each of the many TMS experts available during the full day in person or in very small group to discuss and learn from.

Confirmed speakers

  • Bruno Fierens, CTO of + Embarcadero MVP
  • Roman Kassebaum, architect TMS WEB Core IDE integration + Embarcadero MVP
  • Holger Flick, QA engineer & evangelist + Embarcadero MVP
  • Wagner Landgraf, product manager TMS Business Tools
  • Adrian Gallero, architect TMS Flexcel product line
  • Marion Candau, architect TMS Cryptography + Embarcadero MVP
  • Roman Yankovsky, architect TMS FixInsight + Embarcadero MVP
  • José León Serna, former Embarcadero IDE team lead


This event will take place at Lindner Hotel Airport , Unterrather Str. 108, 40468 Düsseldorf, Germany.

TMS software has chosen for Lindner Hotel Airport as it is 5 minutes from the Düsseldorf International Airport. Lindner Hotel Airport is very easily accessible by public transport.
Facilities for hotel rooms at the event are optionally available for attendees.


Regular price per day: 295 EUR
Dual ticket (for both days): 495 EUR

Seats are limited so don't delay your registration and reserve your seat today!

Get more information or make your reservation here!


We look forward to meet you!

Masiha Zemarai


This blog post has received 5 comments. Add a comment.

Most Recent Post  |  Next Post  |  Previous Post  |  Index List