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


<< >>
January 2015

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 4 comments. Add a comment.

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. Add a comment.

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. Add a comment.

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. Add a comment.

Thursday, September 25, 2014

Hands-on TMS Business Subscription training day

TMS software organizes on Wednesday November 19th a hands-on training day on our TMS Business Subscription line of tools in Kortrijk, Belgium.
All day, sessions will be spent on our ORM, data modeling and remoting tools TMS Aurelius, TMS Data Modeler, TMS RemoteDB, TMS XData, ... with sufficient time for your questions and room for interaction to help you getting the maximum out of these TMS tools. The sessions will be given by Wagner Landgraf, the product Manager of TMS Business Subscription. Bring your laptop if you want to follow the samples live or if you want our expert to have a look at your implementations

Tentative session program
  • 09h00-09h30: Registration & coffee
  • 09h30-10h30: TMS Aurelius
  • 10h30-11h00: Q&A
  • 11h00-11h30: Coffee break
  • 11h30-12h00: TMS Data Modeler & TMS Aurelius
  • 12h00-12h30: Q&A
  • 12h30-13h30: Lunch
  • 13h30-14h30: TMS XData
  • 14h30-15h00: Q&A
  • 15h00-15h30: Coffee break
  • 15h30-16h15: TMS RemoteDB & additional tools
  • 16h15-17h00: Discussion, architecture approaches, Q&A
Registrations until October 31st
The cost of the hands-on TMS Business Subscription training day is 75EUR for TMS Business Subscription users and 125EUR for non TMS Business Subscription users. This includes a full day access to the sessions and coffee/lunch during this day. The extra 50EUR for non TMS Business Subscription users will be deductible from any TMS Business Subscription purchase. Don't delay your registration as the number of seats is limited to 10 persons for a maximum interactivity!

Signup here via the online registration form


  • Kennedy Hotel, Pres. Kennedypark 1, B-8500 Kortrijk
  • Free parking
  • Nearby highway (E17) exit
  • Facilities for hotel rooms at the event are available for international attendees


Bruno Fierens

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

Previous  |  Next  |  Index

Copyright © 1995 - 2015 TMS Software v4.0