<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
	<title>TMS Software</title>
	<link>https://www.tmssoftware.com</link>
	<language>en</language>
	<pubDate>Wed, 4 Nov 2026 13:26:00 +0100</pubDate>
	<docs>http://blogs.law.harvard.edu/tech/rss</docs>
	<ttl>1440</ttl>
	<generator>TMS Software</generator>
	<image>
		<url>https://www.tmssoftware.com/site/img/tmslogo.png</url>
		<title>TMS Software</title>
		<link>https://www.tmssoftware.com</link>
	</image>
	<item>
		<title><![CDATA[TMS FNC Localization use case in FontCreator]]></title>
		<link>https://www.tmssoftware.com/site/blog.asp?post=2566</link>
		<author>A&#228;ron Decramer</author>
		<pubDate>Wed, 4 Nov 2026 12:00:00 +0000</pubDate>
		<description><![CDATA[<P>
		
		
		
		
		<p><a href="https://www.tmssoftware.com/site/tmsfnclocalization.asp" target="_blank" rel="noopener"><img src="https://www.tmssoftware.com/site/img/blog/fontcreator-customer-story-hero.png" width="1600" height="700" alt="Customer story: FontCreator, fluent in 17 languages. High-Logic localizes a Delphi app with 88 forms on Windows and macOS with TMS FNC Localization" decoding="async" style="max-width:100%;height:auto;border-radius:12px;"></a>
 
</p><p>FontCreator is the font editor from <a href="https://www.high-logic.com" target="_blank" rel="noopener" style="background-color: white; font-family: sans-serif;">High-Logic B.V.</a> It is written entirely in Delphi, has been downloaded more than five million times and ships in 17 languages, including Arabic and Hebrew, Japanese, Korean and both Chinese scripts. The Windows version is a VCL application with 88 forms. The macOS version is built with FireMonkey.</p>
 
<p>All of those languages run on <a href="https://www.tmssoftware.com/site/tmsfnclocalization.asp" target="_blank" rel="noopener">TMS FNC Localization</a>. That is no coincidence: the product grew out of the localization layer that High-Logic built for FontCreator, and developer Erwin Denissen shaped it together with TMS. This customer story covers how High-Logic set it up, what they prepared before translating and how it performs.</p>
 
<div style="padding:20px 22px;background:#F0F4F8;border:1px solid #D9E2EC;border-radius:10px;margin:18px 0;">
<p style="margin:0 0 16px 0;"><a href="https://www.high-logic.com" target="_blank" rel="noopener"><img src="https://www.tmssoftware.com/site/img/blog/high-logic-logo.png" width="800" height="171" alt="High-Logic, proven font technology" decoding="async" style="height:56px;width:auto;max-width:100%;"></a></p>
<div style="display:flex;flex-wrap:wrap;gap:12px 20px;">
<div style="flex:1 1 170px;"><div style="font-size:12px;font-weight:bold;letter-spacing:.08em;text-transform:uppercase;color:#64748B;">Customer</div><div style="margin-top:2px;font-weight:bold;color:#1B3A63;"><a href="https://www.high-logic.com" target="_blank" rel="noopener" style="color:#1B3A63;">High-Logic B.V.</a></div></div>
<div style="flex:1 1 170px;"><div style="font-size:12px;font-weight:bold;letter-spacing:.08em;text-transform:uppercase;color:#64748B;">Application</div><div style="margin-top:2px;font-weight:bold;color:#1B3A63;">FontCreator, a font editor</div></div>
<div style="flex:1 1 170px;"><div style="font-size:12px;font-weight:bold;letter-spacing:.08em;text-transform:uppercase;color:#64748B;">Platforms</div><div style="margin-top:2px;font-weight:bold;color:#1B3A63;">Windows (VCL) and macOS (FireMonkey)</div></div>
<div style="flex:1 1 170px;"><div style="font-size:12px;font-weight:bold;letter-spacing:.08em;text-transform:uppercase;color:#64748B;">Product</div><div style="margin-top:2px;font-weight:bold;color:#1B3A63;"><a href="https://www.tmssoftware.com/site/tmsfnclocalization.asp" target="_blank" rel="noopener" style="color:#1B3A63;">TMS FNC Localization</a></div></div>
</div>
<p style="margin:18px 0 0 0;"><a href="https://www.high-logic.com/font-editor/fontcreator" target="_blank" rel="noopener" style="display:inline-block;padding:10px 20px;border-radius:8px;background:#FFFFFF;border:2px solid #1B3A63;color:#1B3A63;font-weight:bold;text-decoration:none;">Discover FontCreator →</a></p>
</div>
 
<div style="margin:18px 0;position:relative;">
<div data-track="fc-win" style="display:flex;overflow-x:auto;scroll-snap-type:x mandatory;scroll-behavior:smooth;border-radius:12px;border:1px solid #D9E2EC;">
<div id="fc-win-en" style="flex:0 0 100%;scroll-snap-align:start;"><img src="https://www.tmssoftware.com/site/img/blog/FontCreator-Win-en.png" width="1720" height="1017" alt="FontCreator for Windows in English" decoding="async" style="display:block;width:100%;height:auto;"></div><div id="fc-win-nl" style="flex:0 0 100%;scroll-snap-align:start;"><img loading="lazy" src="https://www.tmssoftware.com/site/img/blog/FontCreator-Win-nl.png" width="1720" height="1017" alt="FontCreator for Windows in Dutch" decoding="async" style="display:block;width:100%;height:auto;"></div><div id="fc-win-zh" style="flex:0 0 100%;scroll-snap-align:start;"><img loading="lazy" src="https://www.tmssoftware.com/site/img/blog/FontCreator-Win-zh-CN.png" width="1720" height="1017" alt="FontCreator for Windows in Simplified Chinese" decoding="async" style="display:block;width:100%;height:auto;"></div>
</div>
<p style="position:absolute;left:12px;bottom:22px;margin:0;text-align:left;z-index:2;"><a href="#fc-win-en" data-tab="fc-win" onclick="var t=document.getElementById('fc-win-en');t.parentNode.scrollTo({left:t.offsetLeft-t.parentNode.offsetLeft,behavior:'smooth'});return false;" style="display: inline-block; padding: 7px 16px; border-radius: 999px; border: 1px solid rgb(217, 226, 236); background: rgb(30, 127, 194); color: rgb(255, 255, 255); text-decoration: none; margin: 0px 6px 0px 0px; box-shadow: rgba(15, 23, 42, 0.25) 0px 2px 8px;">English</a><a href="#fc-win-nl" data-tab="fc-win" onclick="var t=document.getElementById('fc-win-nl');t.parentNode.scrollTo({left:t.offsetLeft-t.parentNode.offsetLeft,behavior:'smooth'});return false;" style="display: inline-block; padding: 7px 16px; border-radius: 999px; border: 1px solid rgb(217, 226, 236); background: rgb(255, 255, 255); color: rgb(27, 58, 99); text-decoration: none; margin: 0px 6px 0px 0px; box-shadow: rgba(15, 23, 42, 0.25) 0px 2px 8px;">Dutch</a><a href="#fc-win-zh" data-tab="fc-win" onclick="var t=document.getElementById('fc-win-zh');t.parentNode.scrollTo({left:t.offsetLeft-t.parentNode.offsetLeft,behavior:'smooth'});return false;" style="display: inline-block; padding: 7px 16px; border-radius: 999px; border: 1px solid rgb(217, 226, 236); background: rgb(255, 255, 255); color: rgb(27, 58, 99); text-decoration: none; margin: 0px 6px 0px 0px; box-shadow: rgba(15, 23, 42, 0.25) 0px 2px 8px;">Chinese (Simplified)</a></p>
</div>
 
<p><br></p>
 
<div style="padding:16px 20px;background:#F0F4F8;border:1px solid #D9E2EC;border-radius:10px;">
<p style="margin:0 0 6px 0;font-weight:bold;color:#1B3A63;">In this customer story</p>
<ol style="margin:0;padding-left:20px;columns:2 240px;column-gap:24px;line-height:1.7;"><li><a href="#the-challenge">The challenge</a></li><li><a href="#building-it-together-with-tms">Building it together with TMS</a></li><li><a href="#how-the-parts-fit-together">How the parts fit together</a></li><li><a href="#collecting-the-text">Collecting the text</a></li><li><a href="#choosing-the-languages">Choosing the languages</a></li><li><a href="#forms-that-are-ready-for-every-language">Forms that are ready for every language</a></li><li><a href="#text-in-code-snippets">Text in code: snippets</a></li><li><a href="#resource-strings-and-message-dialogs">Resource strings and message dialogs</a></li><li><a href="#translating-with-ai">Translating with AI</a></li><li><a href="#what-a-release-ships">What a release ships</a></li><li><a href="#performance">Performance</a></li><li><a href="#the-results">The results</a></li><li><a href="#erwins-advice">Erwin&#146;s advice: start with one form</a></li></ol>
</div>
 
<p><br></p>
<h2 id="the-challenge">The challenge</h2>
 
<p>High-Logic had localized FontCreator for years with a layer Erwin wrote himself: a folder of language files and a manager that walked each form and replaced its string properties. It did the job, but it had no editor and no tooling, and no other Delphi developer could use it.</p>
 
<p>And FontCreator is not a small application. Every language holds about 3,850 translatable strings. The macOS version has its own forms, with different property names than the VCL version. Each language has its own plural rules, and Arabic and Hebrew run right to left.</p>
 
<blockquote style="margin:22px 0;padding:16px 22px;border-left:5px solid #1E7FC2;background:#FFFFFF;border-top:1px solid #D9E2EC;border-right:1px solid #D9E2EC;border-bottom:1px solid #D9E2EC;border-radius:8px;">
<p style="margin:0 0 8px 0;font-size:1.2em;line-height:1.5;color:#1B3A63;"><i>&#147;Many of our users do not read English, and those who do still read their own language faster and with less effort.&#148;</i></p>
<p style="margin:0;font-size:14px;color:#64748B;">Erwin Denissen, <a href="https://www.high-logic.com" target="_blank" rel="noopener" style="color:#64748B;">High-Logic B.V.</a></p>
</blockquote>
 
<p><br></p>
 
<h2 id="building-it-together-with-tms">Building it together with TMS</h2>
 
<p>Instead of keeping the layer to themselves, Erwin contacted Bruno at TMS. Together they took what High-Logic had, improved it and turned it into <a href="https://www.tmssoftware.com/site/tmsfnclocalization.asp" target="_blank" rel="noopener">TMS FNC Localization</a>, a product every Delphi developer can use. FontCreator now runs on it, on Windows and on macOS.</p>
 
<blockquote style="margin:22px 0;padding:16px 22px;border-left:5px solid #1E7FC2;background:#FFFFFF;border-top:1px solid #D9E2EC;border-right:1px solid #D9E2EC;border-bottom:1px solid #D9E2EC;border-radius:8px;">
<p style="margin:0 0 8px 0;font-size:1.2em;line-height:1.5;color:#1B3A63;"><i>&#147;It was not designed in the abstract. Every part of it exists because a real application needed it.&#148;</i></p>
<p style="margin:0;font-size:14px;color:#64748B;">Erwin Denissen, <a href="https://www.high-logic.com" target="_blank" rel="noopener" style="color:#64748B;">High-Logic B.V.</a></p>
</blockquote>
 
<p><br></p>
 
<h2 id="how-the-parts-fit-together">How the parts fit together</h2>
 
<p>FontCreator carries one component: the localizer, on the main form. That is what the shipped application contains. The Localization Editor opens from the right-click menu of a form in the IDE. <a href="https://www.tmssoftware.com/site/tmsfnclocalization.asp" target="_blank" rel="noopener">TMS FNC Localization</a> also has a collector component that holds the editor&#146;s settings for a project, but FontCreator does not need one.</p>
 
<a href="https://www.tmssoftware.com/site/img/blog/Diagram.png" target="_blank" rel="noopener" title="Open full size"><img loading="lazy" src="https://www.tmssoftware.com/site/img/blog/Diagram.png" width="1720" height="973" alt="Diagram: forms, frames, data modules, snippets and resource strings go into the Localization Editor, which keeps translations.json and exports runtime files that the localizer in your VCL, FMX or TMS WEB Core application reads" decoding="async" style="max-width:100%;height:auto;border-radius:12px;"></a>
 
<p><br></p>
 
<h2 id="collecting-the-text">Collecting the text</h2>
 
<p>The editor walks the forms the project declares and builds a model of every translatable property it finds. On a real application the first run finds far more than the visible text, because many string properties are never read by a user: internal keys, format strings and names that happen to be published. Exclusion rules by class and by property filter those out. For FontCreator, writing the rules took about an hour, and everything after that was review.</p>
 
<p>Lists that the application fills at run time are the other source of noise. FontCreator&#146;s font properties page has a combo box with more than 1,400 vendor IDs that must not be translated. From the grid you can ignore a whole list, component or form in one go, and anything collected below it later stays ignored too.</p>
 
<p>For the Windows version this produced:</p>
 
<div style="display:flex;flex-wrap:wrap;gap:12px;margin:18px 0;">
<div style="flex:1 1 150px;padding:18px 14px;background:#FFFFFF;border:1px solid #D9E2EC;border-top:4px solid #1E7FC2;border-radius:10px;text-align:center;"><div style="font-size:2em;font-weight:bold;color:#1B3A63;line-height:1.1;">2,452</div><div style="margin-top:4px;font-size:14px;color:#334155;">texts on forms</div></div>
<div style="flex:1 1 150px;padding:18px 14px;background:#FFFFFF;border:1px solid #D9E2EC;border-top:4px solid #1E7FC2;border-radius:10px;text-align:center;"><div style="font-size:2em;font-weight:bold;color:#1B3A63;line-height:1.1;">658</div><div style="margin-top:4px;font-size:14px;color:#334155;">texts on frames</div></div>
<div style="flex:1 1 150px;padding:18px 14px;background:#FFFFFF;border:1px solid #D9E2EC;border-top:4px solid #1E7FC2;border-radius:10px;text-align:center;"><div style="font-size:2em;font-weight:bold;color:#1B3A63;line-height:1.1;">680</div><div style="margin-top:4px;font-size:14px;color:#334155;">snippets</div></div>
<div style="flex:1 1 150px;padding:18px 14px;background:#FFFFFF;border:1px solid #D9E2EC;border-top:4px solid #1E7FC2;border-radius:10px;text-align:center;"><div style="font-size:2em;font-weight:bold;color:#1B3A63;line-height:1.1;">28</div><div style="margin-top:4px;font-size:14px;color:#334155;">number snippets</div></div>
</div>
 
<a href="https://www.tmssoftware.com/site/img/blog/LocalizationEditor-Translations-B.png" target="_blank" rel="noopener" title="Open full size"><img loading="lazy" src="https://www.tmssoftware.com/site/img/blog/LocalizationEditor-Translations-B.png" width="1720" height="793" alt="The Translations tab of the Localization Editor with the properties of a FontCreator form, their English text and the approved German translation" decoding="async" style="max-width:100%;height:auto;border-radius:12px;"></a>
 
<p><br></p>
 
<h2 id="choosing-the-languages">Choosing the languages</h2>
 
<p>The supported languages are a list on the editor&#146;s Languages tab. One of them is the source language, English for FontCreator. Every other language gets a row with its name, a language tag such as <code>nl</code>, <code>de</code> or <code>zh-CN</code>, and its plural rule. The tab also shows how far each translation is.</p>
 
<a href="https://www.tmssoftware.com/site/img/blog/LocalizationEditor-Languages.png" target="_blank" rel="noopener" title="Open full size"><img loading="lazy" src="https://www.tmssoftware.com/site/img/blog/LocalizationEditor-Languages.png" width="1720" height="805" alt="The Languages tab of the Localization Editor with the FontCreator languages, their codes, status, plural form and progress" decoding="async" style="max-width:100%;height:auto;border-radius:12px;"></a>
 
<div style="display:flex;flex-wrap:wrap;gap:12px;margin:18px 0;">
<div style="flex:1 1 260px;padding:16px 18px;background:#F0F4F8;border:1px solid #D9E2EC;border-radius:10px;"><h3 style="margin-top:0;">Excluded until ready</h3><p style="margin:0;">A language can be set to Excluded while its translation is not finished. It stays in the data but is not exported, so users never see a half-finished translation.</p></div>
<div style="flex:1 1 260px;padding:16px 18px;background:#F0F4F8;border:1px solid #D9E2EC;border-radius:10px;"><h3 style="margin-top:0;">Regional variants</h3><p style="margin:0;">A variant only needs the texts that differ. FontCreator&#146;s British English holds about 250 of them, such as &#147;colour&#148; and &#147;centre&#148;. Everything else comes from the US English source.</p></div>
</div>
 
<p><br></p>
 
<h2 id="forms-that-are-ready-for-every-language">Forms that are ready for every language</h2>
 
<p>Translated text is not the same length as English. German and Finnish run long, Chinese runs short. A form that only looks right with the English caption breaks when it is translated, and no localization component can fix that. So High-Logic prepared its forms first.</p>
 
<blockquote style="margin:22px 0;padding:16px 22px;border-left:5px solid #1E7FC2;background:#FFFFFF;border-top:1px solid #D9E2EC;border-right:1px solid #D9E2EC;border-bottom:1px solid #D9E2EC;border-radius:8px;">
<p style="margin:0 0 8px 0;font-size:1.2em;line-height:1.5;color:#1B3A63;"><i>&#147;This is the part people skip, and then blame the tool.&#148;</i></p>
<p style="margin:0;font-size:14px;color:#64748B;">Erwin Denissen, <a href="https://www.high-logic.com" target="_blank" rel="noopener" style="color:#64748B;">High-Logic B.V.</a></p>
</blockquote>
 
<div style="display:flex;flex-wrap:wrap;gap:12px;margin:18px 0;">
<div style="flex:1 1 260px;padding:16px 18px;background:#F0F4F8;border:1px solid #D9E2EC;border-radius:10px;"><h3 style="margin-top:0;">Labels do not auto-size</h3><p style="margin:0;">273 of the 547 labels in the VCL forms and frames have <code>AutoSize = False</code> with a fixed width. 234 use <code>Layout = tlCenter</code> and 200 use <code>Alignment = taRightJustify</code>, so a label stays next to its edit box whatever the length of the text. 28 have <code>WordWrap = True</code> where two lines are fine. In FMX, 332 of 511 labels have <code>TextSettings.WordWrap = False</code> and 331 have <code>TextSettings.HorzAlign = Trailing</code>.</p></div>
<div style="flex:1 1 260px;padding:16px 18px;background:#F0F4F8;border:1px solid #D9E2EC;border-radius:10px;"><h3 style="margin-top:0;">Room for check boxes</h3><p style="margin:0;">Check boxes and radio buttons do not grow with their caption, so a longer translation is cut off. They get more width than English needs.</p></div>
<div style="flex:1 1 260px;padding:16px 18px;background:#F0F4F8;border:1px solid #D9E2EC;border-radius:10px;"><h3 style="margin-top:0;">Captions only at design time</h3><p style="margin:0;">If a caption is set in the designer and overwritten in <code>FormCreate</code>, your own code throws the translation away. That holds for every approach that works on the component tree, so on an older codebase it is worth checking before you start.</p></div>
</div>
 
<div style="margin:18px 0;position:relative;">
<div data-track="fc-opt" style="display:flex;overflow-x:auto;scroll-snap-type:x mandatory;scroll-behavior:smooth;border-radius:12px;border:1px solid #D9E2EC;">
<div id="fc-opt-de" style="flex:0 0 100%;scroll-snap-align:start;"><img loading="lazy" src="https://www.tmssoftware.com/site/img/blog/FontCreator-Win-Options-de.png" width="1314" height="844" alt="FontCreator options dialog in German" decoding="async" style="display:block;width:100%;height:auto;"></div><div id="fc-opt-nl" style="flex:0 0 100%;scroll-snap-align:start;"><img loading="lazy" src="https://www.tmssoftware.com/site/img/blog/FontCreator-Win-Options-nl.png" width="1314" height="844" alt="FontCreator options dialog in Dutch" decoding="async" style="display:block;width:100%;height:auto;"></div><div id="fc-opt-zh" style="flex:0 0 100%;scroll-snap-align:start;"><img loading="lazy" src="https://www.tmssoftware.com/site/img/blog/FontCreator-Win-Options-zh-CN.png" width="1314" height="844" alt="FontCreator options dialog in Simplified Chinese" decoding="async" style="display:block;width:100%;height:auto;"></div>
</div>
<p style="position:absolute;left:12px;bottom:22px;margin:0;text-align:left;z-index:2;"><a href="#fc-opt-de" data-tab="fc-opt" onclick="var t=document.getElementById('fc-opt-de');t.parentNode.scrollTo({left:t.offsetLeft-t.parentNode.offsetLeft,behavior:'smooth'});return false;" style="display: inline-block; padding: 7px 16px; border-radius: 999px; border: 1px solid rgb(217, 226, 236); background: rgb(255, 255, 255); color: rgb(27, 58, 99); text-decoration: none; margin: 0px 6px 0px 0px; box-shadow: rgba(15, 23, 42, 0.25) 0px 2px 8px;">German</a><a href="#fc-opt-nl" data-tab="fc-opt" onclick="var t=document.getElementById('fc-opt-nl');t.parentNode.scrollTo({left:t.offsetLeft-t.parentNode.offsetLeft,behavior:'smooth'});return false;" style="display: inline-block; padding: 7px 16px; border-radius: 999px; border: 1px solid rgb(217, 226, 236); background: rgb(255, 255, 255); color: rgb(27, 58, 99); text-decoration: none; margin: 0px 6px 0px 0px; box-shadow: rgba(15, 23, 42, 0.25) 0px 2px 8px;">Dutch</a><a href="#fc-opt-zh" data-tab="fc-opt" onclick="var t=document.getElementById('fc-opt-zh');t.parentNode.scrollTo({left:t.offsetLeft-t.parentNode.offsetLeft,behavior:'smooth'});return false;" style="display: inline-block; padding: 7px 16px; border-radius: 999px; border: 1px solid rgb(217, 226, 236); background: rgb(30, 127, 194); color: rgb(255, 255, 255); text-decoration: none; margin: 0px 6px 0px 0px; box-shadow: rgba(15, 23, 42, 0.25) 0px 2px 8px;">Chinese (Simplified)</a></p>
</div>
 
<p><br>According to Erwin, an afternoon of work on this makes the rest go smoothly.</p>
 
<p><br></p>
 
<h2 id="text-in-code-snippets">Text in code: snippets</h2>
 
<p>Messages, prompts, status text and anything built at run time come from code. For that text FontCreator uses snippets: named constants with their default English text, declared once and used wherever they are needed.</p>
 
<div id="code-content"><pre class="delphi" name="code">SnippetGlobalTextCancelling: TTMSFNCSnippetRec =
  (Name: 'GlobalText.Cancelling'; DefaultText: 'Cancelling...');</pre></div>
 
<p>Snippets also connect the two platforms. FontCreator for Windows and FontCreator for macOS are separate projects with separate forms, and the property names differ: VCL has <code>Caption</code> where FMX has <code>Text</code>. Form translations can therefore not be shared, but snippets can, because they are keyed by name. 532 snippets exist under the same name in both versions, and their translations carry over unchanged.</p>
 
<div style="margin:18px 0;position:relative;">
<div data-track="fc-mac" style="display:flex;overflow-x:auto;scroll-snap-type:x mandatory;scroll-behavior:smooth;border-radius:12px;border:1px solid #D9E2EC;">
<div id="fc-mac-en" style="flex:0 0 100%;scroll-snap-align:start;"><img loading="lazy" src="https://www.tmssoftware.com/site/img/blog/FontCreator-Mac-en.png" width="1720" height="1062" alt="FontCreator for macOS, built with FireMonkey, in English" decoding="async" style="display:block;width:100%;height:auto;"></div><div id="fc-mac-set-en" style="flex:0 0 100%;scroll-snap-align:start;"><img loading="lazy" src="https://www.tmssoftware.com/site/img/blog/FontCreator-Mac-Settings-en.png" width="1720" height="1062" alt="FontCreator for macOS settings in English" decoding="async" style="display:block;width:100%;height:auto;"></div><div id="fc-mac-set-de" style="flex:0 0 100%;scroll-snap-align:start;"><img loading="lazy" src="https://www.tmssoftware.com/site/img/blog/FontCreator-Mac-Settings-de.png" width="1720" height="1062" alt="FontCreator for macOS settings in German" decoding="async" style="display:block;width:100%;height:auto;"></div>
</div>
<p style="position:absolute;left:12px;bottom:22px;margin:0;text-align:left;z-index:2;"><a href="#fc-mac-en" data-tab="fc-mac" onclick="var t=document.getElementById('fc-mac-en');t.parentNode.scrollTo({left:t.offsetLeft-t.parentNode.offsetLeft,behavior:'smooth'});return false;" style="display:inline-block;padding:7px 16px;border-radius:999px;border:1px solid #D9E2EC;background:#1E7FC2;color:#FFFFFF;text-decoration:none;margin:0 6px 0 0;box-shadow:0 2px 8px rgba(15,23,42,.25);">macOS, English</a><a href="#fc-mac-set-en" data-tab="fc-mac" onclick="var t=document.getElementById('fc-mac-set-en');t.parentNode.scrollTo({left:t.offsetLeft-t.parentNode.offsetLeft,behavior:'smooth'});return false;" style="display:inline-block;padding:7px 16px;border-radius:999px;border:1px solid #D9E2EC;background:#FFFFFF;color:#1B3A63;text-decoration:none;margin:0 6px 0 0;box-shadow:0 2px 8px rgba(15,23,42,.25);">Settings, English</a><a href="#fc-mac-set-de" data-tab="fc-mac" onclick="var t=document.getElementById('fc-mac-set-de');t.parentNode.scrollTo({left:t.offsetLeft-t.parentNode.offsetLeft,behavior:'smooth'});return false;" style="display:inline-block;padding:7px 16px;border-radius:999px;border:1px solid #D9E2EC;background:#FFFFFF;color:#1B3A63;text-decoration:none;margin:0 6px 0 0;box-shadow:0 2px 8px rgba(15,23,42,.25);">Settings, German</a></p>
</div>
 
<p><br></p>
 
<h2 id="resource-strings-and-message-dialogs">Resource strings and message dialogs</h2>
 
<p>Delphi&#146;s <code>resourcestring</code> never had a good answer outside Windows resource DLLs, which do not work for a cross-platform application. <a href="https://www.tmssoftware.com/site/tmsfnclocalization.asp" target="_blank" rel="noopener">TMS FNC Localization</a> takes a different route.</p>
 
<div style="padding:16px 20px;border-left:5px solid #1E7FC2;background:#F0F4F8;border-radius:8px;">
<p style="margin:0 0 6px 0;font-size:1.15em;color:#1B3A63;"><b>One project option</b></p>
<p style="margin:0;">Switch on <i>Output resource string .drc file</i> under Building, Delphi Compiler, Linker, and build once. The editor reads the compiler&#146;s .drc file, so the list matches what the binary contains. At run time the strings resolve through <code>System.LoadResStringFunc</code>, the RTL&#146;s own hook.</p>
</div>
 
<p><br></p><p>There is no code at the call site, nothing is generated into the project and no source is scanned. <code>ShowMessage(SCannotOpenFile)</code> is translated simply because <code>SCannotOpenFile</code> is a <code>resourcestring</code>, on Windows and macOS from the same files. Two resourcestrings with the same English text stay separate, so an Open in a menu and an Open in a dialog title can get different Dutch words.</p>
 
<p>The same hook covers the standard message dialogs. VCL builds their buttons and titles from resourcestrings in <code>Vcl.Consts</code>, which the localizer ties to a shared set of dialog snippets, and FireMonkey asks its own translation hook, which the localizer also answers. <code>MessageDlg</code>, <code>ShowMessage</code> and <code>InputQuery</code> show Yes, No and Cancel in the user&#146;s language without extra code. The exception is FireMonkey on Windows, where Windows itself supplies the standard buttons in the Windows language.</p>
 
<p>Read more about this in <a href="https://www.tmssoftware.com/site/blog.asp?post=2559" target="_blank" rel="noopener">Translate Your Delphi Resourcestrings with TMS FNC Localization 0.9.4.0 BETA</a>.</p>
 
<p><br></p>
 
<h2 id="translating-with-ai">Translating with AI</h2>
 
<p>The editor has an AI Translate button. On the AI Settings tab you pick a service and enter an API key. These services are supported, including Ollama and llama.cpp for a model on your own machine:</p>
 
<p><span style="display:inline-block;padding:7px 14px;border-radius:999px;background:#FFFFFF;border:1px solid #D9E2EC;font-size:14px;font-weight:bold;color:#1B3A63;margin:0 6px 8px 0;"><img src="https://www.tmssoftware.com/site/img/blog/ai-logo-openai.svg" width="18" height="18" alt="TMS Software Delphi  Components " style="width:18px;height:18px;vertical-align:-4px;margin-right:8px;">OpenAI</span><span style="display:inline-block;padding:7px 14px;border-radius:999px;background:#FFFFFF;border:1px solid #D9E2EC;font-size:14px;font-weight:bold;color:#1B3A63;margin:0 6px 8px 0;"><img src="https://www.tmssoftware.com/site/img/blog/ai-logo-claude.svg" width="18" height="18" alt="TMS Software Delphi  Components " style="width:18px;height:18px;vertical-align:-4px;margin-right:8px;">Claude</span><span style="display:inline-block;padding:7px 14px;border-radius:999px;background:#FFFFFF;border:1px solid #D9E2EC;font-size:14px;font-weight:bold;color:#1B3A63;margin:0 6px 8px 0;"><img src="https://www.tmssoftware.com/site/img/blog/ai-logo-google-gemini.svg" width="18" height="18" alt="TMS Software Delphi  Components " style="width:18px;height:18px;vertical-align:-4px;margin-right:8px;">Gemini</span><span style="display:inline-block;padding:7px 14px;border-radius:999px;background:#FFFFFF;border:1px solid #D9E2EC;font-size:14px;font-weight:bold;color:#1B3A63;margin:0 6px 8px 0;"><img src="https://www.tmssoftware.com/site/img/blog/ai-logo-grok.svg" width="18" height="18" alt="TMS Software Delphi  Components " style="width:18px;height:18px;vertical-align:-4px;margin-right:8px;">Grok</span><span style="display:inline-block;padding:7px 14px;border-radius:999px;background:#FFFFFF;border:1px solid #D9E2EC;font-size:14px;font-weight:bold;color:#1B3A63;margin:0 6px 8px 0;"><img src="https://www.tmssoftware.com/site/img/blog/ai-logo-mistral-ai.svg" width="18" height="18" alt="TMS Software Delphi  Components " style="width:18px;height:18px;vertical-align:-4px;margin-right:8px;">Mistral</span><span style="display:inline-block;padding:7px 14px;border-radius:999px;background:#FFFFFF;border:1px solid #D9E2EC;font-size:14px;font-weight:bold;color:#1B3A63;margin:0 6px 8px 0;"><img src="https://www.tmssoftware.com/site/img/blog/ai-logo-deepseek.svg" width="18" height="18" alt="TMS Software Delphi  Components " style="width:18px;height:18px;vertical-align:-4px;margin-right:8px;">DeepSeek</span><span style="display:inline-block;padding:7px 14px;border-radius:999px;background:#FFFFFF;border:1px solid #D9E2EC;font-size:14px;font-weight:bold;color:#1B3A63;margin:0 6px 8px 0;"><img src="https://www.tmssoftware.com/site/img/blog/ai-logo-perplexity.svg" width="18" height="18" alt="TMS Software Delphi  Components " style="width:18px;height:18px;vertical-align:-4px;margin-right:8px;">Perplexity</span><span style="display:inline-block;padding:7px 14px;border-radius:999px;background:#FFFFFF;border:1px solid #D9E2EC;font-size:14px;font-weight:bold;color:#1B3A63;margin:0 6px 8px 0;"><img src="https://www.tmssoftware.com/site/img/blog/ai-logo-openrouter.svg" width="18" height="18" alt="TMS Software Delphi  Components " style="width:18px;height:18px;vertical-align:-4px;margin-right:8px;">OpenRouter</span><span style="display:inline-block;padding:7px 14px;border-radius:999px;background:#FFFFFF;border:1px solid #D9E2EC;font-size:14px;font-weight:bold;color:#1B3A63;margin:0 6px 8px 0;"><img src="https://www.tmssoftware.com/site/img/blog/ai-logo-ollama.svg" width="18" height="18" alt="TMS Software Delphi  Components " style="width:18px;height:18px;vertical-align:-4px;margin-right:8px;">Ollama</span><span style="display:inline-block;padding:7px 14px;border-radius:999px;background:#FFFFFF;border:1px solid #D9E2EC;font-size:14px;font-weight:bold;color:#1B3A63;margin:0 6px 8px 0;">llama.cpp</span></p>
 
<p>AI Translate sends everything that is not translated yet, or whose English text changed, in batches. Each text travels with its component and property name, so a &#147;Right&#148; on an alignment button and a &#147;Right&#148; in a validation message get different words. Placeholders such as <code>%s</code> and <code>%d</code>, HTML tags and <code>&amp;</code> access keys are kept, and number snippets come back with the plural forms the language needs.</p>
 
<a href="https://www.tmssoftware.com/site/img/blog/LocalizationEditor-Translations.png" target="_blank" rel="noopener" title="Open full size"><img loading="lazy" src="https://www.tmssoftware.com/site/img/blog/LocalizationEditor-Translations.png" width="1720" height="793" alt="The Translations tab with the AI Translate button, frames and number snippets, and German translations" decoding="async" style="max-width:100%;height:auto;border-radius:12px;"></a><p></p><p><br>
 
</p><div style="padding:16px 20px;border-left:5px solid #1E7FC2;background:#F0F4F8;border-radius:8px;">
<p style="margin:0 0 6px 0;font-size:1.15em;color:#1B3A63;"><b>Review stays with you</b></p>
<p style="margin:0;">AI results come back as Proposed, not Approved, and the localizer only uses approved translations. A translation that loses a placeholder or a tag is rejected straight away, so it can never break a <code>Format</code> call in the shipped application.</p>
</div>
 
<p><br></p>
 
<h2 id="what-a-release-ships">What a release ships</h2>
 
<div style="display:flex;flex-wrap:wrap;gap:12px;margin:18px 0;">
<div style="flex:1 1 260px;padding:16px 18px;background:#F0F4F8;border:1px solid #D9E2EC;border-radius:10px;"><h3 style="margin-top:0;">translations.json</h3><p style="margin:0;">The authoring file, kept in source control and never deployed. It holds every language, status and rule. For FontCreator it is about 7 MB, split in two: the main window in one file, the dialogs in another. The editor keeps track of which form goes where.</p></div>
<div style="flex:1 1 260px;padding:16px 18px;background:#F0F4F8;border:1px solid #D9E2EC;border-radius:10px;"><h3 style="margin-top:0;">Runtime language files</h3><p style="margin:0;">What ships is an export. <i>Export Runtime Files</i> writes it next to translations.json, as one LANG file per language or as a single JSON file with all languages.</p></div>
</div>
 
<p>FontCreator uses LANG files of about 290 KB each. At startup the localizer reads only the header of each file to build the language list, and the full file is read only when that language is selected.</p>
 
<p>On Windows the files sit next to the executable. On macOS they go inside the application bundle, where the Deployment manager puts them. The editor&#146;s Info tab shows, for the selected platform and build configuration, where the localizer will look, where deployment puts the files, whether those agree, and when the translations were last exported. When the application runs from the IDE, the localizer reads the exported files straight from the project&#146;s export folder, so there is nothing to copy.</p>
 
<a href="https://www.tmssoftware.com/site/img/blog/LocalizationEditor-Info.png" target="_blank" rel="noopener" title="Open full size"><img loading="lazy" src="https://www.tmssoftware.com/site/img/blog/LocalizationEditor-Info.png" width="1720" height="805" alt="The Info tab of the Localization Editor showing where the runtime files are, what the application reads and a warning that the runtime files are older than the translation data" decoding="async" style="max-width:100%;height:auto;border-radius:12px;"></a>
 
<p><br></p>
 
<h2 id="performance">Performance</h2>
 
<p>High-Logic measured a release build of FontCreator outside the IDE, with a font and three dialogs open, and took the median of seven runs:</p>
 
<div style="display:flex;flex-wrap:wrap;gap:12px;margin:18px 0;">
<div style="flex:1 1 150px;padding:18px 14px;background:#FFFFFF;border:1px solid #D9E2EC;border-top:4px solid #1E7FC2;border-radius:10px;text-align:center;"><div style="font-size:2em;font-weight:bold;color:#1B3A63;line-height:1.1;">7.2 ms</div><div style="margin-top:4px;font-size:14px;color:#334155;">to make all 17 languages known at startup</div></div>
<div style="flex:1 1 150px;padding:18px 14px;background:#FFFFFF;border:1px solid #D9E2EC;border-top:4px solid #1E7FC2;border-radius:10px;text-align:center;"><div style="font-size:2em;font-weight:bold;color:#1B3A63;line-height:1.1;">223.5 ms</div><div style="margin-top:4px;font-size:14px;color:#334155;">for a full language switch</div></div>
</div>
 
<p>Startup stays fast however many languages ship, because only a short header of each LANG file is read. Of the 223 ms for a language switch, about 19 ms is the localizer walking the component tree and assigning text. The rest is the VCL resizing and repainting the controls whose captions changed.</p>
 
<p><br></p>
 
<h2 id="the-results">The results</h2>
 
<p>FontCreator now runs entirely on <a href="https://www.tmssoftware.com/site/tmsfnclocalization.asp" target="_blank" rel="noopener">TMS FNC Localization</a> instead of the layer High-Logic once wrote for itself. It ships in 17 languages on Windows and macOS, and every language holds about 3,850 strings.</p>
 
<div style="display:flex;flex-wrap:wrap;gap:12px;margin:18px 0;">
<div style="flex:1 1 150px;padding:18px 14px;background:#FFFFFF;border:1px solid #D9E2EC;border-top:4px solid #1E7FC2;border-radius:10px;text-align:center;"><div style="font-size:2em;font-weight:bold;color:#1B3A63;line-height:1.1;">17</div><div style="margin-top:4px;font-size:14px;color:#334155;">languages</div></div>
<div style="flex:1 1 150px;padding:18px 14px;background:#FFFFFF;border:1px solid #D9E2EC;border-top:4px solid #1E7FC2;border-radius:10px;text-align:center;"><div style="font-size:2em;font-weight:bold;color:#1B3A63;line-height:1.1;">88</div><div style="margin-top:4px;font-size:14px;color:#334155;">forms in the Windows version</div></div>
<div style="flex:1 1 150px;padding:18px 14px;background:#FFFFFF;border:1px solid #D9E2EC;border-top:4px solid #1E7FC2;border-radius:10px;text-align:center;"><div style="font-size:2em;font-weight:bold;color:#1B3A63;line-height:1.1;">3,850</div><div style="margin-top:4px;font-size:14px;color:#334155;">translatable strings per language</div></div>
<div style="flex:1 1 150px;padding:18px 14px;background:#FFFFFF;border:1px solid #D9E2EC;border-top:4px solid #1E7FC2;border-radius:10px;text-align:center;"><div style="font-size:2em;font-weight:bold;color:#1B3A63;line-height:1.1;">532</div><div style="margin-top:4px;font-size:14px;color:#334155;">snippets shared with macOS</div></div>
</div>
 
<p>Keeping all those languages up to date has become a matter of review. Once the exclusion rules were in place, what remained was checking translations. AI Translate prepares the first pass, and 532 snippets are translated once for both platforms. Hindi and Hungarian are already set up in the editor and stay Excluded until their translations are ready.</p>
 
<p>For users, changing language is quick: a full language switch takes about 223 ms, and making all 17 languages available at startup takes 7.2 ms.</p>
 
<blockquote style="margin:22px 0;padding:16px 22px;border-left:5px solid #1E7FC2;background:#FFFFFF;border-top:1px solid #D9E2EC;border-right:1px solid #D9E2EC;border-bottom:1px solid #D9E2EC;border-radius:8px;">
<p style="margin:0 0 8px 0;font-size:1.2em;line-height:1.5;color:#1B3A63;"><i>&#147;We built this because we needed it, and it is now doing the job in an application with 88 forms, two platforms, 17 languages and five million downloads behind it.&#148;</i></p>
<p style="margin:0;font-size:14px;color:#64748B;">Erwin Denissen, <a href="https://www.high-logic.com" target="_blank" rel="noopener" style="color:#64748B;">High-Logic B.V.</a></p>
</blockquote>
 
<p><br></p>
 
<h2 id="erwins-advice">Erwin&#146;s advice: start with one form</h2>
 
<p>Pick one form. Set the labels so they do not auto-size, give the check boxes room and check that nothing assigns a caption from code. Drop the localizer on your main form, open the editor, add your languages and write your exclusion rules. Let AI Translate do a first pass, review it, and ship that one form translated.</p>
 
<blockquote style="margin:22px 0;padding:16px 22px;border-left:5px solid #1E7FC2;background:#FFFFFF;border-top:1px solid #D9E2EC;border-right:1px solid #D9E2EC;border-bottom:1px solid #D9E2EC;border-radius:8px;">
<p style="margin:0 0 8px 0;font-size:1.2em;line-height:1.5;color:#1B3A63;"><i>&#147;The first form teaches you your own rules. After that it is mostly review.&#148;</i></p>
<p style="margin:0;font-size:14px;color:#64748B;">Erwin Denissen, <a href="https://www.high-logic.com" target="_blank" rel="noopener" style="color:#64748B;">High-Logic B.V.</a></p>
</blockquote>
<p><br></p>
 
<h2 id="try-tms-fnc-localization">Try TMS FNC Localization</h2>
 
<p><a href="https://www.tmssoftware.com/site/tmsfnclocalization.asp" target="_blank" rel="noopener">TMS FNC Localization</a> is available now as version 0.9.4.0 BETA and works in VCL, FMX and TMS WEB Core applications, in Delphi and C++Builder. Everything about getting started is on the <a href="https://www.tmssoftware.com/site/tmsfnclocalization.asp" target="_blank" rel="noopener">product page</a>.</p>
 
<p><img src="https://www.tmssoftware.com/site/img/blog/vcl_big.png" width="56" height="56" alt="VCL" title="VCL" style="width:56px;height:56px;border-radius:8px;margin:0 8px 8px 0;vertical-align:middle;"><img src="https://www.tmssoftware.com/site/img/blog/fmx_big.png" width="56" height="56" alt="FMX (FireMonkey)" title="FMX (FireMonkey)" style="width:56px;height:56px;border-radius:8px;margin:0 8px 8px 0;vertical-align:middle;"><img src="https://www.tmssoftware.com/site/img/blog/web_big.png" width="56" height="56" alt="TMS WEB Core" title="TMS WEB Core" style="width:56px;height:56px;border-radius:8px;margin:0 8px 8px 0;vertical-align:middle;"></p>
 
<p><a href="https://www.tmssoftware.com/site/tmsfnclocalization.asp" target="_blank" rel="noopener" style="display:inline-block;padding:12px 24px;border-radius:8px;background:#1E7FC2;color:#FFFFFF;font-weight:bold;text-decoration:none;">Discover TMS FNC Localization</a></p>
 
<p><br></p><p>Questions about localizing your own application? Let us know:</p>
 
<div style="display:flex;flex-wrap:wrap;gap:12px;margin:14px 0;">
<a href="https://download.tmssoftware.com/doc/" target="_blank" rel="noopener" style="flex:1 1 200px;display:block;padding:16px 18px;background:#FFFFFF;border:1px solid #D9E2EC;border-radius:10px;text-decoration:none;"><span style="display:block;font-weight:bold;color:#1E7FC2;">Documentation →</span><span style="display:block;margin-top:4px;font-size:14px;color:#334155;">Manuals for all TMS products</span></a>
<a href="https://support.tmssoftware.com/c/fnc" target="_blank" rel="noopener" style="flex:1 1 200px;display:block;padding:16px 18px;background:#FFFFFF;border:1px solid #D9E2EC;border-radius:10px;text-decoration:none;"><span style="display:block;font-weight:bold;color:#1E7FC2;">Support Center →</span><span style="display:block;margin-top:4px;font-size:14px;color:#334155;">Ask your question in the FNC section</span></a>
<a href="mailto:info@tmssoftware.com" target="_blank" rel="noopener" style="flex:1 1 200px;display:block;padding:16px 18px;background:#FFFFFF;border:1px solid #D9E2EC;border-radius:10px;text-decoration:none;"><span style="display:block;font-weight:bold;color:#1E7FC2;">Email →</span><span style="display:block;margin-top:4px;font-size:14px;color:#334155;">info@tmssoftware.com</span></a>
</div>
 
<p><br></p><p></p>
		
		
		
		
		<br><br></P>]]></description>
	</item>
	<item>
		<title><![CDATA[TMS Scripter Now Speaks JavaScript]]></title>
		<link>https://www.tmssoftware.com/site/blog.asp?post=2563</link>
		<author>Wagner Landgraf</author>
		<pubDate>Tue, 3 Nov 2026 12:00:00 +0000</pubDate>
		<description><![CDATA[<P>
		<p>Sooner or later, a successful Delphi application meets a customer who needs it to work a little differently. A discount rule that depends on the region. An extra validation before an invoice is saved. A report column computed with a formula of their own. A menu command that exports data to a partner's format.</p>
<p>You can build each of these into the application, and ship a new version to every customer for a rule only one of them needs. Or you can make that part of the application scriptable, and let the rule be written - by your support team, a consultant, or the customer's own IT staff - without recompiling anything.</p>
<p>Scripting has one practical question, though: <strong>in what language will those people write?</strong> Most of them have never written Object Pascal. Almost all of them have written some JavaScript.</p>
<p>&nbsp;</p>
<h3>A quick introduction to TMS Scripter</h3>
<p><a href="https://www.tmssoftware.com/site/scriptstudiopro.asp">TMS Scripter</a> is a scripting engine for Delphi applications. It runs scripts inside your application at runtime and gives them access to the objects, classes and functions that you choose to expose. It also includes an IDE that you can embed in your application, with a code editor, a form designer and a debugger, so your users can write and test their scripts where they use them.</p>
<p>Until now, scripts could be written in Pascal or Basic syntax. <strong>TMS Scripter 9.0 adds JavaScript.</strong></p>
<p>&nbsp;</p>
<h3>What JavaScript support means</h3>
<p>JavaScript scripts use the syntax people already know: <code>function</code>, <code>var</code>, <code>let</code> and <code>const</code>, <code>if</code>/<code>else</code>, <code>for</code>, <code>while</code> and <code>do..while</code>, <code>switch</code>, <code>try</code>/<code>catch</code>/<code>finally</code>, <code>throw</code>, <code>++</code>, <code>+=</code>, the <code>?:</code> operator, array literals and <code>//</code> comments.</p>
<p>They run on the <strong>same engine</strong> as the Pascal and Basic scripts. That has a few practical consequences:</p>
<ul>
<li><strong>Everything you expose to scripts is available in JavaScript.</strong> Classes registered by RTTI, objects added with <code>AddObject</code>, libraries, functions, events - the same registration serves the three languages.</li>
<li><strong>Nothing new to deploy.</strong> There is no external JavaScript runtime, DLL or package to ship with your application.</li>
<li><strong>The languages work together.</strong> A JavaScript script can use a unit written in Pascal or Basic, and the other way around.</li>
<li><strong>The tooling is the same.</strong> The Scripter IDE supports JavaScript units (<code>.jsc</code> files), with syntax highlighting, code completion, forms declared in script, and debugging with breakpoints and watches.</li>
</ul>
<p>&nbsp;</p>
<h3>Hello, JavaScript</h3>
<p>This is a complete console application that runs a JavaScript script:</p>
<p>&nbsp;</p>
<pre><code>program HelloScripter;

{$APPTYPE CONSOLE}

uses
  System.SysUtils,
  System.Variants,
  atScripter;

var
  Scripter: TatScripter;
  ScriptResult: Variant;
begin
  Scripter := TatScripter.Create(nil);
  try
    // The language of the script: slJavaScript, slPascal or slBasic
    Scripter.CurrentScript := Scripter.AddScript(slJavaScript);

    // In a console application, ShowMessage writes to the console
    Scripter.SourceCode.Text :=
      'var name = "World";' + sLineBreak +
      'ShowMessage("Hello, " + name + "!");' + sLineBreak +
      'return 6 * 7;';

    // Compiles and runs the script, and returns the value given by its return statement
    ScriptResult := Scripter.ExecuteAsVariant;
    WriteLn('The script returned ', VarToStr(ScriptResult));
  finally
    Scripter.Free;
  end;
end.
</code></pre>
<p>&nbsp;</p>
<p><a href="https://doc.tmssoftware.com/biz/scripter/api/atScripter/TatBaseScripter/AddScript.html"><code>AddScript</code></a> creates a script in the language you choose. If most of your scripts are in JavaScript, set <a href="https://doc.tmssoftware.com/biz/scripter/api/atScripter/TatBaseScripter/DefaultLanguage.html"><code>DefaultLanguage</code></a> to <code>slJavaScript</code> instead.</p>
<p>&nbsp;</p>
<h3>A business rule in JavaScript</h3>
<p>Back to the discount rule. The rule lives in a script file that can change without a new build of the application:</p>
<p>&nbsp;</p>
<pre><code>// pricing.jsc
function discount(total, customerType) {
  if (customerType == "VIP")
    return 15;
  if (total &gt;= 100)
    return 10;
  return 0;
}
</code></pre>
<p>&nbsp;</p>
<p>The application compiles the script once, and calls the function whenever it prices an order:</p>
<p>&nbsp;</p>
<pre><code>uses
  atScripter;

type
  TPricingRules = class
  private
    FScripter: TatScripter;
  public
    constructor Create(const RulesFile: string);
    destructor Destroy; override;
    function Discount(Total: Double; const CustomerType: string): Double;
  end;

constructor TPricingRules.Create(const RulesFile: string);
begin
  inherited Create;
  FScripter := TatScripter.Create(nil);
  FScripter.CurrentScript := FScripter.AddScript(slJavaScript);
  FScripter.SourceCode.LoadFromFile(RulesFile);

  // Compiled once; its functions can then be called as often as needed
  FScripter.Compile;
end;

destructor TPricingRules.Destroy;
begin
  FScripter.Free;
  inherited;
end;

function TPricingRules.Discount(Total: Double; const CustomerType: string): Double;
begin
  Result := FScripter.ExecuteSubroutineAsVariant('discount', [Total, CustomerType]);
end;
</code></pre>
<p>&nbsp;</p>
<p>When the customer wants 5% off for orders from 50, someone edits <code>pricing.jsc</code>. The Delphi code doesn't change.</p>
<p>&nbsp;</p>
<h3>Your Delphi objects, in JavaScript</h3>
<p>Rules become much more useful when they work with the objects of your application. Here is an ordinary Delphi class - nothing in it knows about Scripter:</p>
<p>&nbsp;</p>
<pre><code>type
  TOrder = class
  // private fields and getters omitted
  public
    function AddItem(const AProduct: string; AQuantity: Integer; AUnitPrice: Double): TOrderItem;
    function Total: Double;
    property Number: Integer read FNumber;
    property Customer: TCustomer read FCustomer;
    property Items[Index: Integer]: TOrderItem read GetItem;
    property ItemCount: Integer read GetItemCount;
  end;
</code></pre>
<p>&nbsp;</p>
<p>One call to <a href="https://doc.tmssoftware.com/biz/scripter/api/atScript/TatCustomScripter/DefineClassByRTTI.html"><code>DefineClassByRTTI</code></a> makes its public members available to scripts, and <a href="https://doc.tmssoftware.com/biz/scripter/api/atScript/TatCustomScripter/AddObject.html"><code>AddObject</code></a> gives the script an instance to work with:</p>
<p>&nbsp;</p>
<pre><code>uses
  System.TypInfo, atScript, atScripter;

procedure RunOrderScript(Scripter: TatScripter; Order: TOrder);
begin
  // True also registers the classes used by TOrder: TCustomer and TOrderItem
  Scripter.DefineClassByRTTI(TOrder, '', [mvPublic, mvPublished], True);
  Scripter.AddObject('Order', Order);
  Scripter.Execute;
end;
</code></pre>
<p>&nbsp;</p>
<p>The script uses the order with its Delphi names - properties, methods, indexed properties, and the objects they return:</p>
<p>&nbsp;</p>
<pre><code>Print("Order " + IntToStr(Order.Number) + " for " + Order.Customer.Name);

Order.AddItem("Croissant", 3, 2.5);
var juice = Order.AddItem("Orange juice", 1, 3);
juice.Quantity = 2;

for (var i = 0; i &lt; Order.ItemCount; i++) {
  var item = Order.Items[i];
  Print(IntToStr(item.Quantity) + " x " + item.Product + ": " +
    FormatFloat("0.00", item.Total()));
}
Print("Total: " + FormatFloat("0.00", Order.Total()));
</code></pre>
<p>&nbsp;</p>
<p>(<code>Print</code> is not a Scripter routine: it is a function that the demo application exposes to its scripts, to write to its output pane. Your application can expose its own functions the same way.)</p>
<p>Events work the same way. A script function can handle an event of any object, by assigning its name to the event property:</p>
<p>&nbsp;</p>
<pre><code>function SaveClick(Sender) {
  ShowMessage("Saving " + edName.Text);
}

btSave.OnClick = "SaveClick";
</code></pre>
<p>&nbsp;</p>
<h3>Pascal, Basic and JavaScript, together</h3>
<p>If you already have Pascal or Basic scripts, you don't have to rewrite them to start using JavaScript. Each script has its own language, and scripts use each other by unit name, whatever language each one is written in:</p>
<p>&nbsp;</p>
<pre><code>procedure AddUnit(Scripter: TatScripter; Language: TScriptLanguage;
  const AUnitName, FileName: string);
var
  ScriptUnit: TatScript;
begin
  ScriptUnit := Scripter.AddScript(Language);
  ScriptUnit.UnitName := AUnitName;
  ScriptUnit.SourceCode.LoadFromFile(FileName);
end;

procedure AddUnits(Scripter: TatScripter);
begin
  AddUnit(Scripter, slPascal, 'TaxRules', 'TaxRules.psc');
  AddUnit(Scripter, slBasic, 'Formats', 'Formats.bsc');
  AddUnit(Scripter, slJavaScript, 'Discounts', 'Discounts.jsc');
end;
</code></pre>
<p>&nbsp;</p>
<p>A JavaScript script then imports the three units and calls their functions as if they were its own:</p>
<p>&nbsp;</p>
<pre><code>import TaxRules, Formats, Discounts;

var Net = ApplyDiscount(100, 10);  // Discounts.jsc
var Total = AddTax(Net);           // TaxRules.psc
Print(FormatPrice(Total));         // Formats.bsc
</code></pre>
<p>&nbsp;</p>
<img src="https://download.tmssoftware.com/business/images/blog/26-11-03-scripter-javascript-mixed-languages.png" alt="A JavaScript script that uses units written in Pascal, Basic and JavaScript, in the TMS Scripter Playground demo" style="width: 100%; max-width: 1387px; height: auto; display: block; margin: 0 auto;">
<p>A team can keep its tested Pascal routines and write new scripts in JavaScript, or let each user write in the language they prefer.</p>
<p>&nbsp;</p>
<h3>Forms, the IDE and debugging</h3>
<p>JavaScript scripts can declare forms, too. A <code>//$FORM</code> directive links the script to a form file. The components of the form are available by name, the global variables of the script become properties of the form, and its functions become methods:</p>
<p>&nbsp;</p>
<pre><code>//$FORM TCustomerForm, CustomerForm.dfm
import Controls;

var CustomerId;

function Init(Id) {
  CustomerId = Id;
  Caption = "Customer " + IntToStr(Id);
  edName.OnChange = "NameChange";
}

function NameChange(Sender) {
  Caption = "Customer " + IntToStr(CustomerId) + ": " + edName.Text;
}
</code></pre>
<p>&nbsp;</p>
<p>Another script creates and shows instances of the form like any other class:</p>
<p>&nbsp;</p>
<pre><code>import Classes, Controls, Forms, CustomerForm;

var Form = new TCustomerForm(Application);
Form.Init(1);
Form.edName.Text = "Alfreds Futterkiste";
if (Form.ShowModal() == mrOk)
  ShowMessage("Saved " + Form.edName.Text);
Form.Free();
</code></pre>
<p>&nbsp;</p>
<p>The <a href="https://doc.tmssoftware.com/biz/scripter/guide/ide.html">Scripter IDE</a> handles JavaScript units like Pascal and Basic ones: you design the form, write the code with highlighting and code completion, and run or debug the project. This is a complete game written in JavaScript, running from the IDE:</p>
<img src="https://download.tmssoftware.com/business/images/blog/26-11-03-scripter-javascript-snake-ide.png" alt="The Snake game, written in JavaScript, running from the TMS Scripter IDE" style="width: 100%; max-width: 1287px; height: auto; display: block; margin: 0 auto;">
<p>If you build your own script editor instead, the new <code>TScrJavaScriptMemoStyler</code> component gives the <code>TScrMemo</code> editor JavaScript syntax highlighting:</p>
<p>&nbsp;</p>
<pre><code>ScrMemo1.SyntaxStyles := ScrJavaScriptMemoStyler1;
</code></pre>
<p>&nbsp;</p>
<h3>JavaScript syntax, Delphi objects</h3>
<p>It is worth being clear about what this is: the syntax of JavaScript for scripting <strong>your Delphi application</strong>, not a browser or Node.js runtime. Scripts work with the objects your application provides, not with npm packages or the DOM. That keeps scripts small and focused on your domain, and keeps the behavior consistent with Pascal and Basic scripts. A few differences follow from it:</p>
<ul>
<li><strong>Names are not case-sensitive</strong>, as in Delphi: <code>Order.Total</code>, <code>order.total</code> and <code>ORDER.TOTAL</code> are the same.</li>
<li><strong>Objects are Delphi objects.</strong> <code>new TStringList()</code> calls the constructor, <code>Free()</code> destroys the object. Object literals, classes, prototypes and closures are not supported.</li>
<li><strong>There is no JavaScript standard library</strong> (<code>Math</code>, <code>JSON</code>, <code>Date</code>, string methods). Scripts use the <a href="https://doc.tmssoftware.com/biz/scripter/guide/builtins.html">built-in routines</a> - <code>IntToStr</code>, <code>FormatFloat</code>, <code>Copy</code>, <code>Now</code> and many others - and the libraries your application registers.</li>
<li><strong><code>catch</code> has no parameter</strong>: the error is available in <code>LastExceptionMessage</code>.</li>
</ul>
<p>The full list is in <a href="https://doc.tmssoftware.com/biz/scripter/guide/javascript.html#differences-from-standard-javascript">Differences from standard JavaScript</a>. The <a href="https://doc.tmssoftware.com/biz/scripter/guide/javascript.html">JavaScript language reference</a> is written for script authors, so you can hand it to the people who write the scripts of your application.</p>
<p>&nbsp;</p>
<h3>Where it fits</h3>
<ul>
<li><strong>Business rules and formulas</strong> - prices, discounts, taxes, commissions, validations - that change more often than your release cycle.</li>
<li><strong>Plugins and extensions</strong>: let customers add menu commands, handle events and automate tasks in your application.</li>
<li><strong>Per-customer customization</strong> of a product that ships the same executable to everybody.</li>
<li><strong>Automation and macros</strong> for power users who know JavaScript from spreadsheets, browsers or web development.</li>
<li><strong>Gradual adoption</strong>: add JavaScript next to your existing Pascal and Basic scripts, without migrating them.</li>
</ul>
<p>&nbsp;</p>
<h3>Conclusion</h3>
<p>TMS Scripter 9.0 lets the people who customize your application write in the language they most likely already know:</p>
<ul>
<li><strong>JavaScript syntax</strong>, on the same engine as Pascal and Basic, with nothing new to deploy.</li>
<li><strong>Full access to your Delphi objects</strong>, registered once for all three languages.</li>
<li><strong>Mixed languages</strong>: JavaScript, Pascal and Basic scripts that use each other.</li>
<li><strong>IDE support</strong>: JavaScript units, forms, code completion and debugging.</li>
</ul>
<p>To learn more, read the <a href="https://doc.tmssoftware.com/biz/scripter/guide/javascript.html">JavaScript language reference</a> and the chapter <a href="https://doc.tmssoftware.com/biz/scripter/guide/scripter.html">Working with Scripter</a>, see <a href="https://doc.tmssoftware.com/biz/scripter/about/whatsnew.html">what's new in TMS Scripter 9.0</a>, and visit the <a href="https://www.tmssoftware.com/site/scriptstudiopro.asp">TMS Scripter product page</a>. The examples in this post are based on the new demos of TMS Scripter, where every script is available in JavaScript, Pascal and Basic - so you can also compare the three languages side by side.</p>

		<br><br></P>]]></description>
	</item>
	<item>
		<title><![CDATA[AI That Reads Attachments, Remembers Customers and Catches Spam]]></title>
		<link>https://www.tmssoftware.com/site/blog.asp?post=2553</link>
		<author>Bradley Velghe</author>
		<pubDate>Tue, 3 Nov 2026 12:00:00 +0000</pubDate>
		<description><![CDATA[<P>
		
		
			
<p style="font-size:1.15em;line-height:1.6;">In <a href="https://www.tmssoftware.com/site/blog.asp?post=2551" target="_blank">part 1</a> the AI classified a mail from its text alone. Real customer mail carries more: a photo of a warning light, an invoice PDF, a history with the dealership, and in between it all, mail that should never reach a person. This post adds those three layers to the triage of AI Mail Desk, without adding a second AI request.</p>

<div style="display:flex;flex-wrap:wrap;gap:14px;margin:22px 0;">
  <div style="flex:1;min-width:150px;background:linear-gradient(145deg,#1B3A63,#12294A);border:1px solid #26507F;border-radius:12px;padding:16px 14px;text-align:center;box-shadow:0 4px 18px rgba(27,58,99,0.18);">
    <div style="font-family:Consolas,monospace;font-size:20px;font-weight:700;background:linear-gradient(90deg,#7FD1F7,#29B6E8);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:#29B6E8;">photos + PDFs</div>
    <div style="font-family:Consolas,monospace;font-size:10.5px;color:#B6CADE;margin-top:4px;">travel along with the triage request</div>
  </div>
  <div style="flex:1;min-width:150px;background:linear-gradient(145deg,#1B3A63,#12294A);border:1px solid #26507F;border-radius:12px;padding:16px 14px;text-align:center;box-shadow:0 4px 18px rgba(27,58,99,0.18);">
    <div style="font-family:Consolas,monospace;font-size:20px;font-weight:700;background:linear-gradient(90deg,#7FD1F7,#29B6E8);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:#29B6E8;">SQLite</div>
    <div style="font-family:Consolas,monospace;font-size:10.5px;color:#B6CADE;margin-top:4px;">remembers every customer and their handler</div>
  </div>
  <div style="flex:1;min-width:150px;background:linear-gradient(145deg,#1B3A63,#12294A);border:1px solid #26507F;border-radius:12px;padding:16px 14px;text-align:center;box-shadow:0 4px 18px rgba(27,58,99,0.18);">
    <div style="font-family:Consolas,monospace;font-size:20px;font-weight:700;background:linear-gradient(90deg,#7FD1F7,#29B6E8);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:#29B6E8;">2 fields</div>
    <div style="font-family:Consolas,monospace;font-size:10.5px;color:#B6CADE;margin-top:4px;">in the same JSON answer catch the spam</div>
  </div>
  <div style="flex:1;min-width:150px;background:linear-gradient(145deg,#1B3A63,#12294A);border:1px solid #26507F;border-radius:12px;padding:16px 14px;text-align:center;box-shadow:0 4px 18px rgba(27,58,99,0.18);">
    <div style="font-family:Consolas,monospace;font-size:26px;font-weight:700;background:linear-gradient(90deg,#7FD1F7,#29B6E8);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:#29B6E8;">1</div>
    <div style="font-family:Consolas,monospace;font-size:10.5px;color:#B6CADE;margin-top:4px;">AI request per mail for all of it</div>
  </div>
</div><p><br></p>

<h3 style="border-left:4px solid #1E7FC2;padding-left:12px;">Photos and PDFs Go Along with the Mail</h3>

<p>When TMS FNC Cloud Pack fetches a mail, the server downloads image and PDF attachments right away: Gmail through <code>GetAttachment</code> and <code>OnGetAttachment</code>, Outlook through <code>GetAttachments</code> and <code>OnGetAttachments</code>. Each file is saved next to the server's data and its path is stored on the mail.</p>

<p>At triage time, <code>TTMSMCPCloudAI</code> sends those files with the request. AI Studio picks the right file type from the extension:</p>

<pre class="delphi" name="code">FAI.Context.Text := BuildMailPrompt(M);
// Photos and PDFs travel with the request; the model describes them in "attachments"
FAI.ClearFiles;
for Path in M.Attachments do
  if TFile.Exists(Path) then
    FAI.AddFile(Path, FileExtToFileType(Path));
FAI.Execute(M.ID.ToString);</pre>

<p>The prompt asks the model to describe what matters for the handler in an <code>attachments</code> field: the warning lights on a dashboard photo, visible damage, or the number, date and amount on an invoice. The model also uses what it sees for the classification itself. A short "my car broke down" with a photo of a red engine warning becomes a confident, urgent maintenance mail.</p>

<p>In the demo inbox, Ellen De Smet's breakdown mail carries a dashboard photo and Nathalie Maes' complaint about a double charge carries the invoice as a PDF, so you can try this with any vision-capable model.</p>

<p><br></p>

<h3 style="border-left:4px solid #1E7FC2;padding-left:12px;">A Customer Memory in SQLite</h3>

<p>Every triaged mail is stored in a small SQLite database through FireDAC: who wrote, when, which department, which handler and the one-line summary. When a new mail arrives from a known address, the last few contacts are added to the prompt as <em>Earlier contact</em>, and the AI is told to take them into account. A follow-up on last month's repair is then recognised as a follow-up, not as a new request.</p>

<p>The history also changes the routing. A returning customer goes back to the person who handled their last mail in the same department, as long as that person is still in the routing table:</p>

<pre class="delphi" name="code">FQuery.Open('SELECT handler_email, received FROM history WHERE lower(email) = lower(:e) ' +
  'AND department = :d AND source_id &lt;&gt; :s ORDER BY received DESC LIMIT 1',
  [AMail.FromEmail, Ord(AMail.Department), HistoryKey(AMail)]);</pre>

<p>If that handler still owns the department, the mail is routed to them and the reason says why. In the demo, Pieter Jacobs asks for a test drive in an Audi Q6 e-tron. The routing table would send that to the Audi salesperson, but Pieter received a quote from Lukas Peeters a month earlier, so the mail stays with Lukas:</p>

<p><img src="https://www.tmssoftware.com/site/img/blog/aimaildesk/returning-customer.png" alt="The analysis of Pieter Jacobs' test drive request: routed to Lukas Peeters because he handled the earlier contact." style="max-width:100%;height:auto;border-radius:12px;border:1px solid #DCE4EC;box-shadow:0 10px 30px -12px rgba(27,58,99,0.30);"></p>
<p style="text-align:center;font-size:13px;color:#4E6A88;"><i>A returning customer keeps their contact person: "Returning customer: kept with Lukas Peeters".</i></p>

<p>The same history is available as an MCP tool, <code>find_customer</code>, so an LLM working the inbox can look up a customer before it answers a question about them.</p>

<p><br></p>

<h3 style="border-left:4px solid #1E7FC2;padding-left:12px;">Spam in the Same Request</h3>

<p>A dealership address attracts prize scams, crypto offers and cold sales pitches for search engine optimisation. Rather than a separate filter, the triage asks for two more fields in the same JSON answer: <code>"spam"</code> and <code>"spam_reason"</code>. The prompt is explicit about what does <em>not</em> count as spam: a real customer, supplier or job applicant never is, even when the mail is short or rude.</p>

<p>Spam leaves the inbox and waits on its own page, with the reason and a preview. The count shows in the sidebar.</p>

<p><img src="https://www.tmssoftware.com/site/img/blog/aimaildesk/spam.png" alt="The Spam page with two flagged mails, the reason for each, and Not spam, Delete and Delete all buttons." style="max-width:100%;height:auto;border-radius:12px;border:1px solid #DCE4EC;box-shadow:0 10px 30px -12px rgba(27,58,99,0.30);"></p>
<p style="text-align:center;font-size:13px;color:#4E6A88;"><i>Flagged mails wait for review. Not spam puts a mail back in the inbox; Delete moves it to the mailbox's trash.</i></p>

<p>Two details keep the filter safe:</p>

<div style="display:flex;flex-wrap:wrap;gap:12px;margin:18px 0 26px;"><div style="flex:1 1 220px;padding:16px 18px;border-radius:12px;background:#FFFFFF;border:1px solid #DCE4EC;border-top:3px solid #1B3A63;"><div style="font-family:Roboto,'Segoe UI',sans-serif;font-size:15.5px;font-weight:700;color:#1B3A63;margin:0 0 6px;">Not spam is remembered</div><div style="font-size:14px;line-height:1.6;color:#24384B;">A mail that a person put back in the inbox is never flagged again, whatever the next triage says.</div></div><div style="flex:1 1 220px;padding:16px 18px;border-radius:12px;background:#FFFFFF;border:1px solid #DCE4EC;border-top:3px solid #1B3A63;"><div style="font-family:Roboto,'Segoe UI',sans-serif;font-size:15.5px;font-weight:700;color:#1B3A63;margin:0 0 6px;">Delete is recoverable</div><div style="font-size:14px;line-height:1.6;color:#24384B;">A mail from Gmail or Outlook moves to the trash of that mailbox, not into oblivion, so a mistake can be undone there.</div></div></div>

<p>Without an AI service, an offline check flags a mail when it contains two or more typical scam or cold-pitch phrases, matched as whole words so that "seo" does not match "Seoul".</p>

<div style="background:linear-gradient(120deg,#1B3A63,#12294A);border-radius:8px;padding:18px 22px;margin:22px 0;border:1px solid #26507F;box-shadow:0 4px 20px rgba(27,58,99,0.18);position:relative;">
  <div style="position:absolute;left:0;top:0;bottom:0;width:4px;background:linear-gradient(180deg,#29B6E8,#1E7FC2);border-radius:8px 0 0 8px;"></div>
  <p style="margin:0;font-family:Consolas,monospace;font-size:14px;font-style:italic;color:#F0F4F8;">"None of these additions needs a second model call."</p>
</div><p><br></p>

<h3 style="border-left:4px solid #1E7FC2;padding-left:12px;">Conclusion</h3>

<p>None of these additions needs a second model call. The attachments ride along with <code>AddFile</code>, the history is a few lines of SQL and a paragraph in the prompt, and spam detection is two extra fields in the JSON the AI already returns. The result is a triage that sees what the customer sent, knows who they are and keeps the junk away from the team. In the next post, the triaged mail turns into action: drafts, forwards, workshop slots, alerts and translations.</p>

<div style="display:flex;flex-wrap:wrap;align-items:center;gap:14px 18px;margin:18px 0 18px;padding:18px;border-radius:14px;background:#F0F4F8;border:1px solid #DCE4EC;"><div style="flex:1 1 280px;min-width:0;"><div style="font-family:Roboto,'Segoe UI',sans-serif;font-weight:700;font-size:15.5px;color:#1B3A63;margin:0 0 4px;">Download AI Mail Desk</div><div style="font-size:14px;line-height:1.6;color:#24384B;">The full source code is on GitHub, together with ready-to-run Win32 builds of both editions. The code from this post is in <code>MCPServer\uTriageEngine.pas</code>.</div></div><div style="display:flex;flex-wrap:wrap;gap:10px;"><a href="https://github.com/tmssoftware/tms.demos.aimaildesk/releases" style="display:inline-block;padding:9px 18px;border-radius:999px;background:#1E7FC2;color:#FFFFFF;border:1px solid #1E7FC2;font-family:Roboto,'Segoe UI',sans-serif;font-weight:600;font-size:14px;text-decoration:none;white-space:nowrap;">↓&nbsp; Download the Win32 binaries</a><a href="https://github.com/tmssoftware/tms.demos.aimaildesk" style="display:inline-block;padding:9px 18px;border-radius:999px;background:#FFFFFF;color:#16283C;border:1px solid #C3D0DD;font-family:Roboto,'Segoe UI',sans-serif;font-weight:600;font-size:14px;text-decoration:none;white-space:nowrap;">View the source on GitHub</a></div></div>

<p><br></p>

<hr>

<div style="display:flex;flex-wrap:wrap;gap:8px;margin:14px 0 6px;"><a href="https://www.tmssoftware.com/site/tmsaistudio.asp" style="display:inline-flex;align-items:center;gap:8px;padding:3px 11px 3px 3px;border-radius:7px;background:#F1F5F9;border:1px solid #DCE4EC;text-decoration:none;white-space:nowrap;"><span style="font-family:Consolas,monospace;font-weight:700;font-size:11px;letter-spacing:.1em;color:#FFFFFF;background:#1B3A63;padding:3px 7px;border-radius:5px;">AI</span><span style="font-family:Consolas,monospace;font-size:11px;font-weight:500;letter-spacing:.14em;text-transform:uppercase;color:#1B3A63;">TMS AI Studio</span></a></div>
<p><b><a href="https://www.tmssoftware.com/site/tmsaistudio.asp">TMS AI Studio</a></b> is the complete toolkit for bringing AI and the Model Context Protocol to your Delphi applications. Build MCP servers and clients, connect Claude and other assistants to your own tools and data, and add cloud AI to your VCL and FMX apps, all in native Delphi. <a href="https://www.tmssoftware.com/site/tmsaistudio.asp">Discover TMS AI Studio</a>.</p>

<div style="display:flex;flex-wrap:wrap;gap:8px;margin:14px 0 6px;"><a href="https://www.tmssoftware.com/site/tmsfnccloudpack.asp" style="display:inline-flex;align-items:center;gap:8px;padding:3px 11px 3px 3px;border-radius:7px;background:#F1F5F9;border:1px solid #DCE4EC;text-decoration:none;white-space:nowrap;"><span style="font-family:Consolas,monospace;font-weight:700;font-size:11px;letter-spacing:.1em;color:#FFFFFF;background:#1B3A63;padding:3px 7px;border-radius:5px;">FNC</span><span style="font-family:Consolas,monospace;font-size:11px;font-weight:500;letter-spacing:.14em;text-transform:uppercase;color:#1B3A63;">TMS FNC Cloud Pack</span></a></div>
<p><b><a href="https://www.tmssoftware.com/site/tmsfnccloudpack.asp">TMS FNC Cloud Pack</a></b> connects your Delphi applications to cloud services such as Gmail, Outlook, Google Calendar, Outlook Calendar, Pushover and many more, with the OAuth sign-in handled for you. <a href="https://www.tmssoftware.com/site/tmsfnccloudpack.asp">Discover TMS FNC Cloud Pack</a>.</p>

		
		
		
		<br><br></P>]]></description>
	</item>
	<item>
		<title><![CDATA[Classify and Route Customer Mail with AI in Delphi]]></title>
		<link>https://www.tmssoftware.com/site/blog.asp?post=2551</link>
		<author>Bradley Velghe</author>
		<pubDate>Thu, 29 Oct 2026 12:00:00 +0000</pubDate>
		<description><![CDATA[<P>
		
		
		<p style="font-size:1.15em;line-height:1.6;">In the <a href="https://www.tmssoftware.com/site/blog.asp?post=2548" target="_blank">introduction to AI Mail Desk</a> we met Brightline Motors, a car dealership that lets an AI do the first pass over its mailbox. This post covers the core of that idea: getting mail out of Gmail and Outlook, asking an LLM what each mail is about, and turning the answer into a handler, a priority and a reply.</p>



<p><img src="https://www.tmssoftware.com/site/img/blog/aimaildesk/triage-flow.png" alt="A Dutch customer mail goes to TTMSMCPCloudAI, which returns JSON that the routing table turns into a handler and a Dutch reply draft." style="max-width:100%;height:auto;border-radius:12px;border:1px solid #DCE4EC;box-shadow:0 10px 30px -12px rgba(27,58,99,0.30);"></p>
<p style="text-align:center;font-size:13px;color:#4E6A88;"><i>From a Dutch customer mail to a routed mail with a reply draft, in one AI request.</i></p>

<div style="display:flex;flex-wrap:wrap;gap:14px;margin:22px 0;">
  <div style="flex:1;min-width:150px;background:linear-gradient(145deg,#1B3A63,#12294A);border:1px solid #26507F;border-radius:12px;padding:16px 14px;text-align:center;box-shadow:0 4px 18px rgba(27,58,99,0.18);">
    <div style="font-family:Consolas,monospace;font-size:26px;font-weight:700;background:linear-gradient(90deg,#7FD1F7,#29B6E8);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:#29B6E8;">1</div>
    <div style="font-family:Consolas,monospace;font-size:10.5px;color:#B6CADE;margin-top:4px;">AI request per mail</div>
  </div>
  <div style="flex:1;min-width:150px;background:linear-gradient(145deg,#1B3A63,#12294A);border:1px solid #26507F;border-radius:12px;padding:16px 14px;text-align:center;box-shadow:0 4px 18px rgba(27,58,99,0.18);">
    <div style="font-family:Consolas,monospace;font-size:26px;font-weight:700;background:linear-gradient(90deg,#7FD1F7,#29B6E8);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:#29B6E8;">11</div>
    <div style="font-family:Consolas,monospace;font-size:10.5px;color:#B6CADE;margin-top:4px;">fields in the JSON answer</div>
  </div>
  <div style="flex:1;min-width:150px;background:linear-gradient(145deg,#1B3A63,#12294A);border:1px solid #26507F;border-radius:12px;padding:16px 14px;text-align:center;box-shadow:0 4px 18px rgba(27,58,99,0.18);">
    <div style="font-family:Consolas,monospace;font-size:26px;font-weight:700;background:linear-gradient(90deg,#7FD1F7,#29B6E8);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:#29B6E8;">6</div>
    <div style="font-family:Consolas,monospace;font-size:10.5px;color:#B6CADE;margin-top:4px;">departments the AI can choose from</div>
  </div>
  <div style="flex:1;min-width:150px;background:linear-gradient(145deg,#1B3A63,#12294A);border:1px solid #26507F;border-radius:12px;padding:16px 14px;text-align:center;box-shadow:0 4px 18px rgba(27,58,99,0.18);">
    <div style="font-family:Consolas,monospace;font-size:26px;font-weight:700;background:linear-gradient(90deg,#7FD1F7,#29B6E8);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:#29B6E8;">4</div>
    <div style="font-family:Consolas,monospace;font-size:10.5px;color:#B6CADE;margin-top:4px;">languages in the offline keyword rules</div>
  </div>
</div><p><br></p>

<h3 style="border-left:4px solid #1E7FC2;padding-left:12px;">Fetching Mail from Gmail and Outlook</h3>

<p><code>TTMSFNCCloudGoogleGmail</code> and <code>TTMSFNCCloudMicrosoftOutlookMail</code> handle OAuth, token refresh and the REST APIs. After the first login in a browser, the tokens are stored and the server reconnects by itself. Fetching the inbox is one call per mailbox:</p>

<pre class="delphi" name="code">FGmail.GetMails('INBOX', AMax, False);
FOutlook.GetMails('Inbox', AMax);</pre>

<p>When the mails arrive, each Cloud Pack message is mapped to a small <code>TTriageMail</code> object that the rest of the system understands: sender, subject, plain-text body, original HTML, the IDs needed to reply in the same thread, and local copies of any photos or PDFs. HTML mails are reduced to plain text for the AI, while the original HTML is kept for forwarding.</p>

<p><br></p>

<h3 style="border-left:4px solid #1E7FC2;padding-left:12px;">One Request per Mail</h3>

<p><code>TTMSMCPCloudAI</code> is TMS AI Studio's component for talking to LLM services. Switching between OpenAI, Claude, Gemini, Mistral, DeepSeek or a local Ollama model is a matter of changing <code>Service</code>; the rest of the code stays the same.</p>

<p>The triage sends one request per mail. The system prompt describes the departments, the brands the dealership sells and the priority rules; the context holds the mail itself:</p>

<div style="display:flex;flex-wrap:wrap;gap:10px;margin:18px 0 26px;padding:14px;border-radius:14px;background:#F1F5F9;border:1px solid #DCE4EC;"><div style="flex:1 1 120px;padding:12px 14px;border-radius:10px;background:#FFFFFF;border:1px solid #DCE4EC;box-shadow:0 6px 18px -12px rgba(27,58,99,.35);"><div style="font-family:Consolas,monospace;font-size:11px;font-weight:700;letter-spacing:.1em;color:#1B3A63;margin:0 0 4px;">STEP 1</div><div style="font-family:Roboto,'Segoe UI',sans-serif;font-size:15px;font-weight:700;color:#16283C;">Fetch</div><div style="font-size:13px;line-height:1.5;color:#4E6A88;margin-top:2px;">Gmail and Outlook through TMS FNC Cloud Pack</div></div><span style="flex:0 0 auto;align-self:center;font-family:Roboto,'Segoe UI',sans-serif;font-size:20px;color:#4E6A88;">→</span><div style="flex:1 1 120px;padding:12px 14px;border-radius:10px;background:#FFFFFF;border:1px solid #DCE4EC;box-shadow:0 6px 18px -12px rgba(27,58,99,.35);"><div style="font-family:Consolas,monospace;font-size:11px;font-weight:700;letter-spacing:.1em;color:#1B3A63;margin:0 0 4px;">STEP 2</div><div style="font-family:Roboto,'Segoe UI',sans-serif;font-size:15px;font-weight:700;color:#16283C;">Classify</div><div style="font-size:13px;line-height:1.5;color:#4E6A88;margin-top:2px;"><code>TTMSMCPCloudAI</code> returns one JSON object</div></div><span style="flex:0 0 auto;align-self:center;font-family:Roboto,'Segoe UI',sans-serif;font-size:20px;color:#4E6A88;">→</span><div style="flex:1 1 120px;padding:12px 14px;border-radius:10px;background:#FFFFFF;border:1px solid #DCE4EC;box-shadow:0 6px 18px -12px rgba(27,58,99,.35);"><div style="font-family:Consolas,monospace;font-size:11px;font-weight:700;letter-spacing:.1em;color:#1B3A63;margin:0 0 4px;">STEP 3</div><div style="font-family:Roboto,'Segoe UI',sans-serif;font-size:15px;font-weight:700;color:#16283C;">Route</div><div style="font-size:13px;line-height:1.5;color:#4E6A88;margin-top:2px;">Your routing table picks the handler</div></div><span style="flex:0 0 auto;align-self:center;font-family:Roboto,'Segoe UI',sans-serif;font-size:20px;color:#4E6A88;">→</span><div style="flex:1 1 120px;padding:12px 14px;border-radius:10px;background:#FFFFFF;border:1px solid #DCE4EC;box-shadow:0 6px 18px -12px rgba(27,58,99,.35);"><div style="font-family:Consolas,monospace;font-size:11px;font-weight:700;letter-spacing:.1em;color:#1B3A63;margin:0 0 4px;">STEP 4</div><div style="font-family:Roboto,'Segoe UI',sans-serif;font-size:15px;font-weight:700;color:#16283C;">Draft</div><div style="font-size:13px;line-height:1.5;color:#4E6A88;margin-top:2px;">A reply in the customer's language</div></div></div>

<pre class="delphi" name="code">FAI.SystemRole.Text := BuildSystemPrompt(FRouting);
FAI.Context.Text := BuildMailPrompt(M);
FAI.Execute(M.ID.ToString);</pre>

<p>The mail ID is passed as the request ID and comes back in <code>OnExecuted</code>, so the answer is always matched to the right mail, even when several requests are on their way.</p>

<p><br></p>

<h3 style="border-left:4px solid #1E7FC2;padding-left:12px;">Ask for JSON, Not Prose</h3>

<p>The prompt asks the model for a single JSON object with fixed fields. That makes the answer easy to check and turns a language model into a predictable classifier:</p>

<pre class="js" name="code">{"department":"sales|accessories|maintenance|finance|secondhand|other",
 "brand":"&lt;brand or Other&gt;",
 "priority":"low|normal|high|urgent",
 "confidence":&lt;integer 0-100&gt;,
 "summary":"&lt;one short sentence in English for the handler&gt;",
 "reason":"&lt;short explanation of the classification&gt;",
 "reply":"&lt;draft reply to the customer&gt;",
 "appointment":"&lt;YYYY-MM-DD HH:MM or empty&gt;",
 "attachments":"&lt;what the attached photos or documents show&gt;",
 "spam":true|false, "spam_reason":"&lt;why, or empty&gt;"}</pre>

<p>A few rules in the prompt do most of the work. Models sometimes wrap JSON in a code fence or add a sentence, so the parser simply takes the outermost object and is forgiving about synonyms such as "service" or "workshop" for maintenance.</p><div style="display:flex;flex-wrap:wrap;gap:12px;margin:18px 0 26px;"><div style="flex:1 1 170px;padding:16px 18px;border-radius:12px;background:#F1F5F9;border:1px solid #DCE4EC;border-top:3px solid #1B3A63;"><div style="font-family:Roboto,'Segoe UI',sans-serif;font-size:15.5px;font-weight:700;color:#1B3A63;margin:0 0 6px;">Urgent means urgent</div><div style="font-size:14px;line-height:1.6;color:#24384B;">Only for a breakdown, a safety issue or a legal threat.</div></div><div style="flex:1 1 170px;padding:16px 18px;border-radius:12px;background:#F1F5F9;border:1px solid #DCE4EC;border-top:3px solid #1B3A63;"><div style="font-family:Roboto,'Segoe UI',sans-serif;font-size:15.5px;font-weight:700;color:#1B3A63;margin:0 0 6px;">The customer's language</div><div style="font-size:14px;line-height:1.6;color:#24384B;">The reply is written in the language the customer used.</div></div><div style="flex:1 1 170px;padding:16px 18px;border-radius:12px;background:#F1F5F9;border:1px solid #DCE4EC;border-top:3px solid #1B3A63;"><div style="font-family:Roboto,'Segoe UI',sans-serif;font-size:15.5px;font-weight:700;color:#1B3A63;margin:0 0 6px;">No promises</div><div style="font-size:14px;line-height:1.6;color:#24384B;">Never prices, dates or stock. The reply ends with a <code>[SIGNATURE]</code> placeholder.</div></div></div>

<p><br></p>

<h3 style="border-left:4px solid #1E7FC2;padding-left:12px;">A Routing Table, Not Hard-Coded Rules</h3>

<p>The AI decides <em>what</em> a mail is about; the routing table decides <em>who</em> handles it. Each rule maps a department and a brand to a handler, and a <code>*</code> brand acts as the fallback for a department:</p>

<p><img src="https://www.tmssoftware.com/site/img/blog/aimaildesk/routing.png" alt="The routing page: department badges, brand, handler name and forward address per rule." style="max-width:100%;height:auto;border-radius:12px;border:1px solid #DCE4EC;box-shadow:0 10px 30px -12px rgba(27,58,99,0.30);"></p>
<p style="text-align:center;font-size:13px;color:#4E6A88;"><i>Department plus brand decides the handler. Brand <code>*</code> is the fallback for a department.</i></p>

<p>Because the brands in the routing table are also part of the system prompt, the AI can only answer with a brand the dealership actually knows. The handler's signature replaces <code>[SIGNATURE]</code> in the reply, so when a person re-routes a mail to another department, the signature follows automatically.</p>

<p><br></p>

<h3 style="border-left:4px solid #1E7FC2;padding-left:12px;">Confidence and the Human in the Loop</h3>

<p>Every result carries a confidence score, shown as a data bar in the inbox grid. Nothing leaves the building on the AI's word alone: the reply is saved as a draft, forwarding starts in dry-run mode, and anyone can re-route a mail by dragging its card to another department on the handler board (or by asking the dashboard's assistant), which recalculates the handler and the signature.</p>

<p><img src="https://www.tmssoftware.com/site/img/blog/aimaildesk/inbox.png" alt="The inbox grid with department badges, priority, a confidence data bar and the detail panel of an urgent breakdown mail." style="max-width:100%;height:auto;border-radius:12px;border:1px solid #DCE4EC;box-shadow:0 10px 30px -12px rgba(27,58,99,0.30);"></p>
<p style="text-align:center;font-size:13px;color:#4E6A88;"><i>Department, brand, priority and confidence at a glance, with the analysis of the selected mail below.</i></p>

<p><br></p>

<h3 style="border-left:4px solid #1E7FC2;padding-left:12px;">Works Offline Too</h3>

<p>Without an API key the demo falls back to simple keyword rules in four languages. That is deliberately basic: it shows the complete flow without an AI service, and it shows why an LLM is the better classifier. A mail that says "my car makes a noise when braking" in Dutch is easy for a model and hard for a keyword list.</p>

<div style="background:linear-gradient(120deg,#1B3A63,#12294A);border-radius:8px;padding:18px 22px;margin:22px 0;border:1px solid #26507F;box-shadow:0 4px 20px rgba(27,58,99,0.18);position:relative;">
  <div style="position:absolute;left:0;top:0;bottom:0;width:4px;background:linear-gradient(180deg,#29B6E8,#1E7FC2);border-radius:8px 0 0 8px;"></div>
  <p style="margin:0;font-family:Consolas,monospace;font-size:14px;font-style:italic;color:#F0F4F8;">"The AI decides what a mail is about; the routing table decides who handles it."</p>
</div><p><br></p>

<h3 style="border-left:4px solid #1E7FC2;padding-left:12px;">Conclusion</h3>

<p>The pattern is short: fetch with TMS FNC Cloud Pack, ask <code>TTMSMCPCloudAI</code> for a fixed JSON shape, and let a routing table you control turn that answer into a person. In the next post, the AI gets more to work with: the photos and PDFs attached to a mail, the customer's history, and a verdict on whether the mail is spam.</p>

<div style="display:flex;flex-wrap:wrap;align-items:center;gap:14px 18px;margin:18px 0 18px;padding:18px;border-radius:14px;background:#F0F4F8;border:1px solid #DCE4EC;"><div style="flex:1 1 280px;min-width:0;"><div style="font-family:Roboto,'Segoe UI',sans-serif;font-weight:700;font-size:15.5px;color:#1B3A63;margin:0 0 4px;">Download AI Mail Desk</div><div style="font-size:14px;line-height:1.6;color:#24384B;">The full source code is on GitHub, together with ready-to-run Win32 builds of both editions. The code from this post is in <code>uTriageAI.pas</code> and <code>uRouting.pas</code>.</div></div><div style="display:flex;flex-wrap:wrap;gap:10px;"><a href="https://github.com/tmssoftware/tms.demos.aimaildesk/releases" style="display:inline-block;padding:9px 18px;border-radius:999px;background:#1E7FC2;color:#FFFFFF;border:1px solid #1E7FC2;font-family:Roboto,'Segoe UI',sans-serif;font-weight:600;font-size:14px;text-decoration:none;white-space:nowrap;">↓&nbsp; Download the Win32 binaries</a><a href="https://github.com/tmssoftware/tms.demos.aimaildesk" style="display:inline-block;padding:9px 18px;border-radius:999px;background:#FFFFFF;color:#16283C;border:1px solid #C3D0DD;font-family:Roboto,'Segoe UI',sans-serif;font-weight:600;font-size:14px;text-decoration:none;white-space:nowrap;">View the source on GitHub</a></div></div>

<p><br></p>

<hr>

<div style="display:flex;flex-wrap:wrap;gap:8px;margin:14px 0 6px;"><a href="https://www.tmssoftware.com/site/tmsaistudio.asp" style="display:inline-flex;align-items:center;gap:8px;padding:3px 11px 3px 3px;border-radius:7px;background:#F1F5F9;border:1px solid #DCE4EC;text-decoration:none;white-space:nowrap;"><span style="font-family:Consolas,monospace;font-weight:700;font-size:11px;letter-spacing:.1em;color:#FFFFFF;background:#1B3A63;padding:3px 7px;border-radius:5px;">AI</span><span style="font-family:Consolas,monospace;font-size:11px;font-weight:500;letter-spacing:.14em;text-transform:uppercase;color:#1B3A63;">TMS AI Studio</span></a></div>
<p><b><a href="https://www.tmssoftware.com/site/tmsaistudio.asp">TMS AI Studio</a></b> is the complete toolkit for bringing AI and the Model Context Protocol to your Delphi applications. Build MCP servers and clients, connect Claude and other assistants to your own tools and data, and add cloud AI to your VCL and FMX apps, all in native Delphi. <a href="https://www.tmssoftware.com/site/tmsaistudio.asp">Discover TMS AI Studio</a>.</p>

<div style="display:flex;flex-wrap:wrap;gap:8px;margin:14px 0 6px;"><a href="https://www.tmssoftware.com/site/tmsfnccloudpack.asp" style="display:inline-flex;align-items:center;gap:8px;padding:3px 11px 3px 3px;border-radius:7px;background:#F1F5F9;border:1px solid #DCE4EC;text-decoration:none;white-space:nowrap;"><span style="font-family:Consolas,monospace;font-weight:700;font-size:11px;letter-spacing:.1em;color:#FFFFFF;background:#1B3A63;padding:3px 7px;border-radius:5px;">FNC</span><span style="font-family:Consolas,monospace;font-size:11px;font-weight:500;letter-spacing:.14em;text-transform:uppercase;color:#1B3A63;">TMS FNC Cloud Pack</span></a></div>
<p><b><a href="https://www.tmssoftware.com/site/tmsfnccloudpack.asp">TMS FNC Cloud Pack</a></b> connects your Delphi applications to cloud services such as Gmail, Outlook, Google Calendar, Outlook Calendar, Pushover and many more, with the OAuth sign-in handled for you. <a href="https://www.tmssoftware.com/site/tmsfnccloudpack.asp">Discover TMS FNC Cloud Pack</a>.</p>

		
		
		
		
		<br><br></P>]]></description>
	</item>
	<item>
		<title><![CDATA[Translate Your Delphi Resourcestrings with TMS FNC Localization 0.9.4.0 BETA]]></title>
		<link>https://www.tmssoftware.com/site/blog.asp?post=2559</link>
		<author>Tunde Keller</author>
		<pubDate>Wed, 28 Oct 2026 12:00:00 +0000</pubDate>
		<description><![CDATA[<P>
		
		
		
		
		
		
		
		
		
		<p><img src="https://www.tmssoftware.com/site/img/blog/tmsfnclocalization0940header.svg" width="1920" height="600" alt="TMS FNC Localization 0.9.4.0: a translated Localization Editor, resourcestring support and LANG or JSON translation files" style="width:100%;height:auto;border-radius:12px;"><b><br></b></p><p><b>Collect, translate, apply.</b> That was the promise when we <a href="https://www.tmssoftware.com/site/blog.asp?post=2513" target="_blank" rel="noopener">introduced TMS FNC Localization</a>, and it is the promise we intend to keep while pushing the capabilities of each step further!</p><p>In this blog post we'll discuss what the <b><a href="https://www.tmssoftware.com/site/tmsfnclocalization.asp" target="_blank">TMS FNC Localization</a>&nbsp;0.9.4.0 BETA</b> update brings as the next milestone: reaching beyond simple property collection, with <b>resourcestring support</b>, <b>custom localization of the editor</b> itself and <b>more choice in how your translations are stored</b>, all moving towards a fully mature tool for handling the localization of your Delphi projects.</p>

<p><br></p>

<h4>Your Resourcestrings Join the Translation Project</h4>

<p>Collecting works by walking components and reading their text properties. A <b>resourcestring</b> is not a component property, which meant that until now a collection pass gathered every caption on every form and not a single resourcestring, even though resourcestrings are exactly where the error messages and dialog texts of a serious application tend to live.</p>

<p>With TMS FNC Localization 0.9.4.0 BETA we handle this <b>without parsing a single line of your source code</b>. The compiler already writes the complete list of every resourcestring linked into your binary: the <b>.drc</b> file.</p>

<div style="padding:16px 20px;border-left:5px solid #1E7FC2;background:#F0F4F8;border-radius:8px;">
<p style="margin:0 0 6px 0;font-size:1.15em;color:#1B3A63;"><b>How to enable</b></p>
<p style="margin:0;">In <b>Project &gt; Options &gt; Building &gt; Delphi Compiler &gt; Linker</b>, switch on <b>Output resource string .drc file</b> for the active configuration. Setting <b>Map file</b> to <b>Detailed</b> on the same page produces the .drc as well. Build once, reopen the Localization Editor, and the resourcestrings are in the tree beside your forms.</p></div>

<p><br></p><p>From there, resourcestrings simply become part of the project. They show up in the tree beside your forms and are translated like any other text: manually, with AI assistance or through XLIFF. Only <b>your own units</b> are taken, so the thousands of resourcestrings in the RTL and the frameworks never clutter the list. And the best part is, <b>nothing extra is needed at run time</b>! The collected resourcestrings travel in the language files and are applied dynamically based on your application's selected language.</p>

<p><br></p>

<h4>The Localization Editor Speaks Your Language</h4>

<p>A tool for translating applications that is only available in English is a little ironic. So we turned the <b>TTMSFNCLocalizationEditor</b> on itself!</p>

<p>At <b>design time</b> the editor now follows the language of your IDE, when that is one of the built-in languages. Nothing to configure: a German RAD Studio opens a German editor.</p>

<p>At <b>run time</b> you choose, per call:</p>

<div id="code-content"><pre class="delphi" name="code">// Open the editor in one of the built-in languages: 'en', 'de', 'fr' or 'ja'
TMSFNCLocalizationEditor.Execute('ja');</pre></div>

<p>The locale applies to that one call and is reset when the editor closes. It changes the language of the editor only, never the active language of your application.</p>

<p>And if the four built-in languages are not the four you need, the editor can be translated <b>through your own application's translations</b> instead:</p>

<div id="code-content"><pre class="delphi" name="code">// The editor is collected like any other form and follows
// the active language of your application
TMSFNCLocalizationEditor.AllowCustomTranslation := True;
TMSFNCLocalizationEditor.Execute;</pre></div>

<p>With <b>AllowCustomTranslation</b> on, the editor's window is collected like any other form, its messages are registered as snippets under the <b>Editor.</b> prefix, and collection rules for its columns and AI settings are added automatically. From that point the editor is simply part of your translation project, and it follows whatever language your application is in. That matters most when you ship the editor <b>inside</b> your application, so the people correcting a translation can work in their own language.</p>

<p><br></p>

<h4>LANG Files or One JSON File, Your Choice</h4>

<p>Until now, translations lived in a single JSON file holding every language together. That is still the default and still the file the editor works against in your project folder. What 0.9.4.0 adds is the ability to <b>export and import one file per language</b>.</p>

<p>A LANG file is plain, line-based text with a short header, named after the language it carries:</p>

<div id="code-content"><pre class="delphi" name="code">; lang.de.lang
_meta.locale = "de";
_meta.language = "Deutsch";
_meta.for = "InvoiceManager";
_meta.exported = "2026-10-28";

MainForm.btnSave.Text = "Speichern";
MainForm.lblCustomer.Text = "Kunde";
ResourceStrings.Invoices.sInvoiceOverdue = "Rechnung &#252;berf&#228;llig";</pre></div>

<p>Which format suits you depends on what happens to the translations next:</p>

<div style="display:flex;flex-wrap:wrap;gap:10px;margin:0 0 6px 0;">
<div style="flex:1 1 260px;padding:14px 16px;background:#F0F4F8;border:1px solid #D9E2EC;border-radius:10px;"><span style="font-weight:bold;color:#1B3A63;">One JSON file</span><div style="margin-top:6px;font-size:14px;line-height:1.5;color:#334155;">Every language in one place. The simplest thing to deploy, and the format the editor keeps your working translation data in.</div></div>
<div style="flex:1 1 260px;padding:14px 16px;background:#F0F4F8;border:1px solid #D9E2EC;border-radius:10px;"><span style="font-weight:bold;color:#1B3A63;">One LANG file per language</span><div style="margin-top:6px;font-size:14px;line-height:1.5;color:#334155;">A file you can hand to one translator, review on its own in a pull request, and accept back as a contribution without touching the other languages.</div></div>
</div>

<p><br></p>

<p>The header is part of the file, so a language file knows which application and which locale it belongs to, which plural forms apply, who contributed to it and when it was exported. <b>Your code does not change</b> either way: the localizer reads whichever format it finds, and when both are present the LANG files take priority!</p><p><br></p>

<h4>Workflow Improvements</h4>

<p>Along with the new features, TMS FNC Localization 0.9.4.0 BETA brings in various improvements to the workflow! </p><ul><li>Translation files are now generated in and loaded from the <b>project folder</b> when you run from the IDE, instead of accumulating copies in every output folder you build into. This new approach also fits the concept that the translation file belongs to the project version control system.</li><li><b>TTMSFNCLocalizationComboBox</b> can now offer <b>System language</b> as a choice, so your users can hand the selection back to the operating system and have it stay that way.</li><li><b>TTMSFNCLocalizationEditor </b>comes with a new <b>Info tab</b> intended for diagnostics purposes for your project.</li></ul>

<p>And as always, we applied a number of fixes for issues that got reported by users during the BETA!</p>

<p><br></p>

<h4>How to Get Started</h4>

<div style="display:flex;flex-wrap:wrap;align-items:center;gap:20px;padding:20px 22px;background:#1B3A63;border-radius:12px;color:#FFFFFF;">
<div style="flex:0 0 auto;"><div style="font-size:1.6em;font-weight:bold;line-height:1.2;">TMS ALL-ACCESS</div><div style="margin-top:4px;font-size:13px;color:#B9CBE0;">full access, included</div></div>
<div style="flex:1 1 280px;font-size:15px;line-height:1.6;color:#E2EAF3;">TMS FNC Localization is part of your subscription. Install and update it through <a href="https://doc.tmssoftware.com/smartsetup/" target="_blank" rel="noopener" style="color:#7CC4F5;">TMS Smart Setup</a> and you will pick up every new BETA version as it is released. <a href="https://www.tmssoftware.com/site/tmsallaccess.asp" target="_blank" rel="noopener" style="color:#7CC4F5;">More about TMS ALL-ACCESS</a>.</div>
</div>

<p><br></p>

<div style="padding:16px 20px;border-left:5px solid #1E7FC2;background:#F0F4F8;border-radius:8px;">
<p style="margin:0 0 6px 0;font-size:1.15em;color:#1B3A63;"><b>Not an ALL-ACCESS user? Try it</b></p>
<p style="margin:0;">TMS FNC Localization is available as a <b>free trial</b> from its product page, so you can run the collector over your own application and see what comes back before deciding anything.</p>
</div>

<p><br></p>

<p><a href="https://www.tmssoftware.com/site/tmsfnclocalization.asp#downloads" target="_blank" rel="noopener" style="display:inline-block;padding:12px 24px;border-radius:8px;background:#1E7FC2;color:#FFFFFF;font-weight:bold;text-decoration:none;">Download the free trial</a></p>

<p><br></p>

<h4>Help Us Shape the Final Release</h4>

<p>Localization requirements differ enormously between applications. The features in TMS FNC Localization 0.9.4.0 BETA exist because people told us what was missing from their own workflow, so please keep doing that: <b>try it</b> on a new project, or better, on the older one that suddenly needs support for multiple languages!</p>

<div style="display:flex;flex-wrap:wrap;gap:12px;margin:14px 0;">
<a href="https://doc.tmssoftware.com/fnc/localization/" target="_blank" rel="noopener" style="flex:1 1 200px;display:block;padding:16px 18px;background:#FFFFFF;border:1px solid #D9E2EC;border-radius:10px;text-decoration:none;"><span style="display:block;font-weight:bold;color:#1E7FC2;">Documentation →</span><span style="display:block;margin-top:4px;font-size:14px;color:#334155;">Component API and the full workflow</span></a>
<a href="https://support.tmssoftware.com/c/fnc/tms-fnc-localization/131" target="_blank" rel="noopener" style="flex:1 1 200px;display:block;padding:16px 18px;background:#FFFFFF;border:1px solid #D9E2EC;border-radius:10px;text-decoration:none;"><span style="display:block;font-weight:bold;color:#1E7FC2;">Support Center →</span><span style="display:block;margin-top:4px;font-size:14px;color:#334155;">The TMS FNC Localization category</span></a>
<a href="https://www.tmssoftware.com/site/tmsfnclocalization.asp" target="_blank" rel="noopener" style="flex:1 1 200px;display:block;padding:16px 18px;background:#FFFFFF;border:1px solid #D9E2EC;border-radius:10px;text-decoration:none;"><span style="display:block;font-weight:bold;color:#1E7FC2;">Product page →</span><span style="display:block;margin-top:4px;font-size:14px;color:#334155;">Features, downloads and demos</span></a>
</div>

<p>We are looking forward to seeing what you build with it, and in how many languages!</p>

		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		<br><br></P>]]></description>
	</item>
	<item>
		<title><![CDATA[Claude Plugin For TMS FNC Datagrid now available]]></title>
		<link>https://www.tmssoftware.com/site/blog.asp?post=2550</link>
		<author>Bradley Velghe</author>
		<pubDate>Wed, 28 Oct 2026 12:00:00 +0000</pubDate>
		<description><![CDATA[<P>
		
		
		
		



<p>Describe the grid you want, and let Claude build it. With the new <b>TMS FNC DataGrid plugin for Claude</b>, Claude knows the TMS FNC DataGrid inside out: its columns, editors, filtering, grouping, conditional formatting, database adapter and export components. You ask in plain language, Claude writes the code straight into your form.</p>
<table style="width:100%;border-collapse:separate;border-spacing:8px 0;text-align:center;">
<tbody><tr>
<td style="background:#1B3A63;color:#FFFFFF;padding:14px 10px;border-radius:8px;"><span style="display:block;font-size:2em;font-weight:bold;line-height:1.1;">22%</span><span style="font-size:0.95em;">faster</span></td>
<td style="background:#1E7FC2;color:#FFFFFF;padding:14px 10px;border-radius:8px;"><span style="display:block;font-size:2em;font-weight:bold;line-height:1.1;">43%</span><span style="font-size:0.95em;">fewer tool calls</span></td>
<td style="background:#1B3A63;color:#FFFFFF;padding:14px 10px;border-radius:8px;"><span style="display:block;font-size:2em;font-weight:bold;line-height:1.1;">33%</span><span style="font-size:0.95em;">fewer tokens</span></td>
<td style="background:#1E7FC2;color:#FFFFFF;padding:14px 10px;border-radius:8px;"><span style="display:block;font-size:2em;font-weight:bold;line-height:1.1;">0</span><span style="font-size:0.95em;">build errors</span></td>
</tr>
</tbody></table>

<p><br></p>
<p>The result is less waiting, fewer steps to follow along with, and grid features that work the first time you run your app.</p>

<ul>
<li><b>Less waiting</b>: in our test Claude finished a full-featured grid demo <b>22% faster</b>.</li>
<li><b>Fewer steps</b>: <b>43% fewer tool calls</b>, so fewer actions to watch or approve along the way.</li>
<li><b>Works first time</b>: the projects built with <b>0 errors on the first build</b>, and every requested grid feature worked at runtime.</li>
<li><b>Goes further on your plan</b>: <b>33% fewer tokens</b> for the same task, so your Claude usage lasts longer.</li>
</ul>

<p><br></p>

<a href="https://github.com/tmssoftware/tms.claude.plugins" target="_blank" rel="noopener"><img src="https://www.tmssoftware.com/site/img/tmsfncdatagrid_claude/tmsfncdatagridclaudehero.png" alt="TMS FNC DataGrid Claude plugin: benchmark results shown in a data grid, with plugin runs faster and scoring 19 out of 20" style="max-width:100%;height:auto;border-radius:12px;"></a>

<p><br></p>

<h3>How to install it</h3>

<p>There are two ways to get the plugin. Both give you exactly the same plugin.</p>

<h4>Option 1: the public Claude plugin directory (coming soon)</h4>

<p>We've submitted the plugin to Anthropic's public <a href="https://claude.ai/directory" target="_blank" rel="noopener">Claude plugin directory</a>. Once it's listed, you'll find <b>TMS FNC DataGrid</b> there and add it to your Claude account with one click. It's then available in Claude Code, the Claude desktop app and Cowork, without typing a single command. We'll announce it here as soon as it's live.</p>

<h4>Option 2: our marketplace on GitHub (available today)</h4>

<p>Don't want to wait? The plugin is already available from our public plugin marketplace on GitHub. In Claude Code, run:</p>

<div id="code-content"><pre class="plain" name="code">/plugin marketplace add tmssoftware/tms.claude.plugins
/plugin install tms-fnc-datagrid@tms-software</pre></div>

<p>That's all. There's nothing to configure and you don't have to mention the plugin in your prompts: as soon as you ask Claude to work on a TMS FNC DataGrid, it uses the plugin by itself.</p>

<p><br></p>

<h3>Just ask</h3>

<p>The plugin adds four skills. Use them by name, or simply describe what you want:</p>

<ul>
<li><b>Get started</b>: <i>"Add a TMS FNC DataGrid to my main form with some sample products."</i> Claude detects whether your project is VCL, FMX or TMS WEB Core and adds a working grid with data.</li>
<li><b>Unlock a feature</b>: <i>"Group the grid by Category and show a total per group."</i> Pick from grouping, a filter row, conditional formatting, checkboxes and progress bars in cells, merged cells, database binding, master-detail, and Excel, PDF or print export. Claude asks one or two questions about your data and writes the feature into your form.</li>
<li><b>Review</b>: <i>"Check my grid code."</i> Claude goes through your existing grid code and suggests improvements.</li>
<li><b>DataGrid knowledge</b>: works in the background whenever you or Claude touch TTMSFNCDataGrid code.</li>
</ul>

<p><br></p>

<h3>Not just simple tasks</h3>

<p>Adding a grid with a few rows is easy. The plugin really pays off on bigger requests, the kind that normally take an afternoon of reading documentation and trying things out. Here is the request from our benchmark, written the way you would type it yourself: ten grid features in a single prompt. The numbers mark its parts, explained below.</p>

<div style="background:#13294A;border-radius:10px;overflow:hidden;">
<div style="background:#0E1F38;padding:10px 16px;font-family:Arial,sans-serif;font-size:0.9em;color:#FFFFFF;"><span style="display:inline-block;width:10px;height:10px;border-radius:5px;background:#E5534B;"></span> <span style="display:inline-block;width:10px;height:10px;border-radius:5px;background:#E9B949;"></span> <span style="display:inline-block;width:10px;height:10px;border-radius:5px;background:#4CB782;"></span> &nbsp; <b>Claude Code</b> <span style="color:#8FB3D9;">&#183; the prompt</span></div>
<div style="padding:16px 20px 18px 20px;font-family:Consolas,Menlo,monospace;font-size:0.88em;line-height:1.75;color:#E3EAF1;"><span style="display:inline-block;width:18px;height:18px;line-height:18px;border-radius:9px;background:#1E7FC2;color:#FFFFFF;text-align:center;font-family:Arial,sans-serif;font-size:11px;font-weight:bold;vertical-align:1px;margin-right:10px;">1</span>Create a new FireMonkey app that shows off the TMS FNC DataGrid. I want a fully featured demo, so put everything in:<br>
<span style="display:inline-block;width:18px;height:18px;line-height:18px;border-radius:9px;background:#1E7FC2;color:#FFFFFF;text-align:center;font-family:Arial,sans-serif;font-size:11px;font-weight:bold;vertical-align:1px;margin-right:10px;">2</span>- about 50 sample products: ID, name, category, price, stock, an active flag and a last order date<br>
<span style="display:inline-block;width:18px;height:18px;line-height:18px;border-radius:9px;background:#1E7FC2;color:#FFFFFF;text-align:center;font-family:Arial,sans-serif;font-size:11px;font-weight:bold;vertical-align:1px;margin-right:10px;">3</span>- sorting by clicking the column headers, also on more than one column<br>
<span style="display:inline-block;width:28px;"></span>- a filter row under the headers<br>
<span style="display:inline-block;width:28px;"></span>- grouping by category that I can expand and collapse<br>
<span style="display:inline-block;width:18px;height:18px;line-height:18px;border-radius:9px;background:#1E7FC2;color:#FFFFFF;text-align:center;font-family:Arial,sans-serif;font-size:11px;font-weight:bold;vertical-align:1px;margin-right:10px;">4</span>- stock below 10 in red, and highlight prices above 500<br>
<span style="display:inline-block;width:28px;"></span>- active as a checkbox, stock as a progress bar<br>
<span style="display:inline-block;width:18px;height:18px;line-height:18px;border-radius:9px;background:#1E7FC2;color:#FFFFFF;text-align:center;font-family:Arial,sans-serif;font-size:11px;font-weight:bold;vertical-align:1px;margin-right:10px;">5</span>- let me edit the cells, but don't accept a price of 0 or less<br>
<span style="display:inline-block;width:28px;"></span>- merge some cells where it makes sense<br>
<span style="display:inline-block;width:18px;height:18px;line-height:18px;border-radius:9px;background:#1E7FC2;color:#FFFFFF;text-align:center;font-family:Arial,sans-serif;font-size:11px;font-weight:bold;vertical-align:1px;margin-right:10px;">6</span>- buttons to export to Excel and PDF, and a toolbar to switch grouping on and off and clear all filters<br>
<br>
<span style="display:inline-block;width:18px;height:18px;line-height:18px;border-radius:9px;background:#4CB782;color:#FFFFFF;text-align:center;font-family:Arial,sans-serif;font-size:11px;font-weight:bold;vertical-align:1px;margin-right:10px;">7</span>Call the project DataGridDemo. Build it with msbuild and keep fixing errors until it compiles.</div>
</div>

<p><br></p>

<p>Here is what each part of the prompt does, and what the plugin brings to it:</p>

<table style="width:100%;border-collapse:separate;border-spacing:12px;margin:0 -12px;">
<tbody><tr>
<td style="width:50%;vertical-align:top;background:#FFFFFF;border:1px solid #DCE4EC;border-top:4px solid #1E7FC2;border-radius:8px;padding:14px 16px;"><p style="margin:0 0 8px 0;font-size:1.1em;color:#1B3A63;"><span style="display:inline-block;width:24px;height:24px;line-height:24px;border-radius:12px;background:#1E7FC2;color:#FFFFFF;text-align:center;font-size:13px;font-weight:bold;">1</span>&nbsp; <b>The goal</b></p><p style="margin:0 0 10px 0;color:#425D7B;font-size:0.95em;">One sentence sets the scope: what to build, for which framework, and with which control.</p><p style="margin:0;padding:8px 10px;background:#F0F4F8;border-left:3px solid #1E7FC2;border-radius:4px;color:#1B3A63;font-size:0.95em;"><b>With the plugin:</b> Claude knows the FireMonkey units and how to create and set up the grid, so it starts writing code right away.</p></td>
<td style="width:50%;vertical-align:top;background:#FFFFFF;border:1px solid #DCE4EC;border-top:4px solid #1E7FC2;border-radius:8px;padding:14px 16px;"><p style="margin:0 0 8px 0;font-size:1.1em;color:#1B3A63;"><span style="display:inline-block;width:24px;height:24px;line-height:24px;border-radius:12px;background:#1E7FC2;color:#FFFFFF;text-align:center;font-size:13px;font-weight:bold;">2</span>&nbsp; <b>Realistic data</b></p><p style="margin:0 0 10px 0;color:#425D7B;font-size:0.95em;">Text, numbers, a boolean and a date give every feature that follows something real to work on.</p><p style="margin:0;padding:8px 10px;background:#F0F4F8;border-left:3px solid #1E7FC2;border-radius:4px;color:#1B3A63;font-size:0.95em;"><b>With the plugin:</b> typed columns are filled the right way, so prices sort as numbers and dates as dates.</p></td>
</tr>
<tr>
<td style="width:50%;vertical-align:top;background:#FFFFFF;border:1px solid #DCE4EC;border-top:4px solid #1E7FC2;border-radius:8px;padding:14px 16px;"><p style="margin:0 0 8px 0;font-size:1.1em;color:#1B3A63;"><span style="display:inline-block;width:24px;height:24px;line-height:24px;border-radius:12px;background:#1E7FC2;color:#FFFFFF;text-align:center;font-size:13px;font-weight:bold;">3</span>&nbsp; <b>Sort, filter, group</b></p><p style="margin:0 0 10px 0;color:#425D7B;font-size:0.95em;">The three features users expect from any data grid, all switched on at once.</p><p style="margin:0;padding:8px 10px;background:#F0F4F8;border-left:3px solid #1E7FC2;border-radius:4px;color:#1B3A63;font-size:0.95em;"><b>With the plugin:</b> Claude knows the options for multi-column sorting, the filter row and grouping with expand/collapse, and how they work together.</p></td>
<td style="width:50%;vertical-align:top;background:#FFFFFF;border:1px solid #DCE4EC;border-top:4px solid #1E7FC2;border-radius:8px;padding:14px 16px;"><p style="margin:0 0 8px 0;font-size:1.1em;color:#1B3A63;"><span style="display:inline-block;width:24px;height:24px;line-height:24px;border-radius:12px;background:#1E7FC2;color:#FFFFFF;text-align:center;font-size:13px;font-weight:bold;">4</span>&nbsp; <b>Formatting and cell controls</b></p><p style="margin:0 0 10px 0;color:#425D7B;font-size:0.95em;">Cells coloured by their value, plus a checkbox column and a progress bar column.</p><p style="margin:0;padding:8px 10px;background:#F0F4F8;border-left:3px solid #1E7FC2;border-radius:4px;color:#1B3A63;font-size:0.95em;"><b>With the plugin:</b> Claude knows how to give columns their type and editor at runtime and how to write formatting rules per column.</p></td>
</tr>
<tr>
<td style="width:50%;vertical-align:top;background:#FFFFFF;border:1px solid #DCE4EC;border-top:4px solid #1E7FC2;border-radius:8px;padding:14px 16px;"><p style="margin:0 0 8px 0;font-size:1.1em;color:#1B3A63;"><span style="display:inline-block;width:24px;height:24px;line-height:24px;border-radius:12px;background:#1E7FC2;color:#FFFFFF;text-align:center;font-size:13px;font-weight:bold;">5</span>&nbsp; <b>Editing and merged cells</b></p><p style="margin:0 0 10px 0;color:#425D7B;font-size:0.95em;">In-place editing with a validation rule, and merged cells where they add meaning.</p><p style="margin:0;padding:8px 10px;background:#F0F4F8;border-left:3px solid #1E7FC2;border-radius:4px;color:#1B3A63;font-size:0.95em;"><b>With the plugin:</b> Claude knows the editing and validation events, and the right way to merge cells in a grid with header rows.</p></td>
<td style="width:50%;vertical-align:top;background:#FFFFFF;border:1px solid #DCE4EC;border-top:4px solid #1E7FC2;border-radius:8px;padding:14px 16px;"><p style="margin:0 0 8px 0;font-size:1.1em;color:#1B3A63;"><span style="display:inline-block;width:24px;height:24px;line-height:24px;border-radius:12px;background:#1E7FC2;color:#FFFFFF;text-align:center;font-size:13px;font-weight:bold;">6</span>&nbsp; <b>Export and toolbar</b></p><p style="margin:0 0 10px 0;color:#425D7B;font-size:0.95em;">Excel and PDF export, plus buttons to switch grouping on and off and clear all filters.</p><p style="margin:0;padding:8px 10px;background:#F0F4F8;border-left:3px solid #1E7FC2;border-radius:4px;color:#1B3A63;font-size:0.95em;"><b>With the plugin:</b> Claude picks the right export components, exports the whole grid and wires up the toolbar actions.</p></td>
</tr>
<tr>
<td colspan="2" style="vertical-align:top;background:#FFFFFF;border:1px solid #DCE4EC;border-top:4px solid #4CB782;border-radius:8px;padding:14px 16px;"><p style="margin:0 0 8px 0;font-size:1.1em;color:#1B3A63;"><span style="display:inline-block;width:24px;height:24px;line-height:24px;border-radius:12px;background:#4CB782;color:#FFFFFF;text-align:center;font-size:13px;font-weight:bold;">7</span>&nbsp; <b>Build until it works</b></p><p style="margin:0 0 10px 0;color:#425D7B;font-size:0.95em;">A project name, and the instruction to build and keep fixing errors until it compiles.</p><p style="margin:0;padding:8px 10px;background:#EEF8F2;border-left:3px solid #4CB782;border-radius:4px;color:#1B3A63;font-size:0.95em;"><b>Why it's there:</b> Claude checks its own work and hands you a project that compiles. Give it your own build command and it does the same in your projects.</p></td>
</tr>
</tbody></table>

<p><br></p>

<div style="padding:16px 20px;border-left:5px solid #1E7FC2;background:#F0F4F8;border-radius:8px;">
<p style="margin:0 0 6px 0;font-size:1.15em;color:#1B3A63;"><b>Write your own prompts the same way</b></p>
<p style="margin:0 0 8px 0;">Say what to build and for which framework, list the features you want, and tell Claude how to check its work. The plugin takes care of the how. The same approach works for even bigger requests, such as:</p>
<ul style="margin:0;">
<li><i>"Show my FireDAC customers in one grid and their orders in an editable grid below it."</i></li>
<li><i>"Group by country, then by city, with a count and an average per group."</i></li>
<li><i>"Expand each order row to show its order lines in a nested grid."</i></li>
<li><i>"Give the grid our corporate look: navy header, zebra rows, currency formatting and a totals footer."</i></li>
</ul>
</div>

<p><br></p>

<h3>Same polished result, less waiting</h3>

<p>To see what that looks like in practice, we asked Claude for a styled <b>Sales Dashboard</b> in FireMonkey, once with and once without the plugin. The brief covered order lines grouped by region with revenue totals, a filter row, colour-coded margins, data bars, a checkbox column, a merged band header, a totals footer, a navy corporate style and Excel and PDF export buttons.</p>

<p>Both versions ended up looking professional. With the plugin, Claude got there in <b>12.4 minutes and 93 tool calls</b>, including two short follow-up prompts to fine-tune the Paid column and the footer. Without the plugin it took <b>14.6 minutes and 128 tool calls</b>. Same dashboard, less time spent waiting and following along.</p>

<p><br></p>

<a href="https://www.tmssoftware.com/site/img/tmsfncdatagrid_claude/tmsfncdatagridclaudecomparison.png" target="_blank" rel="noopener" title="Open full size"><img src="https://www.tmssoftware.com/site/img/tmsfncdatagrid_claude/tmsfncdatagridclaudecomparison.png" alt="Two Sales Dashboards built by Claude side by side: with the plugin in 12.4 minutes and 93 tool calls, without the plugin in 14.6 minutes and 128 tool calls" style="max-width:100%;height:auto;border-radius:12px;"></a>

<p><br></p>

<h3>Faster, with less effort: the numbers</h3>

<p>We gave Claude the same assignment with and without the plugin: build a new <b>FireMonkey</b> demo of the DataGrid with ten features, from sample data, sorting, a filter row and grouping to conditional formatting, cell controls, editing, merged cells, and Excel and PDF export. Claude had to keep going until the project compiled with Delphi 13. We then rebuilt every project and checked every feature.</p>

<p><br></p>

<a href="https://www.tmssoftware.com/site/img/tmsfncdatagrid_claude/tmsfncdatagridclauderesults.png" target="_blank" rel="noopener" title="Open full size"><img src="https://www.tmssoftware.com/site/img/tmsfncdatagrid_claude/tmsfncdatagridclauderesults.png" alt="Bar charts: with the plugin, wall time down 22%, tool calls down 43%, tokens down 33%, and 19 of 20 features working versus 17.5" style="max-width:100%;height:auto;border-radius:12px;"></a>

<p><br></p>

<table style="width:100%;border-collapse:collapse;font-size:0.95em;">
<tbody><tr>
<th style="text-align:left;padding:8px 10px;border:1px solid #E1E7EE;">Average per run</th>
<th style="text-align:right;padding:8px 10px;border:1px solid #E1E7EE;">With plugin</th>
<th style="text-align:right;padding:8px 10px;border:1px solid #E1E7EE;">Without plugin</th>
<th style="text-align:right;padding:8px 10px;border:1px solid #E1E7EE;">You gain</th>
</tr>
<tr>
<td style="padding:8px 10px;border:1px solid #E1E7EE;">Time until the demo was finished</td>
<td style="text-align:right;padding:8px 10px;border:1px solid #E1E7EE;">5.4 min</td>
<td style="text-align:right;padding:8px 10px;border:1px solid #E1E7EE;">6.9 min</td>
<td style="text-align:right;padding:8px 10px;border:1px solid #E1E7EE;"><b>22% faster</b></td>
</tr>
<tr>
<td style="padding:8px 10px;border:1px solid #E1E7EE;">Tool calls (file reads, searches, edits, builds)</td>
<td style="text-align:right;padding:8px 10px;border:1px solid #E1E7EE;">30.5</td>
<td style="text-align:right;padding:8px 10px;border:1px solid #E1E7EE;">53.5</td>
<td style="text-align:right;padding:8px 10px;border:1px solid #E1E7EE;"><b>43% fewer</b></td>
</tr>
<tr>
<td style="padding:8px 10px;border:1px solid #E1E7EE;">Tokens used</td>
<td style="text-align:right;padding:8px 10px;border:1px solid #E1E7EE;">3.93 million</td>
<td style="text-align:right;padding:8px 10px;border:1px solid #E1E7EE;">5.89 million</td>
<td style="text-align:right;padding:8px 10px;border:1px solid #E1E7EE;"><b>33% fewer</b></td>
</tr>
<tr>
<td style="padding:8px 10px;border:1px solid #E1E7EE;">Estimated cost (relative)</td>
<td style="text-align:right;padding:8px 10px;border:1px solid #E1E7EE;">0.80 to 0.84&#215;</td>
<td style="text-align:right;padding:8px 10px;border:1px solid #E1E7EE;">1&#215;</td>
<td style="text-align:right;padding:8px 10px;border:1px solid #E1E7EE;"><b>16 to 20% lower</b></td>
</tr>
<tr>
<td style="padding:8px 10px;border:1px solid #E1E7EE;">Grid features working at runtime</td>
<td style="text-align:right;padding:8px 10px;border:1px solid #E1E7EE;">19 / 20</td>
<td style="text-align:right;padding:8px 10px;border:1px solid #E1E7EE;">17.5 / 20</td>
<td style="text-align:right;padding:8px 10px;border:1px solid #E1E7EE;"><b>more features that just work</b></td>
</tr>
</tbody></table>

<p><br></p>

<p>Why the difference? Without the plugin, Claude has to search the grid's source code for every property name, event and option before it can use them. With the plugin, it already knows them. That means fewer detours, less time watching Claude look things up and more time seeing your grid come together.</p>

<p><br></p>

<div style="padding:16px 20px;border-left:5px solid #1E7FC2;background:#F0F4F8;border-radius:8px;">
<p style="margin:0 0 6px 0;font-size:1.15em;color:#1B3A63;"><b>Good to know</b></p>
<p style="margin:0;">The plugin works with <b>VCL</b>, <b>FireMonkey</b> and <b>TMS WEB Core</b> projects and needs the <b>TMS FNC UI Pack</b> installed in your IDE. If it isn't installed yet, the Get started skill explains how to install it with TMS Smart Setup. The plugin only adds knowledge and instructions for Claude: it runs no code of its own and sends no data to TMS Software. Benchmark figures are averages of two runs with and two runs without the plugin, using Claude Opus 5.5.</p>
</div>

<p><br></p>

<h3>What's next</h3>

<p>The TMS FNC DataGrid is the first product with its own Claude plugin, and our marketplace is ready for more. We plan to cover more TMS products the same way. Let us know in the comments which one you'd like to see next.</p>

<p><br></p>

<img src="https://www.tmssoftware.com/site/img/tmsfncdatagrid_claude/tmsfncdatagridclaudebanner.png" alt="Less guessing, more working grids: install the TMS FNC DataGrid plugin from GitHub today, coming soon to the Claude plugin directory" style="max-width:100%;height:auto;border-radius:12px;">

<p><br></p>

<h3>Try it today</h3>

<p>Install the plugin, ask Claude to add a grid to your next form, and see the difference for yourself:</p>

<ul>
<li>Install today from GitHub: <a href="https://github.com/tmssoftware/tms.claude.plugins" target="_blank" rel="noopener">tmssoftware/tms.claude.plugins</a></li>
<li>Soon in the <a href="https://claude.ai/directory" target="_blank" rel="noopener">Claude plugin directory</a></li>
<li>The <a href="https://doc.tmssoftware.com/fnc/uipack/datagrid/index.html" target="_blank" rel="noopener">TMS FNC DataGrid documentation</a></li>
<li>The <a href="https://support.tmssoftware.com/c/fnc" target="_blank" rel="noopener">TMS support forum</a></li></ul>

<div style="padding:20px 24px;background:#1B3A63;border-radius:10px;color:#FFFFFF;">
<p style="margin:0 0 8px 0;font-size:1.25em;color:#FFFFFF;"><b>Over to you</b></p>
<p style="margin:0 0 12px 0;color:#E3EAF1;">We'd love to hear what you think. Leave a comment below and tell us:</p>
<p style="margin:0 0 6px 0;color:#FFFFFF;"><span style="display:inline-block;width:20px;height:20px;line-height:20px;border-radius:10px;background:#1E7FC2;text-align:center;font-size:12px;font-weight:bold;margin-right:10px;">?</span><b>Would you use this plugin</b> in your own Delphi projects?</p>
<p style="margin:0 0 6px 0;color:#FFFFFF;"><span style="display:inline-block;width:20px;height:20px;line-height:20px;border-radius:10px;background:#1E7FC2;text-align:center;font-size:12px;font-weight:bold;margin-right:10px;">?</span><b>Do you already use Claude plugins</b> in your daily work?</p>
<p style="margin:0 0 6px 0;color:#FFFFFF;"><span style="display:inline-block;width:20px;height:20px;line-height:20px;border-radius:10px;background:#1E7FC2;text-align:center;font-size:12px;font-weight:bold;margin-right:10px;">?</span><b>Which LLM do you use for coding</b>: Claude, GPT, Gemini or something else?</p>
<p style="margin:0 0 14px 0;color:#FFFFFF;"><span style="display:inline-block;width:20px;height:20px;line-height:20px;border-radius:10px;background:#1E7FC2;text-align:center;font-size:12px;font-weight:bold;margin-right:10px;">?</span><b>Which TMS product</b> should get its own plugin next?</p>
<p style="margin:0;color:#8FB3D9;font-size:0.95em;">Every comment helps us decide where to take the plugins next.</p>
</div>

<p><br></p>

<hr>

<p><b><a href="https://www.tmssoftware.com/site/tmsfncuipack.asp" target="_blank" rel="noopener">TMS FNC UI Pack</a></b> brings more than 70 cross-framework components to <b>VCL</b>, <b>FireMonkey</b> and <b>TMS WEB Core</b>, including the TMS FNC DataGrid with sorting, filtering, grouping, conditional formatting, database binding and Excel/PDF export. <a href="https://www.tmssoftware.com/site/tmsfncuipack.asp" target="_blank" rel="noopener">Learn more about TMS FNC UI Pack</a>.</p>

		
		
		
		<br><br></P>]]></description>
	</item>
	<item>
		<title><![CDATA[Building an AI Mail Desk for a Car Dealership with Delphi]]></title>
		<link>https://www.tmssoftware.com/site/blog.asp?post=2548</link>
		<author>Bradley Velghe</author>
		<pubDate>Tue, 27 Oct 2026 12:00:00 +0000</pubDate>
		<description><![CDATA[<P>
		
		

<div style="display:flex;flex-wrap:wrap;gap:8px;margin:0 0 18px;"><span style="font-size: 1.15em;">A multi-brand car dealership receives hundreds of mails a week in a shared mailbox: test drive requests, breakdowns on the highway, leasing questions, invoices, trade-ins and the occasional prize scam. Someone has to read every mail, decide who should handle it and answer the customer, often in Dutch, French or German.</span></div>

<p><strong>AI Mail Desk</strong> is a Delphi showcase that hands that first pass to an AI. It fetches mail from Gmail and Outlook, lets an LLM classify every message and write a reply in the customer's language, routes it to the right person and saves the reply as a draft for a human to check. The dealership in the demo, Brightline Motors, is fictional; the components are not.</p>

<p><img src="https://www.tmssoftware.com/site/img/blog/aimaildesk/hero.png" alt="Customer mails in three languages flow through an AI step into the AI Mail Desk dashboard." style="max-width:100%;height:auto;border-radius:12px;border:1px solid #DCE4EC;box-shadow:0 10px 30px -12px rgba(27,58,99,0.30);"></p>
<p style="text-align:center;font-size:13px;color:#4E6A88;"><i>Incoming mail is classified, routed and answered before anyone opens it.</i></p>

<div style="display:flex;flex-wrap:wrap;gap:14px;margin:22px 0;">
  <div style="flex:1;min-width:150px;background:linear-gradient(145deg,#1B3A63,#12294A);border:1px solid #26507F;border-radius:12px;padding:16px 14px;text-align:center;box-shadow:0 4px 18px rgba(27,58,99,0.18);">
    <div style="font-family:Consolas,monospace;font-size:26px;font-weight:700;background:linear-gradient(90deg,#7FD1F7,#29B6E8);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:#29B6E8;">4</div>
    <div style="font-family:Consolas,monospace;font-size:10.5px;color:#B6CADE;margin-top:4px;">languages in the demo inbox: English, Dutch, French and German</div>
  </div>
  <div style="flex:1;min-width:150px;background:linear-gradient(145deg,#1B3A63,#12294A);border:1px solid #26507F;border-radius:12px;padding:16px 14px;text-align:center;box-shadow:0 4px 18px rgba(27,58,99,0.18);">
    <div style="font-family:Consolas,monospace;font-size:26px;font-weight:700;background:linear-gradient(90deg,#7FD1F7,#29B6E8);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:#29B6E8;">15</div>
    <div style="font-family:Consolas,monospace;font-size:10.5px;color:#B6CADE;margin-top:4px;">demo mails, so you can try it without a mailbox</div>
  </div>
  <div style="flex:1;min-width:150px;background:linear-gradient(145deg,#1B3A63,#12294A);border:1px solid #26507F;border-radius:12px;padding:16px 14px;text-align:center;box-shadow:0 4px 18px rgba(27,58,99,0.18);">
    <div style="font-family:Consolas,monospace;font-size:26px;font-weight:700;background:linear-gradient(90deg,#7FD1F7,#29B6E8);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:#29B6E8;">3</div>
    <div style="font-family:Consolas,monospace;font-size:10.5px;color:#B6CADE;margin-top:4px;">TMS product families in one application</div>
  </div>
  <div style="flex:1;min-width:150px;background:linear-gradient(145deg,#1B3A63,#12294A);border:1px solid #26507F;border-radius:12px;padding:16px 14px;text-align:center;box-shadow:0 4px 18px rgba(27,58,99,0.18);">
    <div style="font-family:Consolas,monospace;font-size:26px;font-weight:700;background:linear-gradient(90deg,#7FD1F7,#29B6E8);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:#29B6E8;">0</div>
    <div style="font-family:Consolas,monospace;font-size:10.5px;color:#B6CADE;margin-top:4px;">replies sent to a customer without a person</div>
  </div>
</div><p><br></p>

<h3 style="border-left:4px solid #1E7FC2;padding-left:12px;">What the Demo Does</h3>

<div style="display:flex;flex-wrap:wrap;gap:12px;margin:18px 0 26px;"><div style="flex:1 1 190px;padding:16px 18px;border-radius:12px;background:#FFFFFF;border:1px solid #DCE4EC;border-top:3px solid #1B3A63;"><div style="font-family:Roboto,'Segoe UI',sans-serif;font-size:15.5px;font-weight:700;color:#1B3A63;margin:0 0 6px;">Fetches mail</div><div style="font-size:14px;line-height:1.6;color:#24384B;">From Gmail and Outlook, including photos and PDF attachments.</div></div><div style="flex:1 1 190px;padding:16px 18px;border-radius:12px;background:#FFFFFF;border:1px solid #DCE4EC;border-top:3px solid #1B3A63;"><div style="font-family:Roboto,'Segoe UI',sans-serif;font-size:15.5px;font-weight:700;color:#1B3A63;margin:0 0 6px;">Classifies every mail</div><div style="font-size:14px;line-height:1.6;color:#24384B;">With the AI service of your choice: department, car brand, priority, a one-line summary and a spam verdict.</div></div><div style="flex:1 1 190px;padding:16px 18px;border-radius:12px;background:#FFFFFF;border:1px solid #DCE4EC;border-top:3px solid #1B3A63;"><div style="font-family:Roboto,'Segoe UI',sans-serif;font-size:15.5px;font-weight:700;color:#1B3A63;margin:0 0 6px;">Routes it</div><div style="font-size:14px;line-height:1.6;color:#24384B;">Through a routing table, so Audi sales and Volkswagen sales go to different people. Returning customers are remembered.</div></div><div style="flex:1 1 190px;padding:16px 18px;border-radius:12px;background:#FFFFFF;border:1px solid #DCE4EC;border-top:3px solid #1B3A63;"><div style="font-family:Roboto,'Segoe UI',sans-serif;font-size:15.5px;font-weight:700;color:#1B3A63;margin:0 0 6px;">Writes the reply</div><div style="font-size:14px;line-height:1.6;color:#24384B;">In the customer's language, saved as a threaded draft. Nothing is sent without a person.</div></div><div style="flex:1 1 190px;padding:16px 18px;border-radius:12px;background:#FFFFFF;border:1px solid #DCE4EC;border-top:3px solid #1B3A63;"><div style="font-family:Roboto,'Segoe UI',sans-serif;font-size:15.5px;font-weight:700;color:#1B3A63;margin:0 0 6px;">Acts on it</div><div style="font-size:14px;line-height:1.6;color:#24384B;">Forwards to the handler and files the original, books workshop slots, alerts the on-call mechanic and translates.</div></div><div style="flex:1 1 190px;padding:16px 18px;border-radius:12px;background:#FFFFFF;border:1px solid #DCE4EC;border-top:3px solid #1B3A63;"><div style="font-family:Roboto,'Segoe UI',sans-serif;font-size:15.5px;font-weight:700;color:#1B3A63;margin:0 0 6px;">Runs as an MCP server</div><div style="font-size:14px;line-height:1.6;color:#24384B;">Claude, n8n or any other LLM client can work the inbox, while a FireMonkey dashboard shows what happens.</div></div></div>

<p><br></p>

<h3 style="border-left:4px solid #1E7FC2;padding-left:12px;">One Server, Many Clients</h3>

<p>The heart of the system is <code>GarageMailMCP.exe</code>, a console application built with TMS AI Studio. It owns the inbox, the routing table, the settings, the work queues and the customer history, and every part of it is available as an MCP tool. The FireMonkey dashboard is one client of that server; an LLM is another. What Claude changes in the routing table shows up in the dashboard within a second, and the other way round.</p>

<p><img src="https://www.tmssoftware.com/site/img/blog/aimaildesk/architecture.png" alt="MCP clients on the left connect over HTTP to the triage server, which talks to Gmail, Outlook, an AI service, calendars and Pushover." style="max-width:100%;height:auto;border-radius:12px;border:1px solid #DCE4EC;box-shadow:0 10px 30px -12px rgba(27,58,99,0.30);"></p>
<p style="text-align:center;font-size:13px;color:#4E6A88;"><i>The triage server owns the state; the dashboard and any LLM work through the same MCP tools.</i></p>

<p>That split is more than an architecture diagram. Because every action is a tool, the same server can be operated by a person clicking buttons, by an assistant inside the dashboard, or by an automation that triages new mail every few minutes and only leaves the decisions to people.</p>

<p><br></p>

<h3 style="border-left:4px solid #1E7FC2;padding-left:12px;">Three Product Families, One Application</h3>

<p>Each part of the demo leans on a different TMS product:</p>

<div style="display:flex;flex-direction:column;gap:10px;margin:18px 0 26px;"><div style="display:flex;flex-wrap:wrap;align-items:flex-start;gap:10px 16px;padding:14px 16px;border-radius:12px;background:#F1F5F9;border:1px solid #DCE4EC;border-left:4px solid #1E7FC2;"><div style="flex:0 0 230px;"><span style="display:inline-flex;align-items:center;gap:8px;padding:3px 11px 3px 3px;border-radius:7px;background:#F1F5F9;border:1px solid #DCE4EC;text-decoration:none;white-space:nowrap;"><span style="font-family:Consolas,monospace;font-weight:700;font-size:11px;letter-spacing:.1em;color:#FFFFFF;background:#1B3A63;padding:3px 7px;border-radius:5px;">AI</span><span style="font-family:Consolas,monospace;font-size:11px;font-weight:500;letter-spacing:.14em;text-transform:uppercase;color:#1B3A63;">TMS AI Studio</span></span></div><div style="flex:1 1 260px;font-size:14px;line-height:1.65;color:#24384B;">Triage and translations through <code>TTMSMCPCloudAI</code> (OpenAI, Claude, Gemini, Mistral, Ollama and more), the attribute-based MCP server, and <code>TTMSMCPClient</code> for the in-app assistant.</div></div><div style="display:flex;flex-wrap:wrap;align-items:flex-start;gap:10px 16px;padding:14px 16px;border-radius:12px;background:#F1F5F9;border:1px solid #DCE4EC;border-left:4px solid #1E7FC2;"><div style="flex:0 0 230px;"><span style="display:inline-flex;align-items:center;gap:8px;padding:3px 11px 3px 3px;border-radius:7px;background:#F1F5F9;border:1px solid #DCE4EC;text-decoration:none;white-space:nowrap;"><span style="font-family:Consolas,monospace;font-weight:700;font-size:11px;letter-spacing:.1em;color:#FFFFFF;background:#1B3A63;padding:3px 7px;border-radius:5px;">FNC</span><span style="font-family:Consolas,monospace;font-size:11px;font-weight:500;letter-spacing:.14em;text-transform:uppercase;color:#1B3A63;">TMS FNC Cloud Pack</span></span></div><div style="flex:1 1 260px;font-size:14px;line-height:1.65;color:#24384B;">Gmail, Outlook, Google Calendar, Outlook Calendar and Pushover.</div></div><div style="display:flex;flex-wrap:wrap;align-items:flex-start;gap:10px 16px;padding:14px 16px;border-radius:12px;background:#F1F5F9;border:1px solid #DCE4EC;border-left:4px solid #1E7FC2;"><div style="flex:0 0 230px;"><span style="display:inline-flex;align-items:center;gap:8px;padding:3px 11px 3px 3px;border-radius:7px;background:#F1F5F9;border:1px solid #DCE4EC;text-decoration:none;white-space:nowrap;"><span style="font-family:Consolas,monospace;font-weight:700;font-size:11px;letter-spacing:.1em;color:#FFFFFF;background:#1B3A63;padding:3px 7px;border-radius:5px;">FNC</span><span style="font-family:Consolas,monospace;font-size:11px;font-weight:500;letter-spacing:.14em;text-transform:uppercase;color:#1B3A63;">TMS FNC UI Pack</span></span></div><div style="flex:1 1 260px;font-size:14px;line-height:1.65;color:#24384B;">The dashboard: <code>TTMSFNCDataGrid</code> with conditional formatting, <code>TTMSFNCKanbanBoard</code>, <code>TTMSFNCPlanner</code> and <code>TTMSFNCChat</code>.</div></div></div>

<p><img src="https://www.tmssoftware.com/site/img/blog/aimaildesk/inbox.png" alt="The inbox of the dashboard with department badges, priorities, confidence bars and the detail panel of a selected mail." style="max-width:100%;height:auto;border-radius:12px;border:1px solid #DCE4EC;box-shadow:0 10px 30px -12px rgba(27,58,99,0.30);"></p>
<p style="text-align:center;font-size:13px;color:#4E6A88;"><i>The dashboard inbox: department badges, priority, AI confidence and the analysis of the selected mail.</i></p>

<p><br></p>

<h3 style="border-left:4px solid #1E7FC2;padding-left:12px;">Try It Without a Mailbox</h3>

<p>You do not need a Google or Microsoft account to explore the demo. Start the server, start the dashboard and click <strong>Get mail</strong>: with no mailbox connected, thirteen realistic customer mails in English, Dutch, French and German arrive, plus two spam mails. Pick an AI service and API key on the Settings page, or choose the offline keyword rules to see the flow without an AI.</p><div style="display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin:18px 0 18px;padding:18px;border-radius:14px;background:#F0F4F8;border:1px solid #DCE4EC;"><span style="font-family:Consolas,monospace;font-size:11px;font-weight:700;letter-spacing:.14em;color:#4E6A88;margin-right:4px;">THE WHOLE TOOLBAR</span><span style="display:inline-block;padding:7px 14px;border-radius:999px;background:#FFFFFF;color:#16283C;border:1px solid #C3D0DD;font-family:Roboto,'Segoe UI',sans-serif;font-weight:600;font-size:14px;white-space:nowrap;">Get mail</span><span style="color:#4E6A88;font-size:18px;">→</span><span style="display:inline-block;padding:7px 14px;border-radius:999px;background:#1E7FC2;color:#FFFFFF;border:1px solid #1E7FC2;font-family:Roboto,'Segoe UI',sans-serif;font-weight:600;font-size:14px;white-space:nowrap;">Triage with AI</span><span style="color:#4E6A88;font-size:18px;">→</span><span style="display:inline-block;padding:7px 14px;border-radius:999px;background:#FFFFFF;color:#16283C;border:1px solid #C3D0DD;font-family:Roboto,'Segoe UI',sans-serif;font-weight:600;font-size:14px;white-space:nowrap;">Forward</span></div><div style="display:flex;gap:14px;align-items:flex-start;margin:20px 0 24px;padding:16px 18px;border-radius:12px;background:#EEF6F1;border:1px solid #BFDFCB;"><span style="flex:0 0 auto;width:26px;height:26px;border-radius:50%;background:#14663A;color:#fff;font-family:Roboto,'Segoe UI',sans-serif;font-weight:700;font-size:14px;line-height:26px;text-align:center;">✓</span><div style="min-width:0;"><div style="font-family:Roboto,'Segoe UI',sans-serif;font-weight:700;font-size:15px;color:#14663A;margin:2px 0 4px;">Safe by default</div><div style="font-size:14.5px;line-height:1.65;color:#24384B;">Drafts and forwards are simulated until you connect a real mailbox on the Settings page, and forwarding stays in dry-run mode until you switch it off there.</div></div></div>

<div style="background:linear-gradient(120deg,#1B3A63,#12294A);border-radius:8px;padding:18px 22px;margin:22px 0;border:1px solid #26507F;box-shadow:0 4px 20px rgba(27,58,99,0.18);position:relative;">
  <div style="position:absolute;left:0;top:0;bottom:0;width:4px;background:linear-gradient(180deg,#29B6E8,#1E7FC2);border-radius:8px 0 0 8px;"></div>
  <p style="margin:0;font-family:Consolas,monospace;font-size:14px;font-style:italic;color:#F0F4F8;">"The LLM does the reading and sorting; your Delphi code does the connecting."</p>
</div><p><br></p>

<h3 style="border-left:4px solid #1E7FC2;padding-left:12px;">Download AI Mail Desk</h3>

<p>The complete demo is on GitHub. Run the prebuilt binaries to try it in a few minutes, or clone the repository and build it yourself to follow along with the code in this series.</p>

<div style="display:flex;flex-wrap:wrap;gap:10px;margin:18px 0 22px;"><a href="https://github.com/tmssoftware/tms.demos.aimaildesk/releases" style="display:inline-block;padding:9px 18px;border-radius:999px;background:#1E7FC2;color:#FFFFFF;border:1px solid #1E7FC2;font-family:Roboto,'Segoe UI',sans-serif;font-weight:600;font-size:14px;text-decoration:none;white-space:nowrap;">↓&nbsp; Download the Win32 binaries</a><a href="https://github.com/tmssoftware/tms.demos.aimaildesk" style="display:inline-block;padding:9px 18px;border-radius:999px;background:#FFFFFF;color:#16283C;border:1px solid #C3D0DD;font-family:Roboto,'Segoe UI',sans-serif;font-weight:600;font-size:14px;text-decoration:none;white-space:nowrap;">View the source on GitHub</a></div>

<p>The release has two zips, one per edition:</p>

<ul>
<li><strong>AIMailDesk-Garage-Win32.zip</strong>: the Brightline Motors showcase that this series is about.</li>
<li><strong>AIMailDesk-Configurable-Win32.zip</strong>: the configurable edition. It contains no car dealership: you pick a business template on its <strong>Setup</strong> page and define your own categories, routing and replies.</li>
</ul>

<div style="display:flex;flex-wrap:wrap;gap:12px;margin:18px 0 22px;"><div style="flex:1 1 280px;padding:16px 18px;border-radius:12px;background:#FFFFFF;border:1px solid #DCE4EC;border-top:3px solid #1B3A63;"><div style="font-family:Roboto,'Segoe UI',sans-serif;font-size:15.5px;font-weight:700;color:#1B3A63;margin:0 0 8px;">Option 1: Run the binaries</div><ol style="margin:0;padding-left:20px;font-size:14px;line-height:1.6;color:#24384B;"><li>Open the <a href="https://github.com/tmssoftware/tms.demos.aimaildesk/releases">Releases</a> page and download one of the zips.</li><li>Unzip it to a folder of your own and keep its folder structure: the demo looks for its sample attachments there.</li><li>Garage edition: start <code>MCPServer\GarageMailMCP.exe</code> first, then <code>GarageMailDesk.exe</code>. Configurable edition: start <code>MailDesk.exe</code>, which starts <code>MailDeskServer.exe</code> by itself.</li><li>Click <strong>Get mail</strong> and then <strong>Triage with AI</strong>.</li></ol></div><div style="flex:1 1 280px;padding:16px 18px;border-radius:12px;background:#FFFFFF;border:1px solid #DCE4EC;border-top:3px solid #1B3A63;"><div style="font-family:Roboto,'Segoe UI',sans-serif;font-size:15.5px;font-weight:700;color:#1B3A63;margin:0 0 8px;">Option 2: Build from source</div><div style="font-size:14px;line-height:1.6;color:#24384B;"><p style="margin:0 0 8px;">Clone the repository:</p><pre style="margin:0 0 10px;padding:10px 12px;border-radius:8px;background:#F1F5F9;border:1px solid #DCE4EC;font-size:13px;white-space:pre-wrap;word-break:break-all;">git clone https://github.com/tmssoftware/tms.demos.aimaildesk.git</pre><p style="margin:0 0 8px;">You need Delphi (the projects are made with Delphi 13) with TMS AI Studio, TMS FNC Core, TMS FNC Cloud Pack and TMS FNC UI Pack installed. Trial versions are available on each product page.</p><p style="margin:0;">Build the server <code>MCPServer\GarageMailMCP.dproj</code> and the dashboard <code>GarageMailDesk.dproj</code> for Win32, or <code>MailDesk\Server\MailDeskServer.dproj</code> and <code>MailDesk\MailDesk.dproj</code> for the configurable edit</p></div></div></div>
		
		<br><br></P>]]></description>
	</item>
	<item>
		<title><![CDATA[TMS FNC Component Studio now available as a trial]]></title>
		<link>https://www.tmssoftware.com/site/blog.asp?post=2549</link>
		<author>A&#228;ron Decramer</author>
		<pubDate>Mon, 26 Oct 2026 12:00:00 +0000</pubDate>
		<description><![CDATA[<P><p><span style="display:inline-block;background-color:#1B3A63;color:#FFFFFF;padding:4px 10px;border-radius:5px;font-size:1.5em;font-weight:bold;">TMS FNC Component Studio</span>&nbsp;&nbsp;<span style="display:inline-block;background-color:#1E7FC2;color:#FFFFFF;padding:4px 10px;border-radius:5px;font-size:1.5em;font-weight:bold;">Free trial</span></p>
 
<p><br></p><p>You can now try TMS FNC Component Studio with a <a href="https://www.tmssoftware.com/site/tmsfncstudio.asp#downloads" target="_blank" rel="noopener" style="background-color: white; font-family: sans-serif;">free trial</a> from its product page. One installer puts all 13 FNC products in your IDE, so you can test them together in your own projects instead of installing a separate trial for each product.</p>
 
<p>FNC stands for Framework Neutral Components: components for Delphi and C++Builder that you can put on a VCL form, an FMX form or a <a href="https://www.tmssoftware.com/site/tmswebcore.asp" target="_blank" rel="noopener">TMS WEB Core</a> page. You keep one codebase for Windows, macOS, Linux, iOS, Android and the web.</p>
 
<p><span style="display:inline-block;padding:5px 14px;border-radius:999px;background:#FFFFFF;border:1px solid #D9E2EC;font-size:14px;font-weight:bold;color:#1B3A63;margin:0 6px 6px 0;">VCL</span><span style="display:inline-block;padding:5px 14px;border-radius:999px;background:#FFFFFF;border:1px solid #D9E2EC;font-size:14px;font-weight:bold;color:#1B3A63;margin:0 6px 6px 0;">FireMonkey</span><span style="display:inline-block;padding:5px 14px;border-radius:999px;background:#FFFFFF;border:1px solid #D9E2EC;font-size:14px;font-weight:bold;color:#1B3A63;margin:0 6px 6px 0;">TMS WEB Core</span></p>
 
<p><a href="https://www.tmssoftware.com/site/tmsfncstudio.asp#downloads" target="_blank" rel="noopener" style="display:inline-block;padding:12px 24px;border-radius:8px;background:#1E7FC2;color:#FFFFFF;font-weight:bold;text-decoration:none;">Download the free trial</a></p>
 
<p><br></p>
 
<a href="https://www.tmssoftware.com/site/tmsfncstudio.asp#downloads" target="_blank" rel="noopener"><img src="https://www.tmssoftware.com/site/img/blog/tmsfncstudiotrialheader.png" width="1600" height="700" alt="TMS FNC Component Studio free trial: one download with all 13 FNC products for VCL, FMX and TMS WEB Core" style="max-width:100%;height:auto;border-radius:12px;"></a>
 
<p><br></p>
 
<div style="display:flex;flex-wrap:wrap;gap:12px;">
<div style="flex:1 1 150px;padding:18px 14px;background:#FFFFFF;border:1px solid #D9E2EC;border-top:4px solid #1E7FC2;border-radius:10px;text-align:center;"><div style="font-size:2em;font-weight:bold;color:#1B3A63;line-height:1.1;">13</div><div style="margin-top:4px;font-size:14px;color:#334155;">FNC products in the trial</div></div>
<div style="flex:1 1 150px;padding:18px 14px;background:#FFFFFF;border:1px solid #D9E2EC;border-top:4px solid #1E7FC2;border-radius:10px;text-align:center;"><div style="font-size:2em;font-weight:bold;color:#1B3A63;line-height:1.1;">1</div><div style="margin-top:4px;font-size:14px;color:#334155;">installer for all of them</div></div>
<div style="flex:1 1 150px;padding:18px 14px;background:#FFFFFF;border:1px solid #D9E2EC;border-top:4px solid #1E7FC2;border-radius:10px;text-align:center;"><div style="font-size:2em;font-weight:bold;color:#1B3A63;line-height:1.1;">3</div><div style="margin-top:4px;font-size:14px;color:#334155;">frameworks: VCL, FMX and TMS WEB Core</div></div>
<div style="flex:1 1 150px;padding:18px 14px;background:#FFFFFF;border:1px solid #D9E2EC;border-top:4px solid #1E7FC2;border-radius:10px;text-align:center;"><div style="font-size:2em;font-weight:bold;color:#1B3A63;line-height:1.1;">7</div><div style="margin-top:4px;font-size:14px;color:#334155;">RAD Studio versions, 10.1 Berlin to 13 Florence</div></div>
</div>
 
<p><br></p>
 
<h2>What is in the trial</h2>
 
<p>The trial contains the same 13 products as the full TMS FNC Component Studio.</p>
 
<h3>User interface and data</h3>
<div style="display:flex;flex-wrap:wrap;gap:10px;margin:0 0 6px 0;">
<div style="flex:1 1 260px;padding:14px 16px;background:#F0F4F8;border:1px solid #D9E2EC;border-radius:10px;"><span style="display:inline-block;background-color:#BCC6CC;color:#FFFFFF;padding:2px 7px;border-radius:4px;font-size:11px;font-weight:bold;letter-spacing:.1em;margin-right:8px;vertical-align:middle;">FNC</span><a href="https://www.tmssoftware.com/site/tmsfncuipack.asp" target="_blank" rel="noopener" style="font-weight:bold;color:#1B3A63;text-decoration:none;vertical-align:middle;">TMS FNC UI Pack</a><div style="margin-top:6px;font-size:14px;line-height:1.5;color:#334155;">Data grid, planner, kanban board, ribbon and treeview.</div></div>
<div style="flex:1 1 260px;padding:14px 16px;background:#F0F4F8;border:1px solid #D9E2EC;border-radius:10px;"><span style="display:inline-block;background-color:#BCC6CC;color:#FFFFFF;padding:2px 7px;border-radius:4px;font-size:11px;font-weight:bold;letter-spacing:.1em;margin-right:8px;vertical-align:middle;">FNC</span><a href="https://www.tmssoftware.com/site/fncgridexcelbridge.asp" target="_blank" rel="noopener" style="font-weight:bold;color:#1B3A63;text-decoration:none;vertical-align:middle;">TMS FNC Grid Excel Bridge</a><div style="margin-top:6px;font-size:14px;line-height:1.5;color:#334155;">Grid data to and from .xls and .xlsx files.</div></div>
</div>
 
<h3>Charts, dashboards and planning</h3>
<div style="display:flex;flex-wrap:wrap;gap:10px;margin:0 0 6px 0;">
<div style="flex:1 1 260px;padding:14px 16px;background:#F0F4F8;border:1px solid #D9E2EC;border-radius:10px;"><span style="display:inline-block;background-color:#BCC6CC;color:#FFFFFF;padding:2px 7px;border-radius:4px;font-size:11px;font-weight:bold;letter-spacing:.1em;margin-right:8px;vertical-align:middle;">FNC</span><a href="https://www.tmssoftware.com/site/tmsfncchart.asp" target="_blank" rel="noopener" style="font-weight:bold;color:#1B3A63;text-decoration:none;vertical-align:middle;">TMS FNC Chart</a><div style="margin-top:6px;font-size:14px;line-height:1.5;color:#334155;">Charts for business, statistical, financial and scientific data.</div></div>
<div style="flex:1 1 260px;padding:14px 16px;background:#F0F4F8;border:1px solid #D9E2EC;border-radius:10px;"><span style="display:inline-block;background-color:#BCC6CC;color:#FFFFFF;padding:2px 7px;border-radius:4px;font-size:11px;font-weight:bold;letter-spacing:.1em;margin-right:8px;vertical-align:middle;">FNC</span><a href="https://www.tmssoftware.com/site/tmsfncdashboardpack.asp" target="_blank" rel="noopener" style="font-weight:bold;color:#1B3A63;text-decoration:none;vertical-align:middle;">TMS FNC Dashboard Pack</a><div style="margin-top:6px;font-size:14px;line-height:1.5;color:#334155;">Dashboard components for VCL, FMX and web apps.</div></div>
<div style="flex:1 1 260px;padding:14px 16px;background:#F0F4F8;border:1px solid #D9E2EC;border-radius:10px;"><span style="display:inline-block;background-color:#BCC6CC;color:#FFFFFF;padding:2px 7px;border-radius:4px;font-size:11px;font-weight:bold;letter-spacing:.1em;margin-right:8px;vertical-align:middle;">FNC</span><a href="https://www.tmssoftware.com/site/tmsfncganttchart.asp" target="_blank" rel="noopener" style="font-weight:bold;color:#1B3A63;text-decoration:none;vertical-align:middle;">TMS FNC Gantt Chart</a><div style="margin-top:6px;font-size:14px;line-height:1.5;color:#334155;">Project planning with tasks and their dependencies.</div></div>
</div>
 
<h3>Maps and diagrams</h3>
<div style="display:flex;flex-wrap:wrap;gap:10px;margin:0 0 6px 0;">
<div style="flex:1 1 260px;padding:14px 16px;background:#F0F4F8;border:1px solid #D9E2EC;border-radius:10px;"><span style="display:inline-block;background-color:#BCC6CC;color:#FFFFFF;padding:2px 7px;border-radius:4px;font-size:11px;font-weight:bold;letter-spacing:.1em;margin-right:8px;vertical-align:middle;">FNC</span><a href="https://www.tmssoftware.com/site/tmsfncmaps.asp" target="_blank" rel="noopener" style="font-weight:bold;color:#1B3A63;text-decoration:none;vertical-align:middle;">TMS FNC Maps</a><div style="margin-top:6px;font-size:14px;line-height:1.5;color:#334155;">Maps, routes and directions with Google Maps, OpenStreetMap, Azure Maps and more.</div></div>
<div style="flex:1 1 260px;padding:14px 16px;background:#F0F4F8;border:1px solid #D9E2EC;border-radius:10px;"><span style="display:inline-block;background-color:#BCC6CC;color:#FFFFFF;padding:2px 7px;border-radius:4px;font-size:11px;font-weight:bold;letter-spacing:.1em;margin-right:8px;vertical-align:middle;">FNC</span><a href="https://www.tmssoftware.com/site/tmsfncblox.asp" target="_blank" rel="noopener" style="font-weight:bold;color:#1B3A63;text-decoration:none;vertical-align:middle;">TMS FNC Blox</a><div style="margin-top:6px;font-size:14px;line-height:1.5;color:#334155;">Diagrams and flowcharts.</div></div>
</div>
 
<h3>Cloud and communication</h3>
<div style="display:flex;flex-wrap:wrap;gap:10px;margin:0 0 6px 0;">
<div style="flex:1 1 260px;padding:14px 16px;background:#F0F4F8;border:1px solid #D9E2EC;border-radius:10px;"><span style="display:inline-block;background-color:#BCC6CC;color:#FFFFFF;padding:2px 7px;border-radius:4px;font-size:11px;font-weight:bold;letter-spacing:.1em;margin-right:8px;vertical-align:middle;">FNC</span><a href="https://www.tmssoftware.com/site/tmsfnccloudpack.asp" target="_blank" rel="noopener" style="font-weight:bold;color:#1B3A63;text-decoration:none;vertical-align:middle;">TMS FNC Cloud Pack</a><div style="margin-top:6px;font-size:14px;line-height:1.5;color:#334155;">REST access to Google, Microsoft, PayPal and other cloud services.</div></div>
<div style="flex:1 1 260px;padding:14px 16px;background:#F0F4F8;border:1px solid #D9E2EC;border-radius:10px;"><span style="display:inline-block;background-color:#BCC6CC;color:#FFFFFF;padding:2px 7px;border-radius:4px;font-size:11px;font-weight:bold;letter-spacing:.1em;margin-right:8px;vertical-align:middle;">FNC</span><a href="https://www.tmssoftware.com/site/tmsfncwebsocket.asp" target="_blank" rel="noopener" style="font-weight:bold;color:#1B3A63;text-decoration:none;vertical-align:middle;">TMS FNC WebSocket</a><div style="margin-top:6px;font-size:14px;line-height:1.5;color:#334155;">WebSocket server and client components.</div></div>
<div style="flex:1 1 260px;padding:14px 16px;background:#F0F4F8;border:1px solid #D9E2EC;border-radius:10px;"><span style="display:inline-block;background-color:#BCC6CC;color:#FFFFFF;padding:2px 7px;border-radius:4px;font-size:11px;font-weight:bold;letter-spacing:.1em;margin-right:8px;vertical-align:middle;">FNC</span><a href="https://www.tmssoftware.com/site/tmsfncpushnotifications.asp" target="_blank" rel="noopener" style="font-weight:bold;color:#1B3A63;text-decoration:none;vertical-align:middle;">TMS FNC Push Notifications</a><div style="margin-top:6px;font-size:14px;line-height:1.5;color:#334155;">Push notification management.</div></div>
</div>
 
<h3>Web technology and application tools</h3>
<div style="display:flex;flex-wrap:wrap;gap:10px;margin:0 0 6px 0;">
<div style="flex:1 1 260px;padding:14px 16px;background:#F0F4F8;border:1px solid #D9E2EC;border-radius:10px;"><span style="display:inline-block;background-color:#BCC6CC;color:#FFFFFF;padding:2px 7px;border-radius:4px;font-size:11px;font-weight:bold;letter-spacing:.1em;margin-right:8px;vertical-align:middle;">FNC</span><a href="https://www.tmssoftware.com/site/tmsfncwxpack.asp" target="_blank" rel="noopener" style="font-weight:bold;color:#1B3A63;text-decoration:none;vertical-align:middle;">TMS FNC WX Pack</a><div style="margin-top:6px;font-size:14px;line-height:1.5;color:#334155;">Components built on web technology, for VCL, FMX and web apps.</div></div>
<div style="flex:1 1 260px;padding:14px 16px;background:#F0F4F8;border:1px solid #D9E2EC;border-radius:10px;"><span style="display:inline-block;background-color:#BCC6CC;color:#FFFFFF;padding:2px 7px;border-radius:4px;font-size:11px;font-weight:bold;letter-spacing:.1em;margin-right:8px;vertical-align:middle;">FNC</span><a href="https://www.tmssoftware.com/site/tmsfncapptools.asp" target="_blank" rel="noopener" style="font-weight:bold;color:#1B3A63;text-decoration:none;vertical-align:middle;">TMS FNC AppTools</a><div style="margin-top:6px;font-size:14px;line-height:1.5;color:#334155;">Desktop application management for VCL and FMX.</div></div>
</div>
 
<h3>Foundation</h3>
<div style="display:flex;flex-wrap:wrap;gap:10px;margin:0 0 6px 0;">
<div style="flex:1 1 260px;padding:14px 16px;background:#F0F4F8;border:1px solid #D9E2EC;border-radius:10px;"><span style="display:inline-block;background-color:#BCC6CC;color:#FFFFFF;padding:2px 7px;border-radius:4px;font-size:11px;font-weight:bold;letter-spacing:.1em;margin-right:8px;vertical-align:middle;">FNC</span><a href="https://www.tmssoftware.com/site/tmsfnccore.asp" target="_blank" rel="noopener" style="font-weight:bold;color:#1B3A63;text-decoration:none;vertical-align:middle;">TMS FNC Core</a><div style="margin-top:6px;font-size:14px;line-height:1.5;color:#334155;">The shared layer all FNC components are built on.</div></div>
</div>
 
<p><br></p>
 
<h2>How to get the trial</h2>
 
<div style="display:flex;flex-wrap:wrap;gap:12px;margin:14px 0;">
<div style="flex:1 1 200px;padding:18px;background:#F0F4F8;border:1px solid #D9E2EC;border-radius:10px;"><div style="width:34px;height:34px;border-radius:50%;background:#1E7FC2;color:#FFFFFF;font-weight:bold;font-size:16px;line-height:34px;text-align:center;">1</div><h4>Open the trial form</h4><p style="margin:0;font-size:14px;line-height:1.55;color:#334155;">Go to the <a href="https://www.tmssoftware.com/site/tmsfncstudio.asp#downloads" target="_blank" rel="noopener">Free Trial section</a> of the TMS FNC Component Studio product page.</p></div>
<div style="flex:1 1 200px;padding:18px;background:#F0F4F8;border:1px solid #D9E2EC;border-radius:10px;"><div style="width:34px;height:34px;border-radius:50%;background:#1E7FC2;color:#FFFFFF;font-weight:bold;font-size:16px;line-height:34px;text-align:center;">2</div><h4>Enter your email address</h4><p style="margin:0;font-size:14px;line-height:1.55;color:#334155;">Your trial activation key is sent to this address.</p></div>
<div style="flex:1 1 200px;padding:18px;background:#F0F4F8;border:1px solid #D9E2EC;border-radius:10px;"><div style="width:34px;height:34px;border-radius:50%;background:#1E7FC2;color:#FFFFFF;font-weight:bold;font-size:16px;line-height:34px;text-align:center;">3</div><h4>Pick your RAD Studio version</h4><p style="margin:0;font-size:14px;line-height:1.55;color:#334155;">Choose the version you work with and click <b>Download</b>.</p></div>
</div>
 
<p><br></p>
 
<div style="padding:16px 20px;border-left:5px solid #1E7FC2;background:#F0F4F8;border-radius:8px;">
<p style="margin:0 0 6px 0;font-size:1.15em;color:#1B3A63;"><b>Good to know</b></p>
<p style="margin:0;">The download starts right away, and the activation key arrives by email. The installer supports RAD Studio 10.1 Berlin up to RAD Studio 13 Florence.</p>
</div>
 
<p><br></p>
 
<h2>After the trial</h2>
 
<div style="display:flex;flex-wrap:wrap;align-items:center;gap:20px;padding:20px 22px;background:#1B3A63;border-radius:12px;color:#FFFFFF;">
<div style="flex:0 0 auto;"><div style="font-size:2.2em;font-weight:bold;line-height:1;">&#128;&nbsp;995</div><div style="margin-top:4px;font-size:13px;color:#B9CBE0;">single developer, excl. VAT</div></div>
<div style="flex:1 1 280px;font-size:15px;line-height:1.6;color:#E2EAF3;">Includes full source code, updates and access to the TMS Support Center. <a href="https://www.tmssoftware.com/site/tmsfncstudio.asp" target="_blank" rel="noopener" style="color:#7CC4F5;">Small team and site license prices</a> are on the product page.</div>
</div>
 
<p><br></p>
 
<h2>Questions while you test?</h2>
 
<p>Let us know how the FNC components work in your projects:</p>
 
<div style="display:flex;flex-wrap:wrap;gap:12px;margin:14px 0;">
<a href="https://download.tmssoftware.com/doc/" target="_blank" rel="noopener" style="flex:1 1 200px;display:block;padding:16px 18px;background:#FFFFFF;border:1px solid #D9E2EC;border-radius:10px;text-decoration:none;"><span style="display:block;font-weight:bold;color:#1E7FC2;">Documentation →</span><span style="display:block;margin-top:4px;font-size:14px;color:#334155;">Manuals for all TMS products</span></a>
<a href="https://support.tmssoftware.com/c/fnc" target="_blank" rel="noopener" style="flex:1 1 200px;display:block;padding:16px 18px;background:#FFFFFF;border:1px solid #D9E2EC;border-radius:10px;text-decoration:none;"><span style="display:block;font-weight:bold;color:#1E7FC2;">Support Center →</span><span style="display:block;margin-top:4px;font-size:14px;color:#334155;">Ask your question in the FNC section</span></a>
<a href="mailto:info@tmssoftware.com" target="_blank" rel="noopener" style="flex:1 1 200px;display:block;padding:16px 18px;background:#FFFFFF;border:1px solid #D9E2EC;border-radius:10px;text-decoration:none;"><span style="display:block;font-weight:bold;color:#1E7FC2;">Email →</span><span style="display:block;margin-top:4px;font-size:14px;color:#334155;">info@tmssoftware.com</span></a>
</div>
 
<p><a href="https://www.tmssoftware.com/site/tmsfncstudio.asp#downloads" target="_blank" rel="noopener" style="display:inline-block;padding:12px 24px;border-radius:8px;background:#1E7FC2;color:#FFFFFF;font-weight:bold;text-decoration:none;">Start your free trial</a></p>
 
<p><br></p>
 
<hr>
 
<p><b><a href="https://www.tmssoftware.com/site/tmsfncstudio.asp" target="_blank" rel="noopener">TMS FNC Component Studio</a></b> is one license for all FNC components: UI controls, charts, maps, diagrams, cloud access and more, with full source code, for <b>VCL</b>, <b>FireMonkey</b> and <b>TMS WEB Core</b>. <a href="https://www.tmssoftware.com/site/tmsfncstudio.asp" target="_blank" rel="noopener">Learn more about TMS FNC Component Studio</a>.</p>
		
		
		
		
		
		<br><br></P>]]></description>
	</item>
	<item>
		<title><![CDATA[Expired license? Restart it with 31% off this Halloween]]></title>
		<link>https://www.tmssoftware.com/site/blog.asp?post=2546</link>
		<author>A&#228;ron Decramer</author>
		<pubDate>Mon, 26 Oct 2026 12:00:00 +0000</pubDate>
		<description><![CDATA[<P><p><img src="https://www.tmssoftware.com/site/img/blog/TMS-Halloween-Banner-1280x300.png" alt="TMS Software Delphi Components" style="max-width:100%;height:auto;"></p>
 
<p>If your TMS license expired more than 30 days ago, this is a good time to bring it back. From Monday 26 October to Friday 6 November 2026, the promo code <code style="font-family:'IBM Plex Mono',Menlo,monospace;background:#fdebd8;color:#160e28;padding:1px 6px;border-radius:4px;">HALLOWEEN2026</code> takes 31% off the restart price of any product.</p><p><br></p>
 
<h2>Why restart your license</h2>
 
<p>Your TMS components keep working after your license expires, but you stay on the version you had on that day. A restart brings you up to date and keeps you there.</p>
 

<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:16px;margin:24px 0 32px;">
 
  <div style="border:1px solid #dde3e8;border-top:4px solid #f7942b;border-radius:10px;padding:20px 22px;background:#faf8fd;">
    <div style="font-size:19px;font-weight:700;margin-bottom:8px;color:#160e28;">Delphi 13.2 support</div>
    <div style="font-size:15px;line-height:1.55;color:#33424f;">An older TMS release may not support a new Delphi version, which holds your upgrade back. All actively maintained TMS products support Delphi 13.2.</div>
  </div>
 
  <div style="border:1px solid #dde3e8;border-top:4px solid #f7942b;border-radius:10px;padding:20px 22px;background:#faf8fd;">
    <div style="font-size:19px;font-weight:700;margin-bottom:8px;color:#160e28;">New features you can use right away</div>
    <div style="font-size:15px;line-height:1.55;color:#33424f;">You get everything we added since your license expired, such as PDF editing in TAdvPDFLib, TWebDBDataGrid in TMS WEB Core or OAuth sign-in in TMS AI Studio.</div>
  </div>
 
  <div style="border:1px solid #dde3e8;border-top:4px solid #f7942b;border-radius:10px;padding:20px 22px;background:#faf8fd;">
    <div style="font-size:19px;font-weight:700;margin-bottom:8px;color:#160e28;">Up to date with third-party APIs</div>
    <div style="font-size:15px;line-height:1.55;color:#33424f;">Map, cloud and AI services change their APIs and release new models. Our updates follow those changes and add new services, such as OpenRouter.ai and GPT-6-Astra in TMS AI Studio.</div>
  </div>
 
  <div style="border:1px solid #dde3e8;border-top:4px solid #f7942b;border-radius:10px;padding:20px 22px;background:#faf8fd;">
    <div style="font-size:19px;font-weight:700;margin-bottom:8px;color:#160e28;">A new period of free updates</div>
    <div style="font-size:15px;line-height:1.55;color:#33424f;">Every release in that period is included, with its new features and support for the next Delphi version. In the <a href="https://www.tmssoftware.com/site/vdsub.asp">TMS VCL Subscription</a>, <a href="https://www.tmssoftware.com/site/tmsfncstudio.asp">TMS FNC Component Studio</a> and <a href="https://www.tmssoftware.com/site/tmsallaccess.asp">TMS ALL-ACCESS</a>, new products we add to the bundle are included too.</div>
  </div>
 
  <div style="border:1px solid #dde3e8;border-top:4px solid #f7942b;border-radius:10px;padding:20px 22px;background:#faf8fd;">
    <div style="font-size:19px;font-weight:700;margin-bottom:8px;color:#160e28;">Help from our team</div>
    <div style="font-size:15px;line-height:1.55;color:#33424f;">You can post your questions in the TMS Support Center again and get help from our team.</div>
  </div>
 
</div>
 
<p><br></p><h2>Recent releases of our most popular products</h2>
 
<p>Here is a selection of what we released in recent months. If your license expired before these releases, a restart gives you access to them.</p>
 

<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:16px;margin:24px 0 32px;">
 
  <div style="border:1px solid #dde3e8;border-left:5px solid #f44336;border-radius:10px;padding:20px 22px;background:#ffffff;">
    <div style="display:flex;justify-content:space-between;align-items:baseline;gap:12px;margin-bottom:10px;">
      <a href="https://www.tmssoftware.com/site/tmsvcluipack.asp" style="font-size:19px;font-weight:700;">TMS VCL UI Pack</a>
      <span style="font-family:'IBM Plex Mono',Menlo,monospace;font-size:13px;background:#f44336;color:#ffffff;border-radius:4px;padding:2px 8px;white-space:nowrap;">v13.8</span>
    </div>
    <div style="font-size:15px;line-height:1.55;color:#33424f;">TAdvPDFLib now works with existing PDF files: open a PDF, merge other documents into it, move, rotate or remove pages and save the result. It also reads metadata and links and extracts Unicode text. The SVG engine supports fill-rule and clip-rule.</div>
  </div>
 
  <div style="border:1px solid #dde3e8;border-left:5px solid #bcc6cc;border-radius:10px;padding:20px 22px;background:#ffffff;">
    <div style="display:flex;justify-content:space-between;align-items:baseline;gap:12px;margin-bottom:10px;">
      <a href="https://www.tmssoftware.com/site/tmsfncuipack.asp" style="font-size:19px;font-weight:700;">TMS FNC UI Pack</a>
      <span style="font-family:'IBM Plex Mono',Menlo,monospace;font-size:13px;background:#bcc6cc;color:#0f1b26;border-radius:4px;padding:2px 8px;white-space:nowrap;">v7.3.1</span>
    </div>
    <div style="font-size:15px;line-height:1.55;color:#33424f;">TTMSFNCPlanner gets a TitleWordWrap option, so long item titles wrap and the title area grows to fit. Spin edit, trackbar and range slider can be styled for the disabled state, and the find, replace and filter dialogs follow your TTMSFNCStylesManager style.</div>
  </div>
 
  <div style="border:1px solid #dde3e8;border-left:5px solid #bcc6cc;border-radius:10px;padding:20px 22px;background:#ffffff;">
    <div style="display:flex;justify-content:space-between;align-items:baseline;gap:12px;margin-bottom:10px;">
      <a href="https://www.tmssoftware.com/site/tmsfncmaps.asp" style="font-size:19px;font-weight:700;">TMS FNC Maps</a>
      <span style="font-family:'IBM Plex Mono',Menlo,monospace;font-size:13px;background:#bcc6cc;color:#0f1b26;border-radius:4px;padding:2px 8px;white-space:nowrap;">v4.6</span>
    </div>
    <div style="font-size:15px;line-height:1.55;color:#33424f;">Moves to the current APIs of HERE Maps (v3.2), Mapbox (v3.24.0), Azure Maps (v4) and OpenLayers (v10.9), so your apps stay on supported versions. Your existing code needs no changes.</div>
  </div>
 
  <div style="border:1px solid #dde3e8;border-left:5px solid #33838e;border-radius:10px;padding:20px 22px;background:#ffffff;">
    <div style="display:flex;justify-content:space-between;align-items:baseline;gap:12px;margin-bottom:10px;">
      <a href="https://www.tmssoftware.com/site/tmswebcore.asp" style="font-size:19px;font-weight:700;">TMS WEB Core</a>
      <span style="font-family:'IBM Plex Mono',Menlo,monospace;font-size:13px;background:#33838e;color:#ffffff;border-radius:4px;padding:2px 8px;white-space:nowrap;">v3.0</span>
    </div>
    <div style="font-size:15px;line-height:1.55;color:#33424f;">Introduces TWebDBDataGrid, a data-aware grid you connect through a TDataSource to datasets such as TWebClientDataSet or TXDataDataSet, with editing, sorting, paging and filtering built in. Installs through TMS Smart Setup.</div>
  </div>
 
  <div style="border:1px solid #dde3e8;border-left:5px solid #bcc6cc;border-radius:10px;padding:20px 22px;background:#ffffff;">
    <div style="display:flex;justify-content:space-between;align-items:baseline;gap:12px;margin-bottom:10px;">
      <a href="https://www.tmssoftware.com/site/tmsfncstudio.asp" style="font-size:19px;font-weight:700;">TMS FNC Component Studio</a>
      <span style="font-family:'IBM Plex Mono',Menlo,monospace;font-size:13px;background:#bcc6cc;color:#0f1b26;border-radius:4px;padding:2px 8px;white-space:nowrap;">FNC Core 4.5</span>
    </div>
    <div style="font-size:15px;line-height:1.55;color:#33424f;">One license for TMS FNC UI Pack, TMS FNC Maps and the other FNC products, such as Chart, Cloud Pack, Blox and Gantt Chart. TMS FNC Core 4.5, which all FNC products share, adds PDF editing: edit, merge, rotate and save existing PDFs.</div>
  </div>
 
  <div style="border:1px solid #dde3e8;border-left:5px solid #daa521;border-radius:10px;padding:20px 22px;background:#ffffff;">
    <div style="display:flex;justify-content:space-between;align-items:baseline;gap:12px;margin-bottom:10px;">
      <a href="https://www.tmssoftware.com/site/flexcel.asp" style="font-size:19px;font-weight:700;">TMS FlexCel for VCL &amp; FMX</a>
      <span style="font-family:'IBM Plex Mono',Menlo,monospace;font-size:13px;background:#daa521;color:#0f1b26;border-radius:4px;padding:2px 8px;white-space:nowrap;">v7.27</span>
    </div>
    <div style="font-size:15px;line-height:1.55;color:#33424f;">Signs generated PDFs with ETSI PAdES signatures, the format required in the European Union, and creates PDF 2.0 and PDF/A-4 files. A new MeasureString method calculates column widths that fit a given text.</div>
  </div>
 
  <div style="border:1px solid #dde3e8;border-left:5px solid #56b8ff;border-radius:10px;padding:20px 22px;background:#ffffff;">
    <div style="display:flex;justify-content:space-between;align-items:baseline;gap:12px;margin-bottom:10px;">
      <a href="https://www.tmssoftware.com/site/tmsbiz.asp" style="font-size:19px;font-weight:700;">TMS BIZ Premium</a>
      <span style="font-family:'IBM Plex Mono',Menlo,monospace;font-size:13px;background:#56b8ff;color:#0f1b26;border-radius:4px;padding:2px 8px;white-space:nowrap;">8 Oct 2026</span>
    </div>
    <div style="font-size:15px;line-height:1.55;color:#33424f;">All TMS BIZ products, including Aurelius, XData and Sphinx. New: application configuration in a JSON file with per-deployment overrides through environment variables, and JWT signing and validation with OpenSSL 3.</div>
  </div>
 
  <div style="border:1px solid #dde3e8;border-left:5px solid #daa521;border-radius:10px;padding:20px 22px;background:#ffffff;">
    <div style="display:flex;justify-content:space-between;align-items:baseline;gap:12px;margin-bottom:10px;">
      <a href="https://www.tmssoftware.com/site/tmsaistudio.asp" style="font-size:19px;font-weight:700;">TMS AI Studio</a>
      <span style="font-family:'IBM Plex Mono',Menlo,monospace;font-size:13px;background:#daa521;color:#0f1b26;border-radius:4px;padding:2px 8px;white-space:nowrap;">v2.0</span>
    </div>
    <div style="font-size:15px;line-height:1.55;color:#33424f;">Supports MCP revision 2026-07-28 and the four revisions before it, on server and client, without code changes. TTMSMCPClient handles OAuth sign-in by itself, OpenRouter.ai is the tenth AI service, and later updates added GPT-6-Astra and Gemini 3.6 support.</div>
  </div>
 
</div>
 
<p><br></p><h2>How to restart your license</h2>
 

<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:16px;margin:24px 0;">
  <div style="background:#f3eff9;border-radius:10px;padding:20px 22px;">
    <div style="width:36px;height:36px;border-radius:50%;background:#f7942b;color:#160e28;font-weight:700;font-size:18px;display:flex;align-items:center;justify-content:center;margin-bottom:12px;">1</div>
    <div style="font-size:15px;line-height:1.55;color:#33424f;"><a href="https://www.tmssoftware.com/site/login.asp">Log in</a> to your account and open the My Products page.</div>
  </div>
  <div style="background:#f3eff9;border-radius:10px;padding:20px 22px;">
    <div style="width:36px;height:36px;border-radius:50%;background:#f7942b;color:#160e28;font-weight:700;font-size:18px;display:flex;align-items:center;justify-content:center;margin-bottom:12px;">2</div>
    <div style="font-size:15px;line-height:1.55;color:#33424f;">Select the product you want to restart.</div>
  </div>
  <div style="background:#f3eff9;border-radius:10px;padding:20px 22px;">
    <div style="width:36px;height:36px;border-radius:50%;background:#f7942b;color:#160e28;font-weight:700;font-size:18px;display:flex;align-items:center;justify-content:center;margin-bottom:12px;">3</div>
    <div style="font-size:15px;line-height:1.55;color:#33424f;">Enter <code style="font-family:'IBM Plex Mono',Menlo,monospace;background:#fdebd8;color:#160e28;padding:1px 6px;border-radius:4px;">HALLOWEEN2026</code> when you order the restart license.</div>
  </div>
</div>
 
<p><img src="https://www.tmssoftware.com/site/img/blog/TMS-Halloween-Checkout-640x620.png" style="width:640px;max-width:100%;height:auto;" alt="Enter HALLOWEEN2026 in the discount code field at checkout"></p>
 
<div style="background:linear-gradient(135deg,#160e28 0%,#2a1a48 60%,#3a245f 100%);border-radius:14px;padding:36px 32px;margin:32px 0 16px;text-align:center;color:#ffffff;">
  <div style="display:inline-block;background:#f7942b;color:#160e28;font-weight:700;font-size:13px;letter-spacing:0.12em;text-transform:uppercase;border-radius:6px;padding:6px 14px;margin-bottom:16px;">Until 6 November 2026</div>
  <div style="font-size:30px;font-weight:700;line-height:1.2;margin-bottom:18px;">Restart your license for <span style="color:#f7942b;">31% off</span></div>
  <div style="display:inline-block;font-family:'IBM Plex Mono',Menlo,monospace;font-size:20px;font-weight:600;letter-spacing:0.06em;color:#ffffff;background:rgba(247,148,43,0.12);border:1.5px dashed #f7942b;border-radius:8px;padding:10px 20px;margin-bottom:24px;">HALLOWEEN2026</div>
  <div><a href="https://www.tmssoftware.com/site/login.asp" style="display:inline-block;background:#f7942b;color:#160e28;font-weight:700;font-size:17px;text-decoration:none;border-radius:8px;padding:14px 32px;">Log in and restart your license</a></div>
</div>
 
<p style="text-align:center;">Not sure how to restart your license? Email us at <a href="mailto:sales@tmssoftware.com">sales@tmssoftware.com</a>.</p>
		
		<br><br></P>]]></description>
	</item>
	<item>
		<title><![CDATA[Auto-renewal for selected TMS products]]></title>
		<link>https://www.tmssoftware.com/site/blog.asp?post=2543</link>
		<author>Aaron Decramer</author>
		<pubDate>Wed, 21 Oct 2026 12:00:00 +0000</pubDate>
		<description><![CDATA[<P>
		
		
		
		
		
		
		
		<p style="margin:0 0 16px;font-size:16px;line-height:1.6;color:#333;"><img src="https://www.tmssoftware.com/site/img/blog/TMS-Subscription-Option-Banner-1280x300.png" style="" alt="TMS Software Delphi  Components "><br></p><p style="margin:0 0 16px;font-size:16px;line-height:1.6;color:#333;">Renewing a TMS license used to mean keeping an eye on the expiry date and placing a new order in time. From now on, you can let it renew on its own. Choose Subscribe when you renew, and your license is extended automatically each time its license period ends.</p>
<p style="margin:0 0 16px;font-size:16px;line-height:1.6;color:#333;">Your license stays active, so new versions and support keep coming without a gap. You can choose the subscription while your license is still active, and up to 30 days after it expires.</p>
<h2 style="margin:36px 0 14px;font-size:24px;line-height:1.3;font-weight:600;color:#222;">Products with the subscription option</h2>
<p style="margin:0 0 16px;font-size:16px;line-height:1.6;color:#333;">Seven products can be renewed as a subscription. The table shows which license types qualify for each product. The license period is one year for all of them, except TMS VCL Subscription, which has a two-year license period.</p>
<div style="overflow-x:auto;margin:8px 0 16px;">
<table style="border-collapse:collapse;width:100%;min-width:520px;font-size:15px;color:#333;">
<thead><tr><th style="border:3px solid #009ee3;padding:12px 16px;background:#009ee3;color:#fff;font-weight:600;font-size:14px;text-align:left;">Product</th><th style="border:3px solid #009ee3;padding:12px 16px;background:#009ee3;color:#fff;font-weight:600;font-size:14px;text-align:center;">Single developer license</th><th style="border:3px solid #009ee3;padding:12px 16px;background:#009ee3;color:#fff;font-weight:600;font-size:14px;text-align:center;">Small team license</th><th style="border:3px solid #009ee3;padding:12px 16px;background:#009ee3;color:#fff;font-weight:600;font-size:14px;text-align:center;">Site license</th></tr></thead>
<tbody><tr><td style="border:3px solid #009ee3;padding:12px 16px;font-weight:700;"><a href="https://www.tmssoftware.com/site/tmsallaccess.asp" style="color:#009ee3;text-decoration:underline;">TMS ALL-ACCESS</a></td><td style="border:3px solid #009ee3;padding:12px 16px;text-align:center;font-size:18px;font-weight:700;color:#009ee3;">✓</td><td style="border:3px solid #009ee3;padding:12px 16px;text-align:center;font-size:18px;font-weight:700;color:#009ee3;">✓</td><td style="border:3px solid #009ee3;padding:12px 16px;text-align:center;font-size:18px;color:#999;">/</td></tr><tr><td style="border:3px solid #009ee3;padding:12px 16px;font-weight:700;"><a href="https://www.tmssoftware.com/site/vdsub.asp" style="color:#009ee3;text-decoration:underline;">TMS VCL Subscription</a></td><td style="border:3px solid #009ee3;padding:12px 16px;text-align:center;font-size:18px;font-weight:700;color:#009ee3;">✓</td><td style="border:3px solid #009ee3;padding:12px 16px;text-align:center;font-size:18px;font-weight:700;color:#009ee3;">✓</td><td style="border:3px solid #009ee3;padding:12px 16px;text-align:center;font-size:18px;font-weight:700;color:#009ee3;">✓</td></tr><tr><td style="border:3px solid #009ee3;padding:12px 16px;font-weight:700;"><a href="https://www.tmssoftware.com/site/tmsfncstudio.asp" style="color:#009ee3;text-decoration:underline;">TMS FNC Component Studio</a></td><td style="border:3px solid #009ee3;padding:12px 16px;text-align:center;font-size:18px;font-weight:700;color:#009ee3;">✓</td><td style="border:3px solid #009ee3;padding:12px 16px;text-align:center;font-size:18px;font-weight:700;color:#009ee3;">✓</td><td style="border:3px solid #009ee3;padding:12px 16px;text-align:center;font-size:18px;font-weight:700;color:#009ee3;">✓</td></tr><tr><td style="border:3px solid #009ee3;padding:12px 16px;font-weight:700;"><a href="https://www.tmssoftware.com/site/tmsvcluipack.asp" style="color:#009ee3;text-decoration:underline;">TMS VCL UI Pack</a></td><td style="border:3px solid #009ee3;padding:12px 16px;text-align:center;font-size:18px;font-weight:700;color:#009ee3;">✓</td><td style="border:3px solid #009ee3;padding:12px 16px;text-align:center;font-size:18px;font-weight:700;color:#009ee3;">✓</td><td style="border:3px solid #009ee3;padding:12px 16px;text-align:center;font-size:18px;font-weight:700;color:#009ee3;">✓</td></tr><tr><td style="border:3px solid #009ee3;padding:12px 16px;font-weight:700;"><a href="https://www.tmssoftware.com/site/tmsfncuipack.asp" style="color:#009ee3;text-decoration:underline;">TMS FNC UI Pack</a></td><td style="border:3px solid #009ee3;padding:12px 16px;text-align:center;font-size:18px;font-weight:700;color:#009ee3;">✓</td><td style="border:3px solid #009ee3;padding:12px 16px;text-align:center;font-size:18px;font-weight:700;color:#009ee3;">✓</td><td style="border:3px solid #009ee3;padding:12px 16px;text-align:center;font-size:18px;font-weight:700;color:#009ee3;">✓</td></tr><tr><td style="border:3px solid #009ee3;padding:12px 16px;font-weight:700;"><a href="https://www.tmssoftware.com/site/tmswebcoreintro.asp" style="color:#009ee3;text-decoration:underline;">TMS WEB Core</a></td><td style="border:3px solid #009ee3;padding:12px 16px;text-align:center;font-size:18px;font-weight:700;color:#009ee3;">✓</td><td style="border:3px solid #009ee3;padding:12px 16px;text-align:center;font-size:18px;font-weight:700;color:#009ee3;">✓</td><td style="border:3px solid #009ee3;padding:12px 16px;text-align:center;font-size:18px;font-weight:700;color:#009ee3;">✓</td></tr><tr><td style="border:3px solid #009ee3;padding:12px 16px;font-weight:700;"><a href="https://www.tmssoftware.com/site/tmsfncmaps.asp" style="color:#009ee3;text-decoration:underline;">TMS FNC Maps</a></td><td style="border:3px solid #009ee3;padding:12px 16px;text-align:center;font-size:18px;font-weight:700;color:#009ee3;">✓</td><td style="border:3px solid #009ee3;padding:12px 16px;text-align:center;font-size:18px;font-weight:700;color:#009ee3;">✓</td><td style="border:3px solid #009ee3;padding:12px 16px;text-align:center;font-size:18px;font-weight:700;color:#009ee3;">✓</td></tr></tbody>
</table>
</div>
<h2 style="margin:36px 0 14px;font-size:24px;line-height:1.3;font-weight:600;color:#222;">How to subscribe</h2>
<p style="margin:0 0 16px;font-size:16px;line-height:1.6;color:#333;"><a href="https://www.tmssoftware.com/site/login.asp" style="color:#009ee3;text-decoration:underline;">Log in to your TMS account</a> and open the <b>My Products</b> page. Each product with the subscription option shows two renewal options, both at the same discounted price:</p>
<ul style="margin:0 0 16px;padding-left:24px;font-size:16px;line-height:1.6;color:#333;">
<li style="margin:0 0 6px;">Extend adds one license period. After that, you renew again yourself.</li>
<li style="margin:0 0 6px;">Subscribe adds that period too, and keeps renewing your license automatically after that.</li>
</ul>
<p style="margin:0 0 16px;font-size:16px;line-height:1.6;color:#333;">Click <b>SUBSCRIBE</b> to switch your license over to a subscription, and follow the instructions on the checkout page.</p>
<div role="img" aria-label="The Extend and Subscribe options on the My Products page" style="display:flex;flex-wrap:wrap;gap:24px;border-top:2px solid #eee;border-bottom:2px solid #eee;padding:24px 0;margin:8px 0;color:#333;">
<div style="flex:0 0 auto;display:flex;gap:16px;align-items:flex-start;">
<div style="width:50px;height:50px;flex:none;background:#009ee3;color:#fff;font-weight:700;font-size:15px;display:flex;align-items:center;justify-content:center;">ALL</div>
<div style="font-weight:600;font-size:17px;color:#009ee3;margin-top:3px;white-space:nowrap;">TMS ALL-ACCESS</div>
</div>
<div style="flex:1 1 380px;background:#f4f4f4;border:1px solid #e3e3e3;padding:20px 16px;">
<div style="font-weight:500;font-size:18px;margin:0 0 12px;">Downloads</div>
<div style="display:flex;align-items:center;gap:10px;font-weight:700;font-size:14px;margin-bottom:8px;"><span style="width:22px;height:22px;border:2px solid #c9c9c9;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;color:#bbb;font-size:13px;">↓</span>TMS Dashboard</div>
<div style="font-size:14px;line-height:1.6;">Use the <span style="color:#009ee3;font-weight:700;">TMS Dashboard</span> to manage <b>TMS ALL-ACCESS</b> products.</div>
<div style="margin-top:20px;"><span style="display:inline-block;border:3px solid #009ee3;background:#fff;color:#009ee3;font-weight:600;font-size:14px;letter-spacing:0.04em;padding:11px 28px;white-space:nowrap;">DOWNLOAD</span></div>
<div style="display:flex;margin:20px 0 4px;font-weight:700;font-size:13px;color:#fff;line-height:24px;"><div style="background:#3f7a3f;flex:0 0 50%;padding:0 10px;">DAYS UNTIL EXPIRED</div><div style="background:#5cb85c;flex:1;text-align:right;padding:0 10px;">182</div></div>
<div style="display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:16px;border:4px solid #009ee3;background:#fff;padding:20px 24px;margin-top:14px;"><div style="flex:1 1 220px;min-width:0;"><div style="font-weight:700;font-size:14px;">Add an additional year to your license at a discount!</div><div style="margin-top:10px;"><span style="font-size:28px;font-weight:700;color:#777;text-decoration:line-through;margin-right:22px;">&#128; 1995</span><span style="font-size:28px;font-weight:700;color:#cf5050;">&#128; 695</span></div></div><span style="display:inline-block;border:3px solid #009ee3;background:#fff;color:#009ee3;font-weight:600;font-size:14px;letter-spacing:0.04em;padding:11px 28px;white-space:nowrap;">EXTEND</span></div>
<div style="display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:16px;border:4px solid #009ee3;background:#fff;padding:20px 24px;margin-top:14px;"><div style="flex:1 1 220px;min-width:0;"><div style="font-weight:700;font-size:14px;">Keep your license active!</div><div style="font-size:14px;line-height:1.6;">Your license renews automatically every year.</div><div style="margin-top:10px;"><span style="font-size:28px;font-weight:700;color:#777;text-decoration:line-through;margin-right:22px;">&#128; 1995</span><span style="font-size:28px;font-weight:700;color:#cf5050;">&#128; 695</span><span style="font-size:14px;color:#555;">/year</span></div><div style="font-size:13.5px;line-height:1.6;color:#444;margin-top:12px;">Already on a subscription? No action needed, your license is renewed automatically.</div></div><span style="display:inline-block;border:3px solid #009ee3;background:#fff;color:#009ee3;font-weight:600;font-size:14px;letter-spacing:0.04em;padding:11px 28px;white-space:nowrap;">SUBSCRIBE</span></div>
</div>
</div>
<p style="margin:0 0 16px;font-size:14px;line-height:1.5;color:#777;font-style:italic;">The two renewal options for TMS ALL-ACCESS on the My Products page.</p>
<h2 style="margin:36px 0 14px;font-size:24px;line-height:1.3;font-weight:600;color:#222;">Frequently asked questions</h2>
<h3 style="margin:24px 0 8px;font-size:18px;line-height:1.4;font-weight:700;color:#222;">I already have a subscription. Do I need to do anything?</h3>
<p style="margin:0 0 16px;font-size:16px;line-height:1.6;color:#333;">No. Your license renews automatically.</p>
<h3 style="margin:24px 0 8px;font-size:18px;line-height:1.4;font-weight:700;color:#222;">Can I buy a new license as a subscription?</h3>
<p style="margin:0 0 16px;font-size:16px;line-height:1.6;color:#333;">No. The subscription is only offered when you renew a license you already own.</p>
		
		
		
		
		
		
		
		
		<br><br></P>]]></description>
	</item>
	</channel>
</rss>
