TMS Software. All-Access

TMS Aurelius 5 is here! Come see it Live!

TMS Aurelius 5 has been released with lots of new features! Photo by Tony Hand on Unsplash As we have antecipated in a previous blog post, lots of new features were expected for the next major release of TMS Aurelius, our state-of-art ORM framework for Delphi. And indeed, Aurelius 5 was released last week! The what’s new section in the documentation provides you can see the full list of new features, improvements and bug fixes. Here are the major new features, and at the end of this article we have a special invitation for you! Data Validation You can now add data validation via attributes directly to your entity classes. [Entity, Automapping] [Filter(‘Multitenant’)] TTrack = class strict private FId: Integer; [Required] FName: string; FGenre: TGenre; FComposer: Nullable; [Range(0, 3600000)] FMilliseconds: Nullable; FTenantId: Nullable; function GetDuration: string; public All fields will be proper validated according to the validation attributes applied. With a few lines you will guarantee that the entity will be persisted with a valid state. The above class is part of the Music Library demo provided with TMS Aurelius (trial and registered versions). Note how the track name is required, and the duration must not be greater than one hour (3600000 milliseconds). If you try to save something with wrong data, Aurelius will automatically prevent the user from doing so and raise an exception: Global filters and multitenancy Aurelius now includes global filter mechanism. Users will be able to define filters globally, including parameters, and choose which entities will have it applied. The Music Library demo was made multitenant with a few lines of code. The entities were marked with a new global filter definition: [Entity, Automapping] [FilterDef(‘Multitenant’, ‘{TenantId} = :TenantId’)] [FilterDefParam(‘Multitenant’, ‘TenantId’, TypeInfo(string))] [Filter(‘Multitenant’)] TGenre = class strict private FId: Integer; [Required] FName: string; FTenantId: Nullable; And, from that, Aurelius allows you to enforce values in filter (to prevent a wrong tenant id to be saved) and also enable filters to retrieve data: Manager.EnableFilter(‘Multitenant’) .SetParam(‘tenantId’, CurrentTenant); That was it! Music Library demo is now multitenant, with a few UI changes to allow the end-user to choose which tenant to use, data is now fully separated between tenants. Attribute-based event handlers Events are an important feature of any framework, and with Aurelius is not different. It provides several events you can use to add custom business logic. You can add specific code just before an entity is being saved, after an entity is deleted, when an SQL is being executed, among others. But now you can add event handlers directly in your classes, using attributes. You can use it for logging for example, or even to add custom, more complex data validation. The Music Library demo also shows how to do it: TGenre = class {…} public [OnValidate] function Validate: IValidationResult; {…} function TGenre.Validate: IValidationResult; begin if SameText(Name, ‘Experimental’) then Result := TValidationResult.Failed(‘Experimental music is not allowed’) else Result := TValidationResult.Success; end; Such validation will be applied, and Experimental genres will not be allowed in our Music Library app! Come See it Live! There are more new features, actually: TObjectManager.AddOwnership method, Aurelius Dataset can now refresh fields directly from objects and automatically destroy the source list, etc. But, what about if you come and see the new features live, in action, with a more deep explanation? The free webinar […]

Read More

Webinar: TMS WEB Core with HTML/Bootstrap templates (Portuguese)

Register for the free webinar “TMS WEB Core with HTML/Bootstrap templates”. The webinar is scheduled on March 25, 2021 16h00 UTC  17h00 UTC (17h CET – 18h CET) at the TMS Web Academy! “TMS WEB Core with HTML/Bootstrap templates” Ivan de Souza, former senior consultant at Embarcadero Brazil will demonstrate how to create web applications with Delphi and TMS WEB Core and use HTML with Bootstrap to create modern, responsive and good looking web user interfaces.  You will learn techniques to bind Object Pascal user interface control logic to existing HTML & CSS. NOTE: The webinar will be presented in Portuguese! “TMS Web Core com templates HTML/Bootstrap” 25 de Março de 2021 / 13h (Horário de Brasília) Ivan de Souza, ex-consultor sênior da Embarcadero Brasil, irá demonstrar como criar aplicações web usando Delphi e TMS Web Core, com HTML e Bootstrap, para criar aplicações web com visual moderno e responsivo. Você irá aprender técnicas para ligar a lógica de interface escrita em Object Pascal em templates HTML e CSS existentes. O webinar será realizado em sua maior parte em português, tendo algumas interações em inglês com o CEO da TMS, Bruno Fierens. 

Read More

VCL Grid goodies #3

Today, we have a look at another often overlooked but yet convenient feature of TAdvStringGrid (and also TDBAdvGrid) from the TMS VCL UI Pack: HoverButtons! Activating HoverButtons With the HoverButtons, you can quickly setup actions to be performed on rows in the grid where the mouse is hovering. It is enabled by just setting grid.HoverButtons.Enabled = true. This means, that when the mouse hovers over a row, a small panel hosting buttons will appear at a column of choice in the grid. This column is set with grid.HoverButtons.Column. WIth the property grid.HoverButtons.Position, you can specify in what relative position with respect to this column the panel should appear.  Configuring the buttons  To add any number of buttons on the panel, the collection grid.HoverButtons.Buttons can be used. This is a collection of the type THoverButtonsCollectionItem and allows to set the caption of such button, an imagelist ImageIndex, a picture, the hint, enabled state of the button … Just add any number of buttons needed for different actions to be performed on the row. Reacting to HoverButtons clicks When a button on the HoverButtons panel is clicked, this triggers the event OnHoverButtonClick returning the index of the button clicked. Performing the different actions for the different button clicks as such is simple: procedure TForm1.AdvStringGrid1HoverButtonClick(Sender: TObject; ARow: Integer; AButton: THoverButtonsCollectionItem); begin case AButton.Index of 0: begin // select the entire row and copy it to the clipboard AdvStringGrid1.SelectRows(ARow,1); AdvStringGrid1.CopySelectionToClipboard; end; 1: begin // invoke the inplace editor for the 2nd column cell AdvStringGrid1.Col := 2; AdvStringGrid1.ShowInplaceEdit; end; 2: AdvStringGrid1.RemoveRows(ARow,1); end; end; Hovering & hints Now we are discussing hovering, we can as well highlight another small but neat feature of the grid and that is to show the content of cells via a hint when the mouse hovers the cell. This is activated by setting grid.ShowHint = true as well as grid.HintShowLargeText = true. Whenever the text does not fit in the size of the cell, the grid will automatically display it as hint text for the cell. As a standard Delphi hint is just a single line of text hint, we add the TMS THTMLHint component on the form. This will replace the standard Delphi VCL hint and this hint can display multiple lines of text. The THTMLHint component also offers a MaxWidth property with which we can set the maximum width of hints to be displayed. And of course, if the text exceeds this MaxWidth, it will be rendered wordwrapped (and even formatted) in the HTMLHint. No code needs to be written for this. Drop a THTMLHint on the form, set HTMLHint.MaxWidth property and set the grid properties grid.ShowHint = true and grid.HintShowLargeText = true. The effect can be seen in this recording. Want more goodies? Looking for more interesting features in the VCL TAdvStringGrid or in other components uncovered? Let us know what you want to see demonstrated in a next episode!

Read More

Introducing FNC Grid Excel Bridge components

In the last weeks, we’ve been working on a component to allow you to import and export FNC Grids to the xlsx file format. We’ve also used the opportunity to rename the existing “Grid Filters” and “FMX Grid Filters” to “VCL Grid Excel Bridge” and “FNC Grid Excel Bridge” because the word “Filter” has a different meaning in a grid. We hope the new “Bridge” naming proves less ambiguous. Same as the “Filters” before, the new Bridge components are free, but they require to have both TMS FNC UI Pack and TMS FlexCel licenses. You can get the components here: And the documentation is available here: So what is the state now if you want to export or import a grid to/from Excel?  We have the following choices: (VCL Only) You can use StringGrid.SaveToXLS and StringGrid.LoadFromXLS. Those methods will use OLE Automation under the hood, and so they require that Excel is installed in the machine. Because they need Excel, they can only work on Windows. You can use TAdvGridExcelIO (VCL), TTMSFMXGridExcelIO (FMX) and TTMSFNCGridExcelIO (FNC). Those components use an older trimmed-down FlexCel 3 to do their job. Because they use FlexCel 3, which predates the XLSX file format, they can only work with XLS files, not XLSX. You can use the “TMS Grid Excel Bridge” components. Those components use an existing  FlexCel 7 to do the work, and so they can export to xls and xlsx, but also HTML and PDF.  Because they require a FlexCel license, they can access the full FlexCel behind it, to do extra customization. Just as an an example: You could add conditional formats to the generated files, as shown in the example here: https://doc.tmssoftware.com/grid-excel-bridge/fnc/guides/user-guide.html#customizing-the-export. Note: FNCGrid already supports exporting to PDF and HTML natively, you don’t need the bridge components for that. But if you are customizing the xlsx output, you might want to have a PDF or HTML exported with those customizations, and that’s where the Bridge’s exporting to HTML and PDF can be useful. Up to now, the “Bridges” had support for VCL Grids and FMX Grids. With the release of FNC Bridge, we are extending the first-class Excel exporting and importing to FNC. Note that in FNC, we only support VCL and FMX at the moment (all platforms). We can’t support Lazarus or WebCore because FlexCel doesn’t support them yet. So to finish this small post, I’d like to show how it works. We’ll try adding export support for the FNC Grid in the “ClientDataset” demo. This is the grid: We dropped a TTMSFNCGridExcelExportComponent, and wrote the code: TMSFNCGridExcelExport1.Export(‘r:test.xlsx’); And we got this result: The checkboxes work in Excel, they are not images. But they will be exported as images to HTML and PDF. Next, we tried with HTML: TMSFNCGridExcelExport1.ExportHtml(‘r:test.html’, THtmlExportMode.SingleSheet); And we got: Finally we went for the PDF export. We could also have tried the one-liner, but in this case it would end up with 2 pages. The grid is too wide and the right part of it goes to the second page. But here is where the power of having full access to the FlexCel engine can help. We could export this file to xlsx, then set the print options in the xlsx file to fit to one page, and only then export to PDF: var xls := TXlsFile.Create(1, […]

Read More

New Delphi productivity developer tool from new TMS FNC partner

It is with great pleasure that we announce today there is not only a new partner in our TMS FNC Partner program but also a new innovative productivity developer tool for Delphi developers to manage better the workflow with testers & end-users for VCL and FMX applications. New TMS FNC Partner We are glad to welcome Neil Laskowski from SwiftExpat in the TMS FNC Partner program. The TMS FNC Partner program is all about supporting Delphi developers offering valuable tools built upon our FNC framework. If you also develop tools or components based on the FNC framework, have a look at the our FNC Partner program! New productivity developer tool Runtime Toolkit from SwiftExpat helps developers to gather information & feedback from testers and end-users in a structured way and get and apply this feedback to the applications. When running the application, the users can enable a runtime inspector and modify any components property on forms and immediately see the effect of the update visually on the form. At the same time, the details of the update are stored in a file together with a form screenshot before and after the update and this can be sent back to the developer(s). As such, this is an ideal tool to let users send back corrections for possible language related issues, UI colors and UI control layout issues. And this is for Delphi developers building VCL applications as well as FMX applications. A closer look at the capabilities of Runtime Toolkit This is a comprehensive overview of the features of Runtime Toolkit: Inspect Feature-rich components are hard to get right (have you ever missed a setting?) RunTime ToolKit gives you access to component properties to diagnose defects. Apply property changes and see the effect realtime to eliminate guesswork. Marshal will capture the changes in a session for you to review offline. Fine Tune RunTime ToolKit addresses the challenges faced with user interface elements such as fine tuning color schemes, ensuring translated fields are displayed properly, and resizing controls. Engage Clients expect to see changes quickly. Modifying at runtime can get you valuable feedback when engaging with a client. Implement Marshal was designed around ease of implementation. With the drag of a button you place the Marshal control in your application and instrument your existing code. Marshal creates its own form without cluttering your application form. Diagnose Inspecting components at runtime allows you to diagnose configuration or data driven behavior. Inspect the items collection to ensure the data was loaded and determine if the item is hidden. Record Capture the details and integrate the fixes into your source code immediately or at your own pace. Marshal records each change to component properties in a session which can be reviewed offline in Caddie. Compare Before and After Marshal automatically captures screen shots before and after property modifications. Visually compare the details of the form before and after a change. Target Deployment Deploy instrumented code during testing or to beta users. Marshal can be controlled using build configurations to target specific builds. Vendor Agnostic Designed to work with controls from any vendor, Marshal is fully functional in an application that uses no other FNC controls. Partnering with FNC leverages technologies to deliver better tools. Visit SwiftExpat and get started You can visit the Runtime Toolkit […]

Read More

High performance tree list in FMX

Intro The multi-device, true native app platform The FireMonkey® framework is the app development and runtime platform behind RAD Studio, Delphi and C++Builder. FireMonkey is designed for teams building multi-device, true native apps for Windows, OS X, Android and iOS, and getting them to app stores and enterprises fast. source: https://www.embarcadero.com/products/rad-studio/fm-application-platform FMX (FireMonkey) released in 2011 and shortly after we delivered a first set of components. Today, we want to show you the TTMSFNCTreeView component, a component with high performance virtual and collection-based modes able to deal with millions of nodes. Features Below is a list of the most important features the TTMSFNCTreeView has to offer. The features are not limited to this list, but this will give you a quick insight on what we offer to be able to create a hierarchical tree list in FireMonkey. Multi-line HTML formatted text Various built-in column editors Multi-column support Fixed and variable node height High performance virtual and collection-based modes Multiple events for custom drawing and customization of default drawing Multiple events for all kinds of interactions such as editing, expand / collapse and selection Auto-sizing and stretching of columns Mouse and keyboard interaction Nodes with checkbox, radiobutton, image, disabled nodes Nodes extending over multiple columns Sorting, Filtering Clipboard support Keyboard lookup Reordering Drag & Drop Learn More! Want to learn more about what the TTMSFNCTreeView can do? Here is a video that highlights some of the above features through a demo application. Download & Explore! The TTMSFNCTreeView component is part of the TMS FNC UI Pack, which, on top of FMX, also offers the ability to write your code once and target other frameworks (VCL, LCL and WEB). You can download a full featured trial version of the TMS FNC UI Pack and start exploring the capabilities of the TTMSFNCTreeView component. Coming up The TTMSFNCTreeView is the third of a series of components that is covered to empower your FMX (FireMonkey) developments. We started the series with a general overview of the most important components that we have to offer, followed by the TTMSFNCRichEditor and the TTMSFNCPlanner. Next up will be the TTMSFNCKanbanBoard component, a highly configurable workflow visualization component.

Read More

Compiling 1 million+ lines of code with Rad Studio 10.4.2

One of the things that intrigued me about the new Rad Studio 10.4.2 release was the improved compiler performance. Because Delphi is a fast compiler –we all know that– but hey, it can always be faster. And 10 seconds in every compile end up counting for a lot of time over the days. So I tried it compiling FlexCel and its test suite. Over a million lines of code, and actual code. This isn’t a synthetic benchmark with a single unit and a million lines of “WriteLn(‘Hello world’);”. We have lots of generics, a little more than 3000 units, multiple includes, cycles of units that use themselves recursively, and complex dependencies.  It turns out that spreadsheets require a lot of code. Below you can find a small video, with Rad Studio 10.4.2 on your left and 10.3 on your right. I normally wait a while before adopting a new Delphi version, but given all the time I spend compiling FlexCel, I migrated to 10.4.2 yesterday. This is the type of improvements I want from Embarcadero, and I hope they deliver more.

Read More

Real-world Delphi projects out of this world…

How much of our daily life here on planet Earth is impacted by running Delphi code is beyond imagination. Whether it is controlling trains on the French railway system, contact tracing in the COVID19 pandemic in Poland, salary calculation and reporting in Germany, tax invoice approvals in Brazil,… the list is endless. But Delphi’s impact already reached out beyond planet Earth with several projects of the NASA and this week we stumbled on the social media post from Dave Akerman mentioning it was Delphi based software where several TMS components were involved, that was used to produce the sophisticated coating for the Perseverance parachute that was instrumental in its highly critical but eventually successful and safe landing on Mars on Feb 18: As we chatted, I found out that David had a similar educational background as me in electronic engineering, also loves car racing, worked together with a very good friend of mine having a company Theys Industrial producing electronic PCB’s 2km away from here and I learned that the fabrics for the Perseverance parachute were produced by the company Picanol that is like 20km driving from where the TMS headquarters are. Talking about coincidences…Well, that was enough a reason to get in touch with David and have a chat about our passion we all share: software development with Delphi! Our colleague Holger Flick produced this video interview with David, where David tells exciting stories of how he got into software development, how he used Delphi for controlling machines precisely mixing chemicals, how he also uses Delphi for his hobby of tracking weather measurement balloons (where TMS WEB Core plays a role in), how he uses the FireMonkey framework for writing software for a Sony watch and so much more… I’m sure you will enjoy this video interview between two passionate Delphi software developers and be inspired to also do cool things with Delphi!

Read More

Taking the wraps of TMS Web Academy!

We are thrilled to launch the first version of our new platform TMS Web Academy almost on the same day as the 26th anniversary of Delphi. We have been working about 5 months on this new TMS Web Academy platform and now it is ready to take the wraps of it. We invite you to have a look but more precisely to join our welcome webinar we organize today as well as the first ‘real’ webinar planned for Friday 19th about “The making of the TMS Web Academy” platform. See this on our calendar of the events and the possibility to register to participate.  How it all started It will come as no surprise that the covid19 pandemic was instrumental to get the plans rolling to create our TMS Web Academy. Whereas in normal years, TMS software not only participates and gives sessions at numerous Delphi related events across Europe (Foren Tage, SDN conference, Barnsten Delphi seminars in Benelux and France, EKON conference, PasCon, ITDevCon,  …) and our colleague Wagner Landgraf in Brazil but also organized meetups in our office and our annual 2-day Training Days event in Germany, in 2020 there was literally not a single live event that took place.  We received numerous emails from users asking when we would organize something or when we would offer a possibility to come and sit together with our experts to learn about the latest features and techniques we offer in our various products. At the same time, we really missed the interaction with you, the chats between the sessions, your questions and suggestions.  As such, the idea was born to organize webinars, training, communication via an online platform. Why create our own platform? I can imagine the first question will be why to create our own platform for bringing online webinars and training. There are so many ways to collaborate online already, so why reinvent the wheel? Well, there are several reasons. Let me give you a few in no particular order: Eat your own dogfood and show the power of TMS WEB Core Have exactly the kind of interaction wanted for organizing webinars and online training Use a web platform so it can be accessed everywhere and on every device Be totally configurable and extensible to the direction we want to go with it Tight integration with our website and user database Full control over look & feel and branding Offer a platform that is usable by everyone working distributed over the world for TMS Goals First of all, we absolutely do not see the TMS Web Academy as a replacement for live events. I can actually not wait before going again to a live event somewhere in Europe, to have people in meetups at the company or to organize our training days again. At the same time, we do not consider TMS Web Academy as a temporary solution for reaching out to you while the covid19 pandemic lasts. No, the TMS Web Academy will serve as our platform to organize online interactive webinars and training in a much more dynamic way than a physical event can be organized and serve a world-wide audience. Whereas organizing Training Days at a location takes multiple months of preparation, comes with a cost, requires attendees to travel and to allocate these specific […]

Read More

Free webinar: What is coming in TMS BIZ in 2021

Our last blog post, GraphQL, workflow engine, multitenancy and more: what you will do with Delphi in 2021, raised a lot of interest. Due to that, we decided to do a free live webinar to show you in action most of the upcoming features and products, and answer any questions you might have. Register for the free webinar “What is coming in TMS BIZ in 2021”, to happen on Tuesday, February 23, 2021 3:00:00 PM UTC at the TMS Web Academy! Wagner R. Landgraf

Read More