Dependency Analysis – Pascal Today

Tools and steps for analysing Delphi or FreePascal code: Dependency Analysis – Pascal Today [WayBack] Used tools: Delphi Unit Dependency Scanner [WayBack] Gephi – The Open Graph Viz Platform [WayBack] yEd – Graph Editor [WayBack] yEd is a free desktop application to quickly create, import, edit, and automatically arrange diagrams. It runs on Windows, Mac OS X, and Unix/Linux. –jeroenFiled […] … Read More

Read More

Delphi and Linux

I'd just like to remind my Slovenian readers that on 28th this month I'll be having a presentation about RAD Studio and Linux in Ljubljana.As the presentation will be given in Slovenian language, the rest of my post containing the description of the presentation is written in that language, too.Vljudno vabljeni na delavnico "RAD Studio in Linux", na kateri si bomo ogledali:Kako namestiti Ubuntu v virtualni računalnik.Kaj storiti, ko namestitev nagaja.Kako pripraviti virtualni računalnik in RAD Studio za delo.Kako napisati konzolno aplikacijo za Windows in Linux, ki streže podatke z uporabo tehnologij FireDAC in DataSnap.Kako napisati grafično aplikacijo za Windows, OS X, iOS, Android, ki prikazuje in spreminja podatke na aplikacijskem strežniku iz prejšnjega koraka.Z nekaj sreče pa še: Kako to grafično aplikacijo pognati na Linuxu inKako konzolno aplikacijo spremeniti v pravi Linux "service".Vstop prost, prosimo vas le, da se vnaprej registrirate, da bomo znali pripraviti zadostno količino kave in prigrizkov ;)--- Published under the Creative Commons Attribution 3.0 license
Read More

Deep Dive: Hospitality Survey App Template For RAD Studio 10.2.1 Tokyo

The Hospitality Survey App template can be downloaded through Embarcadero’s GetIt which is built into the RAD Studio IDE. It consists of four different projects that interconnect with each other. The projects are:

  • Hospitality Survey Setup
  • Hospitality Survey EMS
  • Hospitality Survey Admin
  • Hospitality Survey Client

You should deploy and run the projects in the following order:

1) The Hospitality Survey Setup app will help you set up your database, the tables and data, and your EMS user accounts.

2) The Hospitality Survey EMS is the RAD Server side REST resource which both the Hospitality Survey Client and the Hospitality Survey Admin interface with. It should be deployable on Windows and Linux through IIS, Apache, or the stand alone EMS server.

3) The Hospitality Survey Client is a RAD Studio client application for Android, iOS, macOS and Windows. The client application should allow you to select a tenant from your RAD Server and then log in as a user. Once logged in it will download the survey data for your current tenant and allow the survey to be filled out. Once the survey is complete it can be submitted back to the server and a new survey can be started.

4) The Hospitality Survey Admin app is an AngularJS application for the web. You should be able to log into the application with your Tenant ID and RAD Server user ID. The web app should allow you to view statistics and graphs about the results of the survey questions and each individual question and answer. You can also export a list of emails collected from the surveys.


In Depth Developer Guide Webinar

[YoutubeButton url=’’]


Hospitality Survey Setup

Start: Your EMS Server should already be setup and running.

Step 1: Set a path for your stores database. Set the path to the EMSServer database.

The stores database is created, used, and populated with data in Step 4.

The EMSServer database link is used to populate the drop down of Tenant IDs in Step 3.

Step 2: Setup the demo users on the EMS Server using the EMS API.

You will need your EMSServer Host, Port, and Tenant IDs in this step. The Setup will connect to your EMSServer and create groups and users for the template.

You can create Tenant IDs using this tutorial:

Step 3: Customize the questions to be asked in the survey for each tenant. A blank tenant_id will be asked to all tenants.

You can customize the questions in your survey on Step 3. The fields are:

  • ID – An ID for the question.
  • name – A short name for the question with no spaces.
  • title – The text of the question as it will appear in the survey.
  • type – The type of question controls which question template is loaded on the client. The existing types are: rating, yesno, edit, options
  • options – If the type of the question is set to options this field is used to populate the options. It’s value is a JSON array of options.
  • value – The value is where the user submitted data is stored. It can be left blank but could be used to provide a default answer.
  • category – The category of the question. This field is provided for expandability.
  • tenant_id – The tenant ID of the question. If the tenant_id field is blank all tenants will get the question. If it is set to a tenant only that tenant will get the question.


Be sure to update the tenant IDs to to match your tenant IDs.

Pressing the Re-Generate button will create new INSERT queries on Step 4.

Step 4: Create the tables and insert the questions data into your stores database with the Initialize All button.

This step contains the SQL setup queries for the stores database. There are three tables which will be set up which are: SURVEYS, QUESTIONS, RESULTS

Each table will be dropped and re-created when the queries are run (any existing data in the tables will be lost). In the third TMemo field the SQL queries from your questions defined in Step 3 will appear.

Pressing the Initialize All button will execute the SQL queries against your defined stores database from Step 1.

Complete: After step 4 the databases and users should be setup and ready for you to use the client and admin areas.

Your EMS database and users should be setup at this point. You should be able to connect the Hospitality Survey EMS package to your new stores database and compile the package.

Once your Hospitality Survey EMS package is running in the EMS Development Server you should be able to open and compile the Hospitality Survey Client.

After you submit some survey results via the Hospitality Survey Client you should be able to log into the Hospitality Survey Admin and see your results.


Hospitality Survey EMS

The Hospitality Survey EMS is the RAD Server module for the Hospitality Survey Client and the Hospitality Survey Admin to interface with.

The end points mainly return the FireDAC JSON format which can be easily loaded in to a RAD Studio client or access via standard JSON in a non-RAD Studio environment.



GET /survey/ – Download the survey questions in FireDAC JSON format.

GET /survey/results/* – Download the survey results in a paged fashion in FireDAC JSON format. The page number is placed where the * is.

GET /survey/stats/all – Download various stats about the survey results in FireDAC JSON format.

GET /survey/details/* – Download the questions and answers from a specific survey ID in FireDAC JSON format. The survey ID is placed where the * is.

GET /survey/emails/csv – Download a list of all of the email addresses from completed surveys in CSV format.


GET /tenants/ – Download a list of the server Tenants which are active in FireDAC JSON format.



The endpoints are defined like this in code:

// SurveyModule.pas



procedure Get(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);



procedure GetData(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);



procedure PostData(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);



if ARequest.Params.Values['query'] = 'results' then

if ARequest.Params.Values['query'] = 'stats' then

if ARequest.Params.Values['query'] = 'details' then

if ARequest.Params.Values['query'] = 'emails' then



// TenantModule.pas


procedure Get(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);


The variable in the /survey/results/* and /survey/details/* endpoints is accessed via ARequest.Segments object like below:


  if ASegments.Count = 3 then // first segment is "survey" second is "results or "details" third segment is the variable


    SurveyId := ASegments.Items[2];


User permissions:

User permissions are governed by the {$DEFINE GROUPPERMISSIONS}. You can comment or uncomment this line for dev and live deployments. User permissions are ignored when {$DEFINE GROUPPERMISSIONS} is commented out.


Hospitality Survey Admin

The Hospitality Survey Admin dashboard project which was built in AngularJS. The Admin Dashboard connects to RAD Server on the backend via a REST API. The stats that are displayed are for data that has been collected in the Hospitality Survey Client. AngularJS is a popular framework for building web applications. It uses straight Javascript and HTML as it’s template language. The data binding functionality that it offers eliminates a lot of the CRUD code you would normally have to build. AngularJS uses HTML as it’s View and Javascript as it’s Controller. You can quickly consume JSON from REST end points and display it using AngularJS. 

You should be able to log into the Admin area using a Tenant ID and Tenant Secret plus the login and password for a user in the Managers Group. For this template the default user is Manager1.

Note: You must log in with your Tenant ID as the Store ID and not the Tenant Name.


Copy index.html and the img, js, and styles subdirectories to your web server. Optimally you should place them on the same web server as your RAD Server DLL or Shared Object file. They could be placed in an admin subdirectory. You can place them on a different web server than RAD Server but you will need to make sure that your CORS Access-Control-Allow-Origin is set up correctly.

Within the js/admin.js file you should configure the $scope.ServerURL variable to point to the host where you RAD Server install is located. The default is: http://localhost:8080/


CORS Accept permissions:

Within the js/admin.js file you can configure the CORS settings for dev and live versions within the $scope.getHeader function. By default it is setup for development. When you want to switch to the live version (and enable user permissions) you can uncomment the line containing the X-Embarcadero-Session-Token and comment out the line without it. Switch back and forth between the two as needed.

There is a similar setting in the Hospitality Survey EMS server for configuring permissions for dev or live.


REST Endpoints & FireDAC

The Hospitality Survey EMS endpoint returns FireDAC tables as JSON. This allows interchangable compatibility between RAD Studio and clients like AngularJS. Here is an example of walking through the FireDAC table JSON tree to get to the records: data[“FDBS”][“Manager”][“TableList”][0][“RowList”]

In addition to AngularJS the Admin Dashboard also utilizes Chart.js, BootStrap, and a custom Bootstrap style. The Bootstrap style is from and you should be able to go there and get other styles. If you replace the existing style in the project with one of the other styles on it should just drop it without any other effort and you will have an entirely new look (just like how FireMonkey styles work). Chart.js is available from which is a great Javascript library for displaying chart data dynamically in the browser. The Chart.js library has a special shim for AngularJS which facilitates the data exchange between AngularJS and Chart.js. Lastly, BootStrap is used which provides visual theming on HTML form elements (among other things). There is also a special shim for AngularJS which facilitates the easy integration with BootStrap.


Hospitality Survey Client

The Hospitality Survey Client connects to the Hospitality Survey EMS server on multiple end points for downloading and upload data. It is built to be cross platform on Android, iOS, macOS, and Windows using a single codebase and single UI.

The survey is dynamically generated based on the questions that are downloaded from the Hospitality Survey EMS server. Each question is assigned to a TFrame which displays that type of question.


The architecture of the app is built in a rapid application development style using TTabControl for handling pages and individual frames for each page. TActionList is used to consolidate much of the code in the MainForm.



uMainForm.pas – Contains the main form of the application including the TTabControl with the design time frames.

uTenantListForm.pas – Contains a separate form for selecting the active Tenant ID.



uTenantsDM.pas – Contains the non visual components for downloading the Tenant list.


Design Time Frames:

uStoreLoginFrame.pas – Contains the store login frame.

uLoginFrame.pas – Contains the user login frame.

uMenuFrame.pas – Contains the main menu of the application including the Take Survey button.

uFinishFrame.pas – Contains the final frame of the application including the Thank You button after a survey has been completed.

uBackendFrame.pas – Contains the non-visual components for downloading survey data and uploading the results.

uProgressFrame.pas – Contains the animated progress controls which are displayed when the application is doing work.


Dynamic Frames:

uComboBoxFrame.pas – Contains the combo box survey question type.

uCompleteFrame.pas – Contains the complete button for the survey.

uEditFrame.pas – Contains the edit survey question type.

uRatingBarFrame.pas – Contains the star rating track bar survey question type.

uSurveyHeaderFrame.pas – Contains the header for the top of the survey.

uYesNoFrame.pas – Contains the Yes/No survey question type.


If you want to make changes to the design time frames be sure to edit the frame itself and not the version of it that is embedded in the MainForm. This will keep your changes consolidated in one place. If you changes don’t update in the MainForm you can delete the Frame from the MainForm and re-add it. Be sure to add it to the correct Tab and set to Align Client after you add the frame.

Note: You must log in with your Tenant ID as the Store ID and not the Tenant Name.


Restaurant Image:


Hospitality Survey Editor

There is also a Hospitality Survey Editor app which will connect to your existing Hospitality Survey database and allow you to customize the questions which are asked in the client. The questions are stored in a table in the database and then downloaded to the client as JSON through RAD Server. The Hospitality Survey Client app loads the JSON and then dynamically creates the input fields using TFrames.

The Hospitality Survey Editor app was created by stripping down the Hospitality Survey Setup app and connecting it directly to the Hospitality Survey database.

Download the full source code for the Hospitality Survey Editor in FireMonkey for Delphi 10.2 Tokyo.

Read More

Read More

Formatted emails (HTML email) from TAdvRichEditor

Our TAdvRichEditor UI control has everything on-board to generate HTML from its rich document content, including exporting images that are possibly used in the document. Although generating this HTML can be easily done via the TAdvRichEditorHTMLIO non-visual component connected to the TAdvRichEditor, we frequently receive support emails from users struggling to use the generated HTML to send it as email with the Indy components (TIdMessage, TidSMPT).

Therefore, we decided not only to create a sample code snippet to show how this can be done, but also to create a non-visual component (available in the latest TMS Component Pack release) to reduce the code to generate such email message to the minimum possible, that is, to one line of code:


But, back to full code first that shows how to use the Indy components to generate HTML emails with embedded images as this can be generally applied for cases also where no TAdvRichEditor is used.

Drop a TIdMessage component on the form. We create a multipart message, with a part for the plain text version of the email, a part for the HTML email header and a part for the HTML itself. Then we add attachments to the message where ContentDisposition is set to ‘inline’ and the ContentID is set to the ID used in the HTML image reference cid attribute. So, if we have in the HTML code an image reference like:

then the ContentID for the attachment containing the image will be :

ContentID := 'imageref1';

Now, let’s put this together using a TAdvRichEditor, TAdvRichEditorHTMLIO, idMessage on the form. We set AdvRichEditorHTMLIO.RichEditor to the TAdvRichEditor instance we want to export. It is very important to set AdvRichEditor.HTMLImages to igID as this instructs the TAdvRichEditor to export images references as CID URI attributes. The export to HTML and image files from TAdvRichEditor becomes:

  i: integer;
  AdvRichEditor1.HTMLImages := igID;
  // we save the output to a temporary HTML file

  for i := 0 to AdvRichEditor1.HTMLImageList.Count - 1 do
      // we prepare the images as temporary images files for use as attachments for the message

As you can see, the images to be used in the export are available via the collection AdvRichEditor.HTMLImageList. From there, we can save the images to file to be used as attachments for the Indy idMessage. The code to construct the idMessage from here becomes:

  idMessage1.IsEncoded := True ;
  idMessage1.ContentType := 'multipart/alternative';

  with TIdText.Create(idMessage1.MessageParts, nil) do
    // here we include the text as plain text
    Body.Text := AdvRichEditor1.PlainText;
    ContentType := 'text/plain';

  with TIdText.Create(idMessage1.MessageParts, nil) do
    ContentType := 'multipart/related; type="text/html"';

  with TIdText.Create(idMessage1.MessageParts, nil) do
    // we load the content from the temporary HTML file
    ContentType := 'text/html';
    ParentPart := 1;

  // here we loop over images to add all as attachments 
  for i := 0 to FRichEditor.HTMLImageList.Count - 1 do
    with TIdAttachmentFile.Create(idMessage1.MessageParts,  + '.img' + i.ToString + '.png') do
      ContentID := 'image'+ i.ToString;
      ContentType := 'image/png';
      ContentDisposition := 'inline';
      ParentPart := 1;

When the idMessage message has been created, it is straightforward to send it via the idSMTP component, i.e., this is minimally:

  IdMessage1.From.Address := '';
  IdMessage1.Recipients.Add.Address := '';
  IdMessage1.Sender.Address := '';

  idsmtp1.Host := '';

With this code now explained, let’s introduce the class TAdvRichEditorEmailIO included in unit AdvRichEditorEMailIO.pas in the latest version of TMS Component Pack. With this class, we can reduce the code to send a HTML email from TAdvRichEditor to:

  idMessage.Subject := 'A HTML email from TAdvRichEditor';

  idSMTP1.Host := '';

The resulting Delphi application looks like this:

and when opening the email sent in MS Outlook, it looks like:

You can easily get started to build your own HTML formatted text email client. You can download the source code of the application here and you can compile and use this with the latest TMS Component Pack release. In the next updates of TMS FMX UI Pack that also includes the FireMonkey version of our rich editor component, we’ll also include a FireMonkey version of the HTML email creator class and the same applies for the cross-framework version of the rich editor in the TMS FNC UI Pack.

Read More

Read More

Join us in The Netherlands and Germany at several upcoming Delphi conferences

We look forward to connect with you at the upcoming conferences!

TMS will be present at following Delphi events:

The LAB – European Delphi & C++Builder Conference 2017
19 September 2017 – Eindoven, The Netherlands

TMS software will be present with a booth where you can meet us and find out about our latest product offerings.
Bruno Fierens will give a session about VCL & FMX Delphi applications based on Google Maps and TMS WebGMaps. He will demonstrate how locations on the map can be indicated in different ways, how addresses can be associated with locations, how locations can be coupled to pictures and how to load POI files and visualize the POIs on the map. Furthermore, route directions can be calculated, displayed and imported & exported for exchange with navigation systems or smartphone apps. Finally the GeoJSON file format is explained and it is shown how these can be used together with Google Maps.Dutch spoken

Foren-Tage 2017
23 September 2017 – Hamburg, Germany

TMS software will be present with a booth where you can meet us and find out about our latest product offerings.
Bruno Fierens will give a session about VCL & FMX Delphi applications based on Google Maps and TMS WebGMaps. He will demonstrate how locations on the map can be indicated in different ways, how addresses can be associated with locations, how locations can be coupled to pictures and how to load POI files and visualize the POIs on the map. Furthermore, route directions can be calculated, displayed and imported & exported for exchange with navigation systems or smartphone apps. Finally the GeoJSON file format is explained and it is shown how these can be used together with Google Maps.

24 October – Cologne, Germany

Bruno Fierens will give a presentation about creating cross-framework UI controls. The similarities and differences between the two key UI frameworks VCL and FMX that come with Delphi are explained. With this knowledge, it is possible to create an abstraction layer that allows to create UI controls that will work both in VCL applications and in FMX applications (and also in the LCL framework).
The abstraction layer FNC (Framework Neutral Components) is introduced and explained and with the help of this FNC layer, it is demonstrated to create a UI control from scratch for VCL, FMX and LCL.

TMS hands-on training day
23 November 2017 – Meerbusch-Büderich, Germany

After an introduction on the latest news from Embarcadero, the first half of the day will be devoted to an in-depth look at TMS VCL components, in particular TAdvStringGrid and TAdvTreeView. In the second part of the day, focus will be on cross-platform development and cross platform UI controls. We’ll round up the day with a look at Google Maps integration and a “What’s cooking in the labs” session.
Sessions will be in German.

Read More

Read More

TMS FNC Ribbon : modern ribbon UI on every operating system and for every Pascal framework

With the FNC product line (framework-neutral-components), it is our vision to enable developers with a single UI controls set, a single learning-curve and a single license to have the freedom of choice to develop Delphi VCL Windows applications, Delphi FMX cross-platform applications for Windows, macOS, Android, iOS or even LCL based Lazarus applications for Windows, macOS or Linux.

Since our study & research to realize this FNC layer, we have already created a powerful grid, a flexible planning/scheduling/calendar control, a feature-rich treeview, a rich editor, a toolbar and many more smaller UI controls. The next logical step was to create a ribbon UI control to enable building modern user interfaces for your VCL, FireMonkey Delphi applications of Windows, macOS or Linux applications created with Lazarus/FPC. Our ribbon UI control takes the hard work out of your hands to offer the subtle differences a Microsoft Office 2016 style colourful ribbon UI comprises on these different operating systems.

To get started, we have integrated ribbon application and ribbon form repository items in the Delphi “new item” wizard. You can select from there to create a new VCL or FMX ribbon project or to add a new VCL or FMX ribbon form to your existing project.

It is of course also possible to add a new ribbon UI to an existing form. To do so, drop the TTMSFNCRibbon control on the form and do not forget to descend your form from TTMSFNCRibbonForm instead of a TForm.

The ribbon architecture
Let’s have a look at the TTMSFNCRibbon control itself. It consists of several parts, the main parts being:

TMSFNCRibbonWrapper : This is the container component for the ribbon form caption that contains the QAT, caption text, system menu
TMSFNCRibbonQAT : This is the quick access toolbar that can sit in the window caption or below the ribbon. The position can be set via the property TTMSFNCRibbon.QATMode.
TMSFNCRibbonCaption : This represents the caption text of the window itself
TMSFNCRibbonSystemMenu : This is the application system menu typically used to close, minimize or maximize the form
TTMSFNCRibbonFileButton : This is the application menu button
TMSFNCRibbonPageControl : This is the page control that is used to paginate between different ribbon pages
TTMSFNCRibbonPageControlContainer : This is a single ribbon page that is a container for toolbars on the ribbon

To add a toolbar and toolbar controls to the ribbon, right-click the TTMSFNCRibbonPageControlContainer and from the context menu select to add a toolbar.
Next, right-click the toolbar and from the context menu you can choose to add several toolbar controls.

The controls that can be added to the ribbon toolbar are not limited to this set of controls and as such other UI controls can be added as well to the toolbar. More later about the dynamic sizing configurability of the toolbar controls and the toolbar compact mode.

Matching the Microsoft Office 2016 theme, the TTMSFNCRibbon has a property Theme from where a number of predefined colors can be selected (like the MS Word, MS Excel, MS PowerPoint ribbon colors) but this property can also be set to rbtCustom and then a custom application color can be selected with TTMSFNCRibbon.CustomThemeColor. The TTMSFNCRibbon control will automatically calculate lighter & darker color variants to make up such custom color theme. The color & appearance of each individual element on the ribbon can be customized, but the easiest way to select a consistent looking color is clearly with the TTMSFNCRibbon.Theme and TTMSFNCRibbon.CustomThemeColor setting.

The ribbon toolbar
The place where buttons for interaction with your application are placed is the ribbon toolbar and typically, controls are grouped on toolbars that belong together. By default, the size of the toolbar will automatically adapt to the number & size of controls added to the toolbar. The default size is TMSFNCRibbonToolBar.AutoSize = true, TMSFNCRibbonToolBar.AutoWidth = true, TMSFNCRibbonToolBar.AutoAlign = true. This means that when adding controls to the toolbar, these will be added starting left aligned and the size of the toolbar will grow as controls are added. The toolbar can have a dynamic sizing behavior. That means that when the application window width will become smaller or larger, the toolbar can dynamically size to fit all toolbars in the width of the ribbon. The smallest mode for the toolbar is the compact state. In this state, the toolbar is only a button and the toolbar buttons will only become visible when the toolbar compact state button is clicked. In compact state, the toolbar can display a picture on the button and this is selected via TMSFNCRibbonToolBar.CompactBitmaps: TTMSFNCScaledBitmaps. This is a collection of bitmaps that can be used for different DPI sizes. The control will decide itself what bitmap to use from the collection depending on the DPI of the screen the application is running on. Further customization of the compact state is done via TTMSFNCRibbonToolBar.CompactAppearance, TTMSFNCRibbonToolBar.CompactWidth, TTMSFNCRibbonToolBar.CompactBitmapVisible. When the toolbar is not in compact state, its controls are visible but these can be visible in different sizes. The sizes a ribbon toolbar button can have is set with TMSFNCRibbonDefaultToolBarButton.MinimumLayout, TMSFNCRibbonDefaultToolBarButton.MaximumLayout. By default, the minimum size is bblBitmap, the maximum size is bblLarge and the size in between is bblLabel. When the application is maximized for example and thus the toolbar has sufficient space, all buttons on the toolbar can be shown in bblLarge state. When the application width shrinks, the controls on the toolbar can first reduce to bblLabel state where the controls become a label with attached glyph. When the form width further shrinks, the next step is when the toolbar controls are rendered in bblBitmap state, essentially, only showing the button glyph. Of course, if for a button the MinimumLayout and MaximumLayout are both set to bblLarge, the toolbar control size will never change during application for width changes. Only when the toolbar width cannot longer fit on the ribbon, the entire toolbar will go to compact state.

Visualizing this is probably the best way to make this more clear.

In this first step, notice the Insert toolbar that has sufficient space for hosting two large state buttons:

As the form width decreases, the Insert toolbar shrinks by putting its controls in label layout:

Making the form even smaller now makes the toolbar shrink its controls to bitmap layout:

The final and smallest state of the toolbar is the compact state, where all its controls are hidden and the toolbar controls only become visible by clicking the compact state toolbar button to show the full toolbar in a popup:

The ribbon page groups
Another often used ribbon UI feature is the ribbon page groups. Sometimes functionality in the application has so much controls to interact with the features of the functionality that it is too much to have one ribbon page for it and that it is better to divide it in two or more pages. To make the ribbon pages look consistently together, the concept of page groups is used. This is a group indicator above the ribbon page tabs. Adding a ribbon page group can be easily done via the collection TTMSFNCRibbon.Groups. Add a new TMSFNCRibbonGroup item to this collection and here it can be configured what the index is of the first ribbon page in the group (TMSFNCRibbonGroup.StartPageIndex) and the last page (TTMSFNCRibbonGroup.EndPageIndex). The group can be given a group name set via TTMSFNCRibbonGroup.Text and with the group the selected ribbon page tab can have its own color set via TTMSFNCRibbonGroup.Color & TTMSFNCRibbonGroup.TextColor. The page group itself is a darker variant from the ribbon theme color.

In this example, a ribbon page group was created for the Insert and Export page. The page group name is Tools and was created by setting TMSFNCRibbonGroup.StartPageIndex to 1 and TTMSFNCRibbonGroup.EndPageIndex to 2.

g := rb.Groups.Add;
g.Text := 'Tools';
g.StartPageIndex := 1;
g.EndPageIndex := 2;

The ribbon QAT
Frequently used functions, like a save, undo, … function can be added to the always visible QAT (quick access toolbar). This QAT sits normally on the form caption or right below the ribbon. By default, on a new TMSFNCRibbon, the QAT is available on the caption. To add controls to it, also right-click the control at design-time and from the context menu select the controls to add. The QAT has by default an automatically managed option menu (at the right-side of the QAT). From this options menu, controls on the QAT can be hidden or made visible and the position of the QAT can be selected. The option menu can be further customized by implementing any of its menu event handlers like OnOptionsMenuCustomize, OnOptionsMenuItemCanShow, OnOptionsMenuMoreCommands, …

Learn more
Several resources are available for you to learn more about our FNC abstraction layer and controls:
Blog post about FNC UI pack
Blog post about developing FNC custom controls
FNC controls video series

Our TMS FNC ribbon control has everything on board to allow you to add a ribbon UI to your applications, be it Delphi VCL Windows applications, cross platform FireMonkey applications or applications created with Lazarus for Windows, macOS or Linux. It is easy & fast to configure but at the same time can be extensively and in detail customized. Together with our FNC grid control, you can build Excel like user interfaces in a matter of hours, or in combination with our FNC rich editor a word processor like application, etc… Once you learned to use the TMS FNC Ribbon control, you can apply this knowledge to your next project developed against another UI control framework or you could reuse code from one application in a given framework for another application using another framework. We look forward to see awesome applications you create and hear about further needs you might have to facilitate your development and make it even faster.

Read More

Read More

TMS Subscription Manager v2 is here

One comprehensive tool to manage any of the many bundle subscriptions you can purchase from TMS software was our goal for TMS Subscription Manager v2.0 that is now finally released.
TMS Subscription Manager v2.0 supports TMS ALL-ACCESS, TMS VCL Subscription, TMS Business Subscription, TMS Component Studio, TMS FMX Component Studio, TMS FNC Component Studio and TMS IntraWeb Component Studio.

With TMS Subscription Manager v2.0, you can use a single login in this application and you get instant access to all products in the purchased bundle. For TMS ALL-ACCESS, this is at this moment a whopping 63 products. The TMS Subscription Manager v2.0 now categorizes the products neatly per technology : VCL, FMX, BIZ, FNC, DEV, .NET, IntraWeb and LCL.

Per product, you get a description, link to the product webpage, info on latest available version and release date, info on your last download version and download date and info on your last product install version and date. With colors, the status of each product is indicated. In white are products ready for download, in yellow products ready for install, in orange products for which you can meanwhile download a newer version and in green the products for which the latest version was installed, so you are up-to-date for.
If you have our premier TMS ALL-ACCESS subscription, you can much easier find your way in the many products by filtering. You can open & close per product technology, you can filter to see for example only all installed products for which there is a new version, you can perform a search in product name or product description. If you perform a search on ‘grid’, you’ll see we have a grid for VCL in the TMS Component Pack, a grid for FireMonkey in the TMS FMX UI Pack, a grid for cross-framework development in TMS FNC UI Pack and a grid for web application development in TMS IntraWeb Component Pack.

But there is more. If you are working on a project that includes several specific TMS products, you can mark these products as your favourite products by clicking the heart icon and then perform a filtering to see the latest status of only your favourite products.

The new v2.0 version also allows to start multiple downloads. To get all new releases since your last login, you could filter on “New version”, then check all products and click the “Download all” button in the column header cell for the download column and it will do all downloads for you and make the products ready for install.

And that is not all, behind the scenes, TMS Subscription Manager is now keeping a backup of any product versions you have downloaded. From the settings page, the folder where all downloads are stored can be directly opened. With keeping a full backup of every single version you have downloaded (and probably installed) it is now possible to perform rollback if it would be necessary for some reason. Right-click on the downloaded version number cell per product and from the context menu you can see all available versions (if there are any) and activate another version for install.

Finally, the TMS Subscription Manager v2.0 keeps you always informed about the validity of your subscription and will guide you to the renewal order upon expiry. Last but not least, from the TMS Subscription Manager there is a comprehensive list of links to interact with us, via email, social media, forums, RSS, Youtube videos …

To round up, some technical tidbits: TMS Subscription Manager is built with Delphi 10.2 Tokyo as a single EXE portable executable. The products are displayed and managed in our TAdvStringGrid UI control. The application will self-update thanks to our TWebUpdate component and in case something goes wrong, exception logging is handled by Eurekalog.

If you have any TMS bundle subscription, you can download TMS Subscription Manager v2.0 now from the “My products” page and get started with the new tool. We hope you enjoy it and it will make you more productive than with the v1.0.

We have already several ideas for further developments on TMS Subscription Manager v2.0, like making it optionally a Delphi IDE plugin with automatic notifications, allowing to invoke the installers silently, integrating the downloads of our free tools, making it possible to also manage separate product purchases, … but we also eagerly look forward to your ideas. We’re sure that with your brilliant ideas, we can make the tool even more awesome than it is today!

Read More

Read More

Delphi Blogs of the (Week) Month #55

This is my fairly regular (although now monthly) list of relevant links to blogs post, articles, news, and more from the Delphi community. Embarcadero Updates Idera has acquired Sencha to strengthen its developer tools business (aka Embarcadero). You can read the press release ( and articles like Embarcadero released a hot fix for Tokyo 10.2.1 to resolve iOS AdHoc deployment: Notable Blog Posts Save Time With This Quick LiveBindings Trick For Delphi And C++Builder (by Eli): Experiments in Uniform Memory Management (by Erik van Bilsen): Delphi FMX Chess Game (although I'm eagerly waiting for more information) Cross-Platform Code Hooking (also by Erik van Bilsen): Windows Manifest Files (by Vincent Parrett): TNotifyEvent debouncing in Delphi (by Sergey Zhukov): (althought it has been criticized as not really being on debouncing, it is an interesting read) Use C++Builder to get Android current ringtone mode (by Haruyuki Mohri): Resizing a TViewPort3D (by Gustav Schubert): The Dark Side of Application.ProcessMessages in Delphi Applications (by Zarko Gajic): (re-opening a never ending debate on the use of Windows limited message based parallel processing vs. real threading solutions -- or maybe the debate is actually settled and threads just won?) Cloud Based Unit Resolver For The Delphi RTL In Delphi 10.2 Tokyo (by FMX Express): Third Party Libraries and Components Delphi base compatibility, Spine improvements, other stuff in Castle Game Engine (by Michalis): JSKit - open-source Cross-platform JavaScript framework for Delphi and CrossVcl announcement (by Eugene) at The library itself can be found at Kind of similarly, ​ScriptGate provides mutual calls between JavaScript and #Delphi and it's useful for Hybrid apps (by Hosokawa Jun): GrijjyCloudLogger, remote logging for Windows, iOS, Android, macOS and Linux (by Allen Drennan) at The repository is at ​Must Have RAD Accessories – InnoSetup (by Craig Chapman): (and part of a very nice series of classic Delphi components and tools) Debugger Callstack Resolver released (by Andreas Hausladen):
Read More

RAD Studio 10.2.1 HotFix for iOS AdHoc Deployment

We released a hotfix to address a regression (reported as in RAD Studio Tokyo Release 1 related with AdHoc deployment for iOS. The fix available for download is at: The fix (which is a single file to add to your system) provides support for building iOS Ad Hoc Applications with RAD Studio 10.2.1 using Xcode 8.2, 8.3.2 or 8.3.3. Please ensure that RAD Studio 10.2.1 (Tokyo Release 1) is installed before applying this fix, it is not for the original 10.2 release.
Read More