Stay in touch

Add your e-mail address here to receive the monthly TMS Software alerts.


Product releases
Product articles
Technical articles
Website changes
Software development


<< >>
March 2015

Friday, February 27, 2015

A customer speaks out on TMS components ...

To our big surprise, we found out yesterday a customer gave his feedback in the Embarcadero thirdpartytools forum (nntp://embarcadero.public.thirdpartytools.general) when asked for experiences with our ORM and related products;
The saying is, "a picture is worth a thousand words", but in this case, I would rather say "thousand positive words from a customer are priceless". It speaks for itself that our team was delighted to find out about this posting and it's an incredible motivation and boost to continue the development of our components.

The original post is here in its entirety and unedited:

I can tell you about my experience with Aurelius and other TMS products.

One year ago I started a new project for a ERP and needed to have it in a 
more modernized way. Pretty much the way you intend to do.

I had some goals:

- using modern Delphi language features. I had no need to be compatible with 
anything from previous versions.

- capable of going crossplatform (so it is FIREMONKEY): in my case i have 
an entire ERP running on android :) very nice this. This is important since 
we are now in a multi OS era. There is no guarantee on wich platform will 
remain in 10 years.

- possibility of isolate modules, or even replace them in case of the vendor/open 
source gets out of the market (or just not get more updates)

- something I could understand withou need to be a phD on the area.

I choose the TMS products because they met this parameters for me.

This is my current result:

I have Aurelius as my ORM layer. I have an application based on MVP, so my 
Model part understands Aurelius entities. That are plain simple classes. 
I have created my base class with all funcionality needed and Aurelius does 
the rest.

It is fast, and it is bugs free. I have it working on real conditions for 
1 year now and did not get any problem at all. 

The Idea is simple, the code is modern, and it relies on the new delphi language 

It is compatible with mobile and then you can have all the functionality 
on Android or whatever you need. Using most of the important databases, including 

I am using frames to create the view part of my MVP. I wire everything with 
LiveBInding and Aurelius provides to you a TAureliusDataSet, a fantastic 
TDataSet descendant that publish by several ways the entities you get from 
the ORM.

Right now it is very handy to me, since I have my data prepared on a parallel 
thread and when done it is set to the TAureliusDataSet. The result is a fluid 

You can Edit one entity, a TLIST<> or a Cursor to your database. You can 
access all the properties of your Entity as fields on the Dataset. It is 
very handy to deal with LiveBindings. 

See, since it is Firemonkey this is the only way if not manual). But I can 
tell you, after getting some experience it is reliable and fast enought for 
work based on XE7 


it is the product that permit you connect remotely, you have a server based 
on the http.sys that is the core windows http service and you "write" a server 
based on the documentation. I could add some flavors of my interest of the 
comunication between client and server. (there is another layer called Sparkle 
that is the real http transport here, but just to be simple)

The good thing is that you isolate the native database drivers and you can 
have either mobile using it to connect to your database


I am about to move my application to use it. In my case I am waiting for 
a new feature where I would be capable to use Aurelius over XData. XData 
is a OData standard way to share your data. You create your own server following 
the examples and you can use Aurelius in the server side to create your business 

With eh upcoming feature you will be also possible to use Aurelius with the 
Xdata result. Then you can hide business logic on the server side and publish 
only what is relevant.


This is the way to go for Reporting. It is not only reporting, but for me 
is a fantastic tool.

It has a core based on excel spreadsheet, you can load, create, change, save 
them, in ANY Platform.

But there is a way to use TEMPLATES. So in my ERP i have created XLS templates 
that are embeded on the exe as resources (25k), then I load it and pass the 
Aurelius results from queries based on Linq. The result is commonly a TList 
or can be anything else. But the Entity objects can be directly accessed 
from the Excel Template!

And the good thing is that it works on any platform! it is very fast. Much 
better than FastReports. Easier to work. You can do a lot more, and you can 
even let your customer create Excel templates (wich customer you have that 
does not know how to use them?)
My ERP is already in use on a big chain pilot project. No trouble at all.

I do not work for TMS, but their support was so help ful for me in many cases 
that I have to give you this information.

I am extremelly satisfied. The price is not high for the product benefits, 
and the result is professional.

Any other specific question please let me know...

Eduardo Elias

Well, what more can I say than a big thanks to Eduardo Elias and many other customers who help shape our products every day, 7 by 7, year in, year out and who steer our developments!


Bruno Fierens

This blog post has not received any comments yet.

Add a new comment:
  You will receive a confirmation mail with a link to validate your comment, so please use a valid email address.
Change Image
Fill in the characters from the image above:

All fields are required.

Friday, December 19, 2014

WYSIWYG formatted text & images editor for VCL & FireMonkey

Early this year, our team started the challenging task to create a new component for WYSIWYG editing of formatted text & images for Delphi. From the start, we want to create a control for FireMonkey that would fit neatly the FMX paradigm of one source code to rule all platforms (Windows, iOS, Android, Mac OSX at this time) but realising this would be a huge effort, we wanted that this effort would also be usable for VCL developers targetting Windows only.

After a lot of research was done on performance (as we knew from our experience with other FMX controls this would be difficult) we decided on what we internally disrespectfully call a sandwich architecture. This sandwich architecture should enable us to isolate a core formatted text handling layer from the framework, i.e. the VCL and FireMonkey framework. The benefit clearly is that work on the core only needs to be done once and further evolutions of the core and its maintenance automatically benefits both VCL and FireMonkey framework versions. Visually, this can be seen as:

The core middle layer not only deals with rendering the formatted text and images but also with all the manipulations that can happen with it. Non-trivial areas in this core middle layer abstraction are: dealing with font handling, coordinates and images that are all treated in a different way in VCL and FireMonkey frameworks. Between this architecture and its final implementation is of course lots and lots of hard work both in development and testing. The final result in VCL and FireMonkey platform running on Windows looks like:

TAdvRichEditor : VCL component from TMS Component Pack

TTMSFMXRichEditor : FireMonkey component from TMS Pack for FireMonkey

To whet your appetite to get started with the new editors regardless of what platform or framework you want to use, here is a short feature list:

  • Compact light-weight WYSIWYG editor for formatted text
  • Supports formatted text with bullets, hyperlinks, images, indenting
  • Paragraphs with left,center,right alignment
  • Support for images, plain text and formatted text on clipboard
  • Undo/redo support
  • Find & replace + text highlighting
  • Mailmerge function
  • Printing (on Windows)
  • Exports to .TXT, .RTF, .HTML files.


Bruno Fierens

This blog post has received 6 comments.

1. Sunday, December 21, 2014 at 12:05:56 PM

Hello , does it support gif images ? .

many thanks for these great efforts .


2. Sunday, December 21, 2014 at 2:18:19 PM

Yes, GIF images are supported

Bruno Fierens

3. Friday, January 23, 2015 at 3:57:39 PM

Nice, very nice, found it today in my component pack.

Question: is it possible to print the editor content with Fast Report (V.4 or 5)?

Treichel Udo

4. Tuesday, January 27, 2015 at 5:01:19 PM

Sorry, there is currently no direct built-in FastReport integration. We''ll consider this for a future version.

Bruno Fierens

5. Saturday, February 14, 2015 at 10:14:50 PM

Is it possible to use spelling ?

Olivier Bracque

6. Monday, February 23, 2015 at 8:41:33 AM

The next update will have built-in spell check support.

Bruno Fierens

Add a new comment:
  You will receive a confirmation mail with a link to validate your comment, so please use a valid email address.
Change Image
Fill in the characters from the image above:

All fields are required.

Using the new iOS Sprite Kit from Delphi, a little XMas gift from the TMS team

With iOS 7, Apple introduced the new SpriteKit framework for game development on iOS 7. This framework manages things like graphics, animation, physics, particle effects, gravity, ... all things typically needed for game development. The full documentation for SpriteKit can be found in the "SpriteKit Programming Guide"

We did some research here on using the SpriteKit framework from Delphi XE7 and that triggered the idea of creating a small demo with it in XMas spirit as it is the time of the year for it.

In the little demo, we use an XMas tree with gifts under it as background. This is provided as 4 PNG files, a retina and non-retina version for both portrait and landscape mode. The snowflakes in the demo are particles and therefore we need to create a SpriteKit particle file which can be done from XCode. The SpriteKit particle file contains the PNG for a snow flake and the "snow" particle type is chosen. The result is a .SKS file that is linked as resource with the application.
To make the app a little fun, we added a MotionManager. The snow starts falling when you first shake the device. This is accomplished by handling the motionEnded method at UIViewController level. The motion manager is used to make the snow fall faster according to the angle with which you hold the device. The Delphi TMotionSensor makes this possible.
Finally, to stay in the XMas spirit, we added an MP3 files as resource that plays Jingle Bells as background music.

Video demonstration of the application:

Have fun exploring the iOS SpriteKit framework with the full source code for Delphi XE7* of this gift you can download here.

Note: you'll need to add the SpriteKit framework to the Delphi XE7 IDE to compile the app


Bruno Fierens

This blog post has received 1 comment.

1. Wednesday, December 24, 2014 at 6:36:02 PM

A skiing physics engine would be nice ;-)

A happy new year to TMS, one of the greatest third party component developers in this galaxy!

Aschbacher Peter

Add a new comment:
  You will receive a confirmation mail with a link to validate your comment, so please use a valid email address.
Change Image
Fill in the characters from the image above:

All fields are required.

Wednesday, November 26, 2014

A busy Business week

In the last week we had very busy days. There were two Delphi events happening in Belgium: TMS Business Day, on Wednesday 19th, in Kortrijk, and BE-Delphi, on Thursday 20th, in Antwerp.

On both days we had Wagner Landgraf, the product manager of TMS Business Subscription product line - who flew from Brazil especially for the events - doing presentations about products included in the TMS Business subscription, like our ORM TMS Aurelius, multi-tier TMS XData and TMS RemoteDB, TMS Data Modeler among others. At BE-Delphi, TMS has also done a strong presence with many team members at the TMS booth and a session on multi-tier by Wagner Landgraf.

The most important result of the week was the great feedback we got from the attendees and existing customers. We had time to discuss existing features, future plans for the products, hear suggestions, and most important of all, we have received mostly positive comments about presentations and the products. So thank you all that participated with us! We'll be planning more events on TMS tools in 2015. Let us know where you'd like to meet us and what topics you want to be covered.

TMS Team at BE-Delphi 2014

BE-Delphi 2014 presentation

TMS Business Day 2014


Wagner Landgraf

This blog post has received 1 comment.

1. Thursday, November 27, 2014 at 1:28:59 PM

Very interesting ! Are there any videos ? Have you realese a roadmap about TMS Business subscription products ?

Stefano Barontini

Add a new comment:
  You will receive a confirmation mail with a link to validate your comment, so please use a valid email address.
Change Image
Fill in the characters from the image above:

All fields are required.

Friday, October 24, 2014

TMS XData Service Operations

The latest TMS XData 1.1 version introduces a major feature: Service Operations. In addition to having your objects published as REST resources automatically, you can now add server-side logic in a very easy and straightforward way.

Service operations are defined as interfaces. Any interface can become a set of operations, all you need to do is add the [ServiceContract] attribute to the interface:
  IMyService = interface(IInvokable)
    function HelloWorld: string;
    function FindOverduePayments(CustomerId: integer): TList<TPayment>;
The nice thing is that in addition to sending and receiving values of scalar types, you can also send and receive Aurelius entities. You can also use TStream for low-level operations.

The next step is to write the server logic, which is done just by implementing the interface in some class, and adding the attribute [ServiceImplementation] to that class:
  TMyService = class(TInterfacedObject, IMyService)
    function HelloWorld: string;
    function FindOverduePayments(CustomerId: integer): TList<TPayment>;
function TMyService.HelloWorld: string;
  Result := 'Hello, World';

function TMyService.FindOverduePayments(CustomerId: integer): TList<TPayment>;
  Result := TXDataOperationContext.Current.GetManager.Find<TPayment>
    .CreateAlias('Customer', 'c')
    .Where(TLinq.Eq('c.Id', CustomerId) and TLinq.LowerThan('DueDate', Now))
And that's it. When you create the XData server module, it will find the interfaces and implementations automatically through the attributes, and will make the operations available through the server.

The FindOverduePayments method implementation illustrates how smooth is the integration with TMS Aurelius. The TXDataOperationContext class provides you with some useful properties to implement your server logic. The main property is GetManager, which provides you with an Aurelius TObjectManager.

All you have to do is use the manager to persist objects, or to query objects using the Aurelius full query API. When implementing the server logic, you don't have to deal with database connections (XData uses its connection pool), you don't need to instantiate the object manager, you don't need to deal with memory management and also with JSON serialization.

To invoke the service operation from any client using HTTP, you just POST to the operation address, passing the parameters in JSON format:
POST /tms/xdata/MyService/FindOverduePayments HTTP/1.1
  "CustomerId": 10
XData will parse the parameters, invoke your method, which in turn will use Aurelius to query the database, retrieve all TPayment objects that match the criteria, and return a plain JSON array with the payment objects in JSON format.

Another great thing is if your client is written in Dephi, you can use the TXDataClient class. You can then benefit from the interface you declared and use it at client side as well. Use the TXDataClient to retrieve the interface, and call the interface method. XData will do all the HTTP requesta and JSON conversion for you, and will give you the TPayment objects:
  Client: TXDataClient;
  MyService: IMyService;
  Payments: TList<TPayment>;
  Client := TXDataClient.Create;
  Client.Uri := 'http://myserver/tms/xdata';
  MyService := Client.Service<IMyService>;
  Payments := MyService.FindOverduePayments(10);
  // add your logic that deals with TPayment objects
You can even pass your Payments list to a TAureliusDataset to easily show them in a TDBGrid or any other control that is data aware or using Live Bindings.

You can learn more about XData using the official online documentation. Or you can refer directly to the Service Operations chapter.


Wagner Landgraf

This blog post has received 4 comments.

1. Tuesday, October 28, 2014 at 12:04:17 PM


Will this new feature be used in RemoreDB?

GHAZALI Abdesselam

2. Tuesday, October 28, 2014 at 12:25:32 PM

Hi, I don''t see how this feature could be used in RemoteDB, or the reason for it? RemoteDB is a way to directly access a remote database through http. Note that RemoteDB and XData are just Sparkle modules, you can have as many remotedb/xdata modules in an HTTP server as you want. Nothing prevents you from using RemoteDB for the direct database connection and have XData methods available.

Wagner Landgraf

3. Wednesday, October 29, 2014 at 7:45:49 AM

Thank you for the answer. I''m a little confused ... I''m looking for a way to convert mu current client-server application to n-tier, with smart queries to reduce bandwidth (because large databases).
I just bought Aurelius that helps me for the data CRUD part. I would like something like:
Client (Aurelius ORM) <-> Remote access (internet) <-> Server (Aurelius ORM) <-> Database (Firebird)
I have to focus on Sparke? XData? I am new to the product line, sorry.
Thank you in advance.

GHAZALI Abdesselam

4. Thursday, October 30, 2014 at 1:58:38 PM

In short RemoteDB allows TXDataset to send SQL statements via http to remote server, execute that SQL at server-side and returns dataset data in binary format. XData server in turn allows receiving http requests in JSON format, uses Aurelius on server side to access the database, and return back Aurelius objects in JSON format. If you want to have a more detailed technical discussion, I suggest using our support e-mail or support web forums.

Wagner Landgraf

Add a new comment:
  You will receive a confirmation mail with a link to validate your comment, so please use a valid email address.
Change Image
Fill in the characters from the image above:

All fields are required.

Previous  |  Next  |  Index

Copyright © 1995 - 2015 TMS Software v4.0