Any opinion on RAD Server vs Node.js/LoopBack vs TMS XData vs other?

Interesting thread still: [WayBack] Any opinion on RAD Server vs Node.js/LoopBack vs TMS XData vs other? – Kyle Miller – Google+ Tools mentioned there (not limited to Delphi): From Database to Web App through REST server with TMS XData and TMS Web Core [WayBack] GitHub – andrea-magni/MARS: MARS-Curiosity Delphi REST Library [WayBack] GitHub – jeffknupp/sandman2: Automatically generate a RESTful API service for your legacy database. No code required! [WayBack] mORMot/RESTserver.dpr at master · synopse/mORMot · GitHub –jeroen  
Read More

Support is a built-in feature of TMS products!

At TMS, we are a team of software developers, developing software for software developers.
We do exactly the same as our customers are doing, that is developing software. And so we know all too well that when we are stuck with something, a fast helping hand is much appreciated.

That is why giving good and fast support is high on our priority list. That is why all our products come with minimum one year free support and free updates included. Yes, it is standard included in the product price, no extra costs at all, no limit on the number of questions!

Our support is handled in two ways: via a support online forum and by direct email for those who prefer a direct and private conversation.
For reasons of efficiency and quality of the support there is a very short line to the experts of the specific product support is asked for. In many cases, a direct dialogue is possible with the product expert.

On a daily basis, our support is standby for answering your questions about:

  • your account, licensing conditions, purchasing products, renewing licenses
  • doubts about product features, supported operating systems, supported IDEs
  • issues with installing products
  • doubts about a specific behavior in the product
  • advice for achieving a high performance implementation with our products
  • a problem, bug, unexpected behavior in a component

From time to time, our support is also contacted to request new product features or even new products. We very much welcome such questions and these have over the years steered the development of products in a significant way. For such suggestions, we enter in dialogue and make a judgment whether there is an estimated wide interest for a specific feature or not. When there is a wide interest, in many cases we take up the requested feature in the planning for a new development cycle of a product. When the request is very specific or of use only to a very small group of customers, we propose to deliver it as a custom paid development project.

We strive for satisfactory answers and solutions within 24hrs on work days. We’re glad to report that our statistics show we achieve this goal for over 80% of the questions!

Thinking about the words of the painter and genius Salvador Dali “Have no fear of perfection, you will never reach it”, we reflect on how we can get this number of 80% even higher.

That for sure is a challenge, given the technology landscape certainly didn’t become easier. Where in the early days of our company, we had only a few Delphi or C++Builder versions to support and one operating system Windows XP, these days there is a myriad of technology to deal with. Ever changing and updating operating systems Windows, macOS, iOS, Android, Linux. Always evolving browsers Chrome, Firefox, Opera, Safari, Edge. Cloud services we interface with that changes APIs. A vast amount of different SQL and noSQL databases. And so on… The number of combinations, parameters, versions, … is mind boggling. In a follow-up blog, we’ll discuss how the process of delivering fast & quality support in a complex technology landscape can be achieved with your help.

Without a doubt, you also have ideas, suggestions, feedback or comments about support in general, so we look forward to hear about these.

Read More

Read More

Happy Birthday Delphi!

Time flies as today we already celebrate the 24th birthday of Delphi. The past 24 years have been an amazing, adventurous and always exciting voyage!

Looking back at 1995, Delphi was nothing short of a dramatic breakthrough in productivity for software development.

Before, I still remember that creating a Windows application created with Turbo Pascal for Windows also required having the Resource Workshop tool ready. We’d typically create dialogs and other resources via the Resource Workshop. And then came the tedious process of linking the UI control logic to the elements on the dialog via IDs. One mismatching ID and the dialog would be broken. Other than this, we merely had to use the Windows API to achieve even the smallest UI feature.

Then came Delphi. No more need for Resource Workshop. Direct usage of the Windows API could be dramatically decreased as Delphi introduced the integrated form designer and more importantly the UI control model mapping on existing Windows controls but also open to extend and create custom controls, seamless binding to a database and even live design-time data. In a nutshell, us, Pascal developers could create Windows applications 10 times faster with 10 times more features.

The next 24 years continued that quest for packing ever more programming productivity and reaching out to new targets. Soon Win32 support was added in Delphi 2. The world of web development opened with the inclusion of the breakthrough product IntraWeb from Atozed. Ever more out of the box support for all kinds of databases, multi-tier development and internet server development found a place in successive Delphi releases. It was waiting till 2009 for the breakthrough to add Unicode support and 2011 to bring the power of Delphi to the 4 major operating systems: Windows, macOS, iOS and Android. We conveniently skip the short passages of bringing Delphi to Linux with Kylix and to the .NET framework world with Delphi 8

In a fast moving and ever changing technology landscape, one could wonder why someone can have this passionate relationship with Delphi?

For a change, let’s try to find an analogy with real estate instead of with cars 🙂 The three most important things when looking for real estate are: “Location, Location, Location”.

So, the three most important things for a Delphi developer are:

  • Component model: abstracting technology and allowing to focus on business problems instead of technology
  • Component model: allowing code reuse among developers in the team, across applications and across platforms
  • Component model: providing an access to 3rd party code libraries in a consistent way

There are of course many more virtues to the Delphi language, IDE and ecosystem and things to be passionate about. Backwards compatibility is one such example and a natural, expressive non-cryptic language is another one. Very fast compile times to facilitate quick debug cycles. The list goes on. Let us know your most loved Delphi features!

In these 24 years, TMS software evolved along with Delphi also quite a bit. Where in 1995, it was just “me, myself and I” encapsulating code in components initialy mainly for reuse in my own consulting projects, TMS has grown into a unique and fantastic team I am truly proud of!

Nothing is more fun than brainstorming with like-minded enthusiast experts about how we could make the Delphi developers even more product or reach into new territories. With every new introduced technology in Delphi, we jumped on the wagon and created components for it. Yes, back in the days, we even had our grid working in Kylix and also for Delphi for .NET . More succesful projects were the creation of a suite of UI controls for IntraWeb, the first FireMonkey components on the market for cross platform development, the leading Delphi ORM Aurelius, the REST server technology via XData, … the list is endless. Last year we introduced a new framework for developing in a really RAD way from the Delphi IDE rich & modern web client applications using our beloved language with TMS WEB Core. This goes hand in hand with our FNC UI control developments enabling to use one set of UI controls not only in VCL, FMX, LCL applications but also for TMS WEB Core web applications. And for the backend of the web applications, this integrates nicely and smoothly with our TMS XData REST server technology.

But it is not all new technology all the time. We continue to take great care, enhance, extend, improve and polish very widely used flagship products like TMS Component Pack, our set of over 400 VCL UI components that saw its life back in 1998. Especially for the birthday of Delphi today, we released an update with all latest improvements. Of course, active registered users get this update free, for users with an expired subscription we have discounts to renew and for new users we have this week a 20% discount! See our other blog post for details!

Have a great Delphi Birthday today!

Read More

Read More

Igniting the passion for Delphi for future generations

A local school in the town where the TMS office is located organized last week for the kids a project where they could experience an entire day in a working place they dream of for their future career.
We had the pleasure to welcome Obama in our office. Obama is an 11-year-old boy who would love to become a software developer. We at TMS Software offered him the opportunity to follow us for a day and see what it takes to be a software developer. To inspire Obama and raise the interest of the next generation, we wanted to show Obama what a great variety of platforms we could tackle with our beloved tool Delphi and our frameworks. And what better way to captivate the youth then to create a game?

We choose the code-breaking game Mastermind that was invented in 1970 by Mordecai Meirowitz.
For those who don’t know the game, the purpose is to guess the code created by your opponent, or in this case the computer, by using four colored pegs. There are six colors to choose from and after each guess the opponent gives feedback on how many colors are correct and how many colored pegs are in the right position. In our game we decided that the red mark would indicate that the peg was in the correct place and a white mark if the color was used in the code, but not on the position you’ve guessed. To make it a little easier, we’ve also made sure that the colors are only used once and no empty spots are in the pattern.

If you already want to play our game before we explain how everything works, you can do this at

As we wanted to show the power of our components and use it on almost every platform on the planet, it was a logical choice to work with our FNC components. This way we can use the same codebase to create a VCL, FMX and web application. A progressive web application to be precise. The advantages for a PWA application are clear:
– The application has a responsive design, this means that it adapts automatically to the device screen so it looks good on mobile and desktop.
– It is aware of status, it continues to work also when you are offline.
– You can install the application on mobile devices and Chrome OS, without going to a censored application store.
– It looks like a native application running full-screen with access to the hardware.
The only remark here is that it should initially be accessed via HTTPS. As you can see on both pictures below an example where you can see the web application on the left and then the downloaded app on the right which is launched as installed app and is running full-screen and offline.

So, a TMS web progressive web application is the best way to let Obama show what he built to all of his friends and family. It is as easy as sharing the link to play the game in an internet browser and you can also download and install it on your phone or tablet to have it available even when you are offline or want to save some mobile data.

To put the icing on the cake, we didn’t just create the game as progressive web application. This served also as a proof of concept to create a TMS Electron project created in Delphi from the same source code! This technology is in development in our lab and this will be part of the TMS WEB Core 1.2 Padua release. It allowed us to have an out-of-the-box working and installable desktop application for Windows, macOS (macOS 64-bit app to be precise), and on Linux in a matter of minutes. Here are some screenshots of this cross platform TMS Electron desktop application on Windows, macOS and Ubuntu. As we guess that many of you are eager to work with this awesome technology, we are working hard to make a TMS WEB Core 1.2 Padua Beta release available as soon as possible to our TMS ALL-ACCESS users.

Now to get to the programming. We started with the idea to create a control for one entry containing the four colored pins, a check button and the four markers that evaluate your guess.

A quick look in the wide range of FNC UI components we’ve already available, learned us that the TTMSFNCBitmapSelector looks the most similar component to what we want to create. So we took the custom FNC component this TTMSFNCBitmapSelector was derived from and started with the TTMSFNCDefaultSelector. This would be the basis for our FNC UI component TTMSFNCMasterMindControl. We built the board by creating 12 of our UI controls and placed them underneath each other with the use of top align.

It took us no effort to evenly space everything horizontally or to scale everything when the window is resized, as this is already done in the class TTMSFNCDefaultSelector. We just had to draw our images and the first line was already visible on our screen.

To get a little more in detail. We’ve created one row with five columns, where we use images to draw the four pegs with one TTMSFNCBitmapContainer, which contains the images for all the colors. The public property DataInteger that exists for every TTMSFNCCustomSelectorItem in the TTMSFNCDefaultSelector is used to hold the value of the selected color. The “Check” is just text shown in the item and the four check markers are drawn via TTMSFNCGraphics, where we just calculate the optimal size to draw four circles and fill the color of the ellipsis according to the number of correct pegs.
Then we checked how the interaction with mouse, keyboard and touch could be realized to ensure the game can be played on a variety of devices. With mouse or touch, consecutive clicks on each of the 4 positions cycles through the colors. We’ve added navigation between positions with the left and right arrow keys and cycling through color per position with arrow up and down. This UI behavior was again fairly easy to implement due to the fact that most of the behavior was already in the superclass.
We use the left and right arrow keys to navigate within our own control and as you can see below, you have the prove that this is very simple as the GetPreviousSelectableItem and GetNextSelectableItem are both functions from the TTMSFNCCustomSelector.

procedure TTMSFNCMasterMindControl.HandleKeyDown(var Key: Word;
  Shift: TShiftState);
  dataInt: NativeInt;
  case Key of
    KEY_LEFT: SelectedItemIndex := GetPreviousSelectableItem;
    KEY_RIGHT: SelectedItemIndex := GetNextSelectableItem;
        if (SelectedItemIndex >= 0) and (Items.Items[SelectedItemIndex].DataString = 'image') then
          dataInt := 1 + Items[SelectedItemIndex].DataInteger;
          if (dataInt > 6)then
            dataInt := 1;
          Items[SelectedItemIndex].DataInteger := dataInt;


The code to change the peg color from the mouse up handler override is:

procedure TTMSFNCMasterMindControl.HandleMouseUp(Button: TTMSFNCMouseButton;
  Shift: TShiftState; X, Y: Single);
  dataInt: NativeInt;
  if Enabled then
    if (SelectedItemIndex >= 0) and (Items.Items[SelectedItemIndex].DataString = 'image') then
      dataInt := 1 + Items[SelectedItemIndex].DataInteger;
      if (dataInt > 6)then
        dataInt := 1;
      Items[SelectedItemIndex].DataInteger := dataInt;

We use the up and down keys to change the public DataInteger property of the selected item of type TTMSFNCCustomSelectorItem which changes the bitmap image of the selected peg in our DrawItemContent function.
The code is:

procedure TTMSFNCMasterMindControl.DrawItemContent(AGraphics: TTMSFNCGraphics;
  ADisplayItem: TTMSFNCCustomSelectorDisplayItem);
  di: TTMSFNCCustomSelectorItem;
  idx: Integer;
  bmp: TTMSFNCBitmap;
  pt1: TPointF;
  checkPinsRect: TRectF;
  side: Single;
  i: Integer;
  tempPCorrect: Integer;
  tempCCorrect: Integer;
  w, h: Single;
  s: string;
  di := ADisplayItem.Item;
  // draw the peg using a bitmapcontainer image
  if Assigned(di) and (di.DataString = 'image') then
    idx := di.DataInteger;
    AGraphics.BitmapContainer := BitmapContainer;
      case idx of
        1: s := 'red';
        2: s := 'blue';
        3: s := 'yellow';
        4: s := 'orange';
        5: s := 'green';
        6: s := 'purple';
        else s := 'empty';
    AGraphics.DrawBitmapWithName(ADisplayItem.Rect, s);
  // draw the score
  if Assigned(di) and (di.DataString = 'check') then
    w := ADisplayItem.Rect.Right - ADisplayItem.Rect.Left;
    h := ADisplayItem.Rect.Bottom - ADisplayItem.Rect.Top;
     if(w  0) then
         FTColors[i]:= gcRed;
       else if (tempCCorrect > 0) then
         FTColors[i] := gcWhite;
         FTColors[i] := gcNull;
     // Mastermind row is active, so use active color
     if (Enabled = true) or (FPosCorrect = 4) then
       AGraphics.Fill.Color := activeColor;
       AGraphics.Stroke.Color := activeColor;
       AGraphics.Fill.Color := boardcolor;
       AGraphics.Stroke.Color := boardcolor;
     // draw 4 score circles in correct score color
     AGraphics.Stroke.Color := gcBlack;
     checkPinsRect := RectF(ADisplayItem.Rect.Left + 2, ADisplayItem.Rect.Top + 2, ADisplayItem.Rect.Left + side - 2, ADisplayItem.Rect.Top + side - 2);
     AGraphics.Fill.Color := FTColors[0];
     checkPinsRect := RectF(ADisplayItem.Rect.Left + 2, ADisplayItem.Rect.Top + side + 2, ADisplayItem.Rect.Left + side - 2, ADisplayItem.Rect.Top + (side * 2) - 2);
     AGraphics.Fill.Color := FTColors[1];
     checkPinsRect := RectF(ADisplayItem.Rect.Left + side + 2, ADisplayItem.Rect.Top + 2,  ADisplayItem.Rect.Left + (side*2) - 2, ADisplayItem.Rect.Top + side - 2);
     AGraphics.Fill.Color := FTColors[2];
     checkPinsRect := RectF(ADisplayItem.Rect.Left + side + 2, ADisplayItem.Rect.Top + side + 2, ADisplayItem.Rect.Left + (side*2) - 2, ADisplayItem.Rect.Top + (side * 2) - 2);
     AGraphics.Fill.Color := FTColors[3];

As a last part we just had to implement some code to check the pattern and return an event if we did a guess. We then disable the FNC UI control for the active row on the board and enable the next row so we can move to the next step.
And that’s all for the component used in the game. Now we just have to create the form of the progressive web and Electron application and everyone can play the game anywhere, anytime.
Just to show the power and the time we gained by using one of our custom FNC components, we’ve also created a VCL and FireMonkey application with the same code.

To conclude, Obama was very proud of the game he helped creating and named ‘oBama mind’ and he showed it to all of his classmates. We hope that this way, he could transmit the passion for software development to his classmates and inspire a future generation of Delphi developers. To
illustrate the scope of this type of development with TMS WEB Core, Obama even showed it to his friends on his PlayStation 4, where you can play it on the built-in web browser. He said that now he is even more certain he wants to become a software developer!

We are one step closer to a future where Pascal programming is guaranteed.

The full source code for the Mastermind game that you can compile as VCL, FMX or Web core application is available for download.
As soon as TMS WEB Core v1.2 Padua will be released, you will also be able to compile it as an Electron Windows, macOS or Linux desktop application.

Read More

Read More

TMS specials for Delphi’s 24th birthday on Valentines day

Delphi 1.0 was released on Feb 14, 1995 and celebrates its 24th birthday this year.

Also for TMS software, these 24 years were extremely exciting. Where we were developing VCL UI controls for 16bit Windows applications in 1995, we meanwhile have per monitor high-DPI enabled VCL UI controls for Win64, cross-platform FMX controls for Windows, macOS, iOS, Android, web UI controls for IntraWeb, an ORM TMS Aurelius and REST server products like TMS XData or our TMS WEB Core web client framework!

Delphi was, is and remains a language, IDE and development community we are passionate about. To share the love and passion and celebrate, we have this week discounts for you!

On top of our regular low prices you receive an extra 20% discount on new licenses! Enjoy these super discounts all week long!

To take advantage of these super deals, just use the following coupon code: Valentine 2019

Special 20% discount

  • TMS WEB Core

    TMS WEB Core enables to build modern web client applications following the single-page architecture that also other modern frameworks like Angular, vue.js, React employ..
    TMS WEB Core is offered at 395 EUR. But this week you get 20% extra discount, so for 316 EUR only.

  • TMS FNC Component Studio

    With this bundle you have the freedom to create powerful apps of your choice. Separate purchase of the products will cost you 460 EUR. This bundle is offered at 295 EUR, but this week you can get this for discount price 236 EUR.

  • TMS Component Pack

    Create modern-looking & feature-rich Windows applications faster with over 600 components in one money and time saving bundle for Delphi & C++Builder.
    Regular bundle price is 295 EUR, but only this week you get extra 20% discount on this bundle, so this is 236 EUR only!

  • TMS Business Subscription

    TMS Business Subscription is our bundle framework that includes: TMS Aurelius, TMS XData, TMS Scripter, TMS Data Modeler, TMS RemoteDB, TMS Echo, TMS Diagram Studio and TMS Workflow Studio. You can purchase your license for regular price 395 EUR. But this week you can get your license for 316 EUR only!


    TMS ALL-ACCESS is our no-nonsense bundle, where you get all our components for just 1695 EUR, instead of 5870 EUR. And yes on top of that you get 20% extra discount this week! So you can get all our components for 1356 EUR.

Plaese note: discounts are valid on new licenses only!

Our team looks forward to your suggestions, feedback and likes to be challenged by things you want to see realized with TMS products!

And also do not forget to like and follow us on Facebook and Twitter for more discounts.

Read More

Read More

Get the Most out of Android with 10.3 Rio

Today, I have a webinar on Getting the Most out of Android with 10.3 Rio. I want it to be a bit of a State of Android development today, as well as a What’s New in 10.3 Rio for Android. During CodeRage 2018 presented on what’s new in 10.3 Rio around Android. That session evolved into this webinar. You can register now to join the webinar on Feb 6, 2019 at 12:00 PM CST (UTC-0600) or you can follow along with the slides here. .embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } I’ll update this post with code and other downloads after the webinar.
Read More

keyman/DevDelphiStarterCompileWrapper.pas at master · keymanapp/keyman

Cool: bds.exe -ns -b projectname.dproj will build a project from the command-line. Should work in Starter Edition (and the now defunct AppMethod). [WayBack] keyman/DevDelphiStarterCompileWrapper.pas at master · keymanapp/keyman. Via: [WayBack] Question: is there any chance Embarcadero would reconsider and stop blocking the use of the command line compilers for Starter Edition?I run an open s… – Marc Durdin – Google+ –jeroen
Read More

DeltaChat Messenger

DeltaChat is a messenger that uses email as the transport medium, so potentially almost everybody already has an account for it. Today, a they announced a new release, not only for the existing Android app but also for Desktop (Mac and Linux only so far) and iOS. I think that is a very interesting project since it does not require yet another central server. It also supports encryption using the Autocrypt Level 1 standard, if both ends use DeltaChat. It is possible to use the same protocol (but without encryption) between DeltaChat and a regular email program. In my tests with the older Android release it worked well. I created a new email address specifically for DeltaChat. That’s what I would suggest to everybody who wants to use it. I plan to replace Google Hangouts with DeltaChat when Hangouts gets shut down later this year. But I would need a Windows client first.
Read More

2019 ADUG Symposium

2019 Symposium Event Update The Australian Delphi Users Group are hosting the 2019 ADUG Symposium in March this year. Canberra – Thursday 21st March 2019 Melbourne – Friday 22nd March 2019 Click here for Full Details and Registration Presentations Jim McKeeth – Embarcadero – Android and Enterprise Connectors Malcolm Groves – Code Partners – A Practical Introduction to Docker Alister Christie – Learn Delphi TV – A Better Way to Code in Delphi Glen Kleidon – Modernising Your Delphi Web Server Philosophy: Why doesn’t it all just work out of the box?… Continue reading ›
Read More

IDE Fix pack for Rio development snapshot – via Delphi-PRAXiS [en]

If you dare using Delphi 10.3 Rio instead of waiting for Update 1 to stabalise (and hopefully speed up things), you might want to try the development snapshot of [WayBack] IDE Fix pack for Rio – Page 2 – Delphi Third-Party – Delphi-PRAXiS [en] that got released last week (thanks Andy!): A new development snapshot of IDE Fix Pack for 10.3 Rio is available. The Win64 (DCC64) and Android (DCCAARM) compiler patches should now work as excepted. Changes: Added: Support for Delphi 10.3 Rio Added: Fix for TStringList.IndexOfName bug (RSP-21633) Added: Fix for access violoation in the Welcomepage JScript9.dll binding Added: TCustomListBox.ResetContent is skipped if the handle isn’t created yet Added: DFM Streaming optimizations Added: FillChar uses Enhanced REP MOVSB/STOSB cpu feature if available for large sizes. Added: Enabled CPU LOCK string assignment optimization for local variables Added: -Oe (experimental optimizations) and -x-cgo compiler option extension (Remove of some unneccessary push/pop operations) Added: Expression Evaluator allows array access to pointers even if the type wasn’t declared with {$POINTERMATH ON} Added: New compiler option extensions: -x–compileonly, -x–reslist, -x–depfile, -x–unitstats Added: More performance optimization for the DCC64 compiler Added: TStringBuilder.SetLength optimization [RSP-19178] Added: TStrings.GetDelimitedText optimization Fixed: Packages with duplicate units may not have caused a fatal compiler error. IDEFixPackD103Reg64.7z fastdccD103vDev.7z Related: [RSP-21633] TStringList.IndexOfName may not find a name that is in the list when Sorted = True – Embarcadero Technologies [RSP-19178] TStringBuilder.SetLength is unneccesarily slow – Embarcadero Technologies –jeroen
Read More