Blog Options


<< May 2019 >>



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

More service than ever for Delphi development with TMS certified consulting partners


Wednesday, May 29, 2019

Over the past couple of years, it has become clear to us that for many individual software developers and in many companies where Delphi is used as the main software development tool, the challenges have not become easier:

  • It is not easy to find software developers, let alone good Delphi developers
  • Where Windows knowledgde was fine 10 years ago, these days knowledge of macOS, iOS, Linux, Android, web technologies is mandatory to be relevant
  • Architectures are shifting towards microservices based backends, use of push notifications etc...
  • There are more highly complex libraries, SDKs, REST services, components than ever to choose from
  • ...

It has always been the goal of TMS software from our first days to deliver easy to use software components that take out a lot of deep technical challenges out of software development and allowing our users to focus on the business logic. While we also always aim to deliver fast & professional support services for our components, the needs of our customers also often exceed what regular product based support can offer. We see more and more customers wanting:

  • Assistance in setting up new architectures
  • Outsourcing specific component integrations or entire project developments
  • On-site training & consulting
  • Migrations of existing projects to unicode, cross-platform or web
  • Temporarily extra resources for projects
  • Help in getting started entirely new web projects with TMS WEB Core and/or FNC components
  • - ...

Therefore, we've started our network of TMS certified consulting partners. 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. Important is the presence of these partners in the same time-zone, speaking the same language, directly reachable by phone or in the office.

We have created a special landing page for our partners where you can find a partner nearby. With this launch, we can already present 5 TMS certified consulting partners in 3 continents: FlixEngineering in the USA (English), our branch in Brazil for South America (Portuguese & English), C-Quel for the Benelux (Dutch, French, English), Kassebaum Engineering for Germany, Swiss, Austria (German, English) and Softacom for entire Europe (English, Russian). We have added the areas of expertise of our different consulting partners on the landing page. While our consulting partners have expert level knowledge in Delphi and our components, there is also a direct line and close collaboration with our development team. So, our partners are always backed by our component development team and have an insight in our internal developments, upcoming products, ... so the partners can at all times make the best possible & well-informed decisions for helping Delphi users.

Visit the partners landing page for more information and details!

We also plan for extending our network of consulting partners in the coming months and years. Especially in the areas of Asia, Australia, South Europe, South Africa where there is also a lot of Delphi development with TMS components going on. If your organisation is interested in becoming such partner, feel free to reach out & discuss.

One thing is clear, as a Delphi developer working with TMS components, you are never alone. Your projects with Delphi and TMS components are guaranteed for success with our team that is always ready for excellent component specific support via email or our forums and our partners offering a wide range of services beyond this.

Bruno Fierens


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

TDbAdvGrid: Common mistake when adding records using the grid


Monday, May 27, 2019

There are always subtle differences when you compare the standard VCL components to their much more feature-rich counterparts from profressional component sets.

When you start using TDBAdvGrid in your database projects you will definitely run into the “issue” that will I describe here. The biggest annoyance when encountering this is that you basically will start looking for a fix to the problem in the wrong place as you never expect the issue to be related to the setup of the visual component.

My form setup is pretty simple: VCL application. I have two visual grid components hooked up to the same TDatasource, which is connected to a TFDQuery.

TDBAdvGrid from TMSSoftware on top, TDBGrid on the bottom.

The data being edited is also quite simple: An item number is associated with a pack name and a theme name. The values for the combo box are being pulled from yet other queries (lookup fields), but this is not to be the focus of this post.

Compiling this for the first time will immediately yield different results. You will be able to enter data in the TDBGrid. Furthermore, you will be able to add more records to the already existing list, i.e. append and edit operations are both enabled by default. However, this is a very easy fix. TDBGrid behaves according to the TDatasource which is set to AutoEdit by default. Thus, the user may edit and append.

TDBAdvgrid introduces another level that can be configured. In order to be able to edit the dataset, you need to set “goEditing” of the “Options” property to “true”:

If you restart the app now, you will be able to edit the already existing values in the TDBAdvgrid. Still, you will not be able to add any values. Yes, you may bring a TDBNavigator or similar component into the mix. But entering values is supposed to be quick and efficient for the user. He needs to be able to keep his focus on the grid. Thus, we find in the “Navigation” property the setting “AppendOnArrowDown”. Perfect, exactly what we need.

Done. … or are we?

If you try to append a value at this point, the grid will offer a new row to enter values:

Entering “71220” is possible, but in no way you will be able to select anything else. As soon as you leave the cell, the row “disappears”. It also does not show up in the second grid as an incomplete record. It simply disappears.

If you are like me, you question your setup of the query, datasource and connection immediately. Is the query set up correctly to post the values correctly? Due to the fact that I had lookup fields involved, I started checking those as well. Of course, I realized that the underlying DBMS does not accept tuples that lack the association to pack and theme. This is all correct, but why does the component not allow me to make the selection first?

To make things worse, I did not have the luxury of a TDBGrid on the same page when I implemented this. That was the n-th step for me to see what was going on. As soon as I realized that things turned bad as soon as the cell in the TDBAdvGrid was left, I remembered.

Quote from the developer guide:
TDBAdvGrid can perform editing in two modes. This is selected by the property DBAdvGrid.EditPostMode. When this is set to epCell, this means that the value that has been edited is posted immediately to the database when a cell leaves inplace editing. When DBAdvGrid.EditPostMode is set to epRow, this means that a Post will only happen when all cells in a row have been edited and the user moves to another row. Typically, for tables with various required fields, the epRow setting is the preferred setting.

The non-default behavior is exactly what I need in my case. I need the row to be posted when all the fields have been entered.

So, I changed the property EditPostMode to ‘epRow’. And … all worked as I wanted it to work in the first place.

As a general rule when working with visual components that are linked to database queries or tables, it is always good to be aware of the effects the visual component and the associated user interaction with that component might have on the underlying dataset.

This is a very good example where flexibility and comfort require some additional thought how to configure the post operation. I am really struggling not to link to the obvious Spiderman quote here….

(For anyone wondering what the sample data refers to: it refers to available LEGO Dimension character and item packs…)

Holger Flick


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

Video: Accessing any Delphi compatible database through a REST API using SQL


Monday, May 20, 2019

I have expressed this before, but Delphi is and will hopefully always be the number one programming language for database-driven applications. The architecture that has been there since Delphi 1 is still standing strong. Of course, there has been need for change to the database drivers, due to technological advances. However, at the inner core the classes TDataset and TDataSource as still standing strong.

Web Applications, multi-platform development, and mobile platforms make it necessary to introduce a layer in between the database and the application. Web Services producing JSON formatted data following the REST principle have become the pseudo-standard. As a side-note, REST is still not a standard and only a principle.

SQL is still the database query language that developers feel most comfortable with. The Web Service Layer introduces an insurmountable challenge for many. Thus, there are more frameworks than sand at the beach to facilitate the process. TMS Software offers a straightforward, affordable solution if you need to build a Web Service API with JSON called XData. If you look for performance, no need for JSON and a quick way to migrate your database project use RemoteDB from TMS instead.

For the case that you need a REST API with JSON support, I recorded the following video. It teaches you how to hook up any database supported by Delphi to the web service. You will then be able to offer any SQL query as a result for the web service. Further, you can even use parameters.

Stay tuned for more video content about RemoteDB. An even quicker and more efficient solution to provide abstract database support to your client applications. Abstract database support means in this case that the client is unaware which database you use and also will not need the database driver technology to access the data.

The video will explain step-by-step how to:
  • Create a web service with XData
  • Add the database connection to a FireDAC database
  • Add the database query
  • Add a service for the SQL queries
  • Write a VCL Forms client that displays the data
Be aware of the fact that the client will not need any XData-specific components.


The VCL client actually does not need to create the TStream instance as the XData framework does that. Thus, the correct client-side code is this:

LStream := LService.GetSchools as TMemoryStream

There is no need to do anything else with LStream.

Holger Flick


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

Video: Google Maps with Style


Wednesday, May 15, 2019

Google Maps has become a very popular means to include mapping in business applications. In Delphi, we can use components from TMS Software that facilitate the use of the Google Maps API using Delphi components. Using the Google Maps API with these components is like using any other Delphi control.

The controls are available for:
  • VCL
  • FireMonkey (FMX)
  • Web (both TMS Web Core and IntraWeb)

Recently, Google introduced Map Styles. The style does not only refer to colors but also to content. You can define what is displayed and how. Further, the Google Maps API now comes with a “Night Style” for map display in dark user interfaces.

So far, TMS updated the VCL and FireMonkey controls to support styles. The following video instructs you how to:
  • Make use of pre-defined styles
  • Create your custom styles with the Google Style Designer
  • Use styles created by other Google Maps users

Holger Flick


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

Why We Chose to Use TMS Components in AlignMix


Tuesday, May 14, 2019

Choosing which components to use in your application is an important decision that warrants careful consideration. Wrong decisions can be costly.

We’ve been using Delphi to develop applications since Delphi 1.0 back in 1995; and before that Turbo Pascal. All our applications help companies manage their sales teams. Over the years we’ve made mistakes when selecting component vendors. From these mistakes we’ve learned our lesson. When we started developing AlignMix, our flagship sales territory mapping application, we had a clear set of principles for choosing which components we’d use. To give you some background, AlignMix was launched in 2016 and now has over 5,000 users. It has a minimalist design, with strong focus on delivering a beautiful user experience for our corporate clients.

Here’s our guiding principles:

1. Avoid Freeware:

This one is a little controversial since many developers prefer open source over closed source. But in our experience the Delphi world is full of hobbyist who create great components, make it freeware, develop it for a few years and then move on as their priorities change. Even if the source is available, we don’t want to spend our time maintaining someone else’s code. It’s different if the project has a large community of developers, but this is rare in the world of Delphi.

2. Partner with Companies Who Are Committed to the Delphi Platform:

We prefer to choose component developers who are clearly committed to Delphi. We don’t want to use components from companies that only dabble with Delphi. We want a company where the leadership is always thinking about new ways to help the Delphi community. This is one area where TMS really shines. I don’t know of any component vendor that is more committed to the Delphi platform than TMS.

3. Look for Companies that Quickly Support New Versions of Delphi:

It’s frustrating when a shiny new version of Delphi is released but you’re not able to upgrade simply because a component vendor takes its time to support the new version. Once again TMS is brilliant at quickly supporting each new version of Delphi. As soon as a new version is released you can be sure TMS will almost immediately publish a timetable showing when each of their products will support the new version.

4. Minimize the Number of Component Vendors You Use:

If you follow principles 1 to 3, you’ll most likely end up choosing just a few component vendors. That’s what we’ve done. And we’re reluctant to add any more. Thankfully TMS has a comprehensive range of components that cover almost all our needs. Look at the screenshots to see how they are used in AlignMix. We trust Bruno and his team and will be working with them for the foreseeable future.

If you’d like to see AlignMix you can find out more on the website.

Author: Steve Maughan

Masiha Zemarai


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

The Story of an intern at TMSSoftware


Monday, May 06, 2019

Hello, this is the intern speaking (or writing) about his experience at TMSSoftware. I’m a second year graduate student in programming-informatics who has been given the opportunity to do my internship here at TMSSoftware.

Getting started

My first week starting here was interesting as I had no real background experience in Delphi or Object Pascal, as the primary languages I learned at school were Java and C#. Thankfully, I had a lot of resources available, which includes the Object Pascal Handbook by Marcu Cantù. So getting started went smooth.

My internship was split up into three parts, were the first part was to study and test different REST services. The second part was based on implementing the APIs such as Google Translate and Microsoft Vision. The third part involved using the implementation in an application called TMS Vision.

TMS Vision should allow visually impaired people to be informed about their environment by simply tapping on their mobile phone and getting a spoken response in the native language. That response can be a series of keywords, or a short description on the object that has been recognized by the camera.

Used technologies

Doing my internship at TMSSoftware, I got access to the newest tools TMS had to offer. With the TMS FNC Cloud Pack I had the foundation to build a set of classes that implement the services needed to send and receive data via REST. For the GUI, I used FNC. For those not yet familiar with 'FNC' , these are what we call Framework Neutral Components. This means that these components can be simultaneously used with different frameworks, are fully cross platform, can be used from Delphi, C++Builder and Lazarus and most spectacularly can be used to create web applications with TMS WEB Core. Read more about FNC for the web here.

TMS FNC Controls can be simultaneously used on these frameworks:

TMS FNC Controls can be simultaneously used on these operating systems/browsers:

TMS FNC Controls can be simultaneously used on these IDE's:

Because TMS FNC Cloud Pack contains a core layer to handle asynchronous REST request, it became really easy to send and receive data.

Example of translating text via the Google Translate API. In the code below, the TTMSFNCSimpleCloudBase class allows you to quickly send and receive data via REST without OAuth 2.0 authentication flow requirements.
// form class private variables
  c: TTMSFNCSimpleCloudBase;
  target : string;

procedure TGoogleTranslateForm.Button1Click(Sender: TObject);
  c.Request.Host := '';
  c.Request.Path := '/language/translate/v2';
  c.Request.Query := 'q=' + TTMSFNCUtils.URLEncode(Edit1.Text) +'&format=text'+
   '&target=' + target + '&key=' + c.Authentication.Key;
  c.Request.Method := rmGET;

Also parsing the request result data was very easy with TMS FNC Core, which exposes a set of ready to use functions for parsing JSON.
procedure TGoogleTranslateForm.DoGetList(const ARequestResult: TTMSFNCCloudBaseRequestResult);
  j, jd, ja, jav: TJSONValue;
  I: Integer;
  siso, sname: string;
  l: TLanguage;
  if ARequestResult.ResultString <> ''  then
    j := TTMSFNCUtils.ParseJSON(ARequestResult.ResultString);
      jd := TTMSFNCUtils.GetJSONValue(j, 'data');
      if Assigned(jd) then
        ja := TTMSFNCUtils.GetJSONValue(jd, 'languages');
        if Assigned(ja) and (ja is TJSONArray) then
          for I := 0 to TTMSFNCUtils.GetJSONArraySize (ja as TJSONArray) - 1do
            jav := TTMSFNCUtils.GetJSONArrayItem(ja as TJSONArray, I);
            if Assigned(jav) then
              siso := TTMSFNCUtils.GetJSONProp(jav, 'language');
              sname := TTMSFNCUtils.GetJSONProp(jav, 'name');

(Code snippets were written for Google Translate in the first week of the internship) Here is an example to test the REST API for Google Translate.

Starting on components

After getting used to the different platforms, investigating and testing the various cloud services to be implemented in TMS Vision, I got started on transferring the sample code into components that work cross-platform. Doing the internship here, made this easy as the TMS FNC Cloud Pack already provided a solid base to work on, and additionally my colleagues were eager to lend their advice when I needed help.

Here is an example of how the final code looks with the Google Translate component.
procedure TGoogleTranslateForm.FormCreate(Sender: TObject);
  c := TTMSFNCCloudGoogleTranslate.Create;
  TLanguage := TStringList.Create;
  c.Authentication.Key := 'My-API-Key';
  c.OnIsoLanguageList  := doLanguageList;
  c.OnTranslate := DoTranslate;

procedure TGoogleTranslateForm.Button1Click(Sender: TObject);
  if FTarget <> '' then 
    c.Translate(Edit1.Text, FTarget)
    c.Translate(Edit1.Text) ;

This shows how compact your final code can be.

TMS Vision

I decided to use the knowledge I collected to make an application that works cross-framework and cross-platform to assist people who are visually impaired. The application allowed them to be informed about the environment around them. There were some critical parts in TMS Vision related to the Google Vision and Microsoft Vision APIs that involved uploading the picture taken from the camera. The data required by Google Vision, for example, needed to be in a base64 string. This was handled by the TTMSFNCUtils.FileToBase64 function included in TMS FNC Core. Below you can see a code snippet that uses this functionality to upload the picture data to Google Vision.

procedure TTMSFNCCustomCloudGoogleVision.AnalysePicture(const AFile: TTMSFNCUtilsFile);
 basestring :String;
    basestring := TTMSFNCUtils.FileToBase64(AFile);
    Request.Host := Service.BaseURL;
    Request.Path := '/v1/images:annotate';
    Request.Method := rmPOST;
    Request.AddHeader('Content-Type','application/json; charset=utf-8');
    Request.Query := 'key='+Authentication.Key;
    Request.PostData := '{"requests": [{"image": {"content":"'+      
    basestring+'"}'+',"features": [{"type": "LABEL_DETECTION"},{"type":    
    "OBJECT_LOCALIZATION","maxResults": 5},{"type": "WEB_DETECTION"}]}]}' ;
    ExecuteRequest({$IFDEF LCLWEBLIB}@{$ENDIF}DoRequestAnalyse);

Example of how the application looks now. The layout of the app has been created with the TMS FNC UI Pack, and runs on TMS WEB Core. The application is a PWA that is installable on the device.


Right now I'm in my second half of my internship and can say I enjoyed every moment of it, gaining access to the tools of TMSSoftware and the wide variety of FNC components, made programming in Delphi or Pascal a lot easier than I thought.

I’m still expanding my knowledge of Delphi and Object Pascal and I plan to expand the TMS Vision application with other API services such as Google speech to text to remove the need to interact with the screen manually by implementing voice commands.

Author: Brutin Bjorn

Masiha Zemarai


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

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