<?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>Fri, 3 Apr 2026 12:09: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 Smart Setup v3.1 brings Delphi 13.1 Arm64EC support to TMS products&#151;and raises the bar for the Delphi ecosystem]]></title>
		<link>https://www.tmssoftware.com/site/blog.asp?post=2468</link>
		<author>Bruno Fierens</author>
		<pubDate>Thu, 2 Apr 2026 12:00:00 +0000</pubDate>
		<description><![CDATA[<P>﻿
		
		
		
		<div><img src="https://www.tmssoftware.com/site/img/blog/smartsetupv3_1.png" style="width: 640px;" alt="TMS Software Delphi  Components "><br></div><div>Keeping development environments current should never be the slowest part of software development. Yet for many Delphi teams, product installation, updates, dependency handling, and onboarding across multiple machines can still be a friction point. That is exactly where TMS Smart Setup changes the experience.<br></div><div><br></div><div>With <a href="https://doc.tmssoftware.com/smartsetup/" target="_blank">TMS Smart Setup v3.1</a>, that experience takes another important step forward: support for the <a href="https://www.embarcadero.com/products/rad-studio/whats-new-in-13-florence" target="_blank">new Delphi 13.1</a> Arm64EC Windows target. This matters not only for customers using TMS products, but also for the broader Delphi community looking to adopt new platform capabilities faster and with less installation overhead.</div><div><br></div><div>TMS Smart Setup is TMS Software&#146;s modern installation and product management solution for Delphi &amp; C++Builder. It combines command-line and GUI-driven workflows, supports automated installs, parallel download and build operations, dependency handling, self-updating, and smart rebuild behavior that only rebuilds what changed.</div><div><br></div><div>Ready now: <b>Arm64EC support through TMS Smart Setup v3.1</b></div><div><br></div><div>TMS Smart Setup v3.1 is available now, and we have already updated:</div><div><br></div><ul><li><a href="https://www.tmssoftware.com/site/tmsfncstudio.asp" target="_blank">All TMS FNC products</a></li><li><a href="https://www.tmssoftware.com/site/flexcel.asp" target="_blank">TMS FlexCel</a></li><li><a href="https://www.tmssoftware.com/site/tmsvcluipack.asp" target="_blank">TMS VCL UI Pack</a></li><li><a href="https://www.tmssoftware.com/site/tmsvclinstrumentationworkshop.asp" target="_blank">TMS VCL Instrumentation Workshop</a></li><li><a href="https://www.tmssoftware.com/site/tmsvclsecuritysystem.asp" target="_blank">TMS VCL Security System</a></li><li><a href="https://www.tmssoftware.com/site/tmsvclpluginframework.asp" target="_blank">TMS VCL Plugin Framework</a></li><li><a href="https://www.tmssoftware.com/site/tmsasync.asp" target="_blank">TMS VCL Async</a></li></ul><div>with support for Delphi 13.1 Arm64EC.</div><div><br><div>What makes this especially significant is not just that support has been added, but how it is delivered. Thanks to TMS Smart Setup, these products now install seamlessly for Delphi 13.1 and are immediately ready for use for the Windows Arm64EC target through the TMS Smart Setup installer.<br>That means less manual intervention, less guesswork, and a much faster path from &#147;new target available&#148; to &#147;productive development environment ready to go.&#148;<br><br><h3>Why this is good news for TMS customers</h3><div>For TMS customers, the biggest win is convenience&#151;but not convenience in a superficial sense. This is convenience that directly translates into faster setup, less maintenance effort, and fewer environment-specific surprises.</div><div><br></div><div>TMS Smart Setup was designed to provide a modern install experience with capabilities such as a single command to download or install a full suite of TMS products, parallel downloads for speed, automatic detection of missing or outdated products, dependency checking, parallel package builds, and smart rebuilds that only rebuild modified packages. It also handles IDE registration and path configuration, and does so without requiring administrator permissions.</div><div><br></div><div>For customers working with many products or multiple Delphi versions, this becomes a major productivity advantage. Instead of treating installation and updates as a repetitive chore, TMS Smart Setup turns them into a streamlined, repeatable process.</div><div><br></div><div>And now, with Arm64EC support in place for Delphi 13.1 across a broad range of TMS product lines, customers can move to the latest target more confidently and with far less friction.</div><div><br></div><h3>Why this is good for the Delphi community in general</h3><div>The impact goes beyond TMS customers.</div><div><br></div><div>Every time a new Delphi target appears, one of the biggest ecosystem challenges is not the compiler itself&#151;it is how quickly libraries, components, and dependencies become easy to install and use on that target. If setup is slow, fragile, or highly manual, adoption slows down. If setup is automated and reliable, adoption accelerates.</div><div><br></div><div>That is why TMS Smart Setup, available as <a href="https://github.com/tmssoftware/smartsetup" target="_blank">open-source project on Github</a>, is meaningful for the wider Delphi community. It helps shorten the gap between new platform support becoming available and developers being able to use real-world component libraries productively.</div><div><br></div><div>In other words, TMS Smart Setup is not only a product installer. It is an ecosystem enabler.</div><div><br></div><div>By making installation faster, more predictable, and easier to automate, it helps Delphi developers spend less time wrestling with configuration and more time building applications. That benefits teams evaluating Delphi 13.1 Arm64EC, consultants maintaining multiple environments, educators setting up labs, and companies standardizing developer workstations.</div><div><br></div><div>Speed and convenience in one all-in-one tool</div><div><br></div><div>TMS Smart Setup stands out as an all-in-one install and product update tool with exceptional speed and convenience.</div><div><br></div><div>Its architecture is built around modern needs:</div><div><br></div><ul><li>Install products quickly</li><li>Update products efficiently</li><li>Automate setup in scripts and CI/CD pipelines</li><li>Manage dependencies automatically</li><li>Rebuild only what is necessary</li><li>Keep environments current with minimal manual work&nbsp;</li></ul><p>This is also an invitation to open-source developers to make the install of your Github hosted projects with just one YAML file compatible with TMS Smart Setup and let users install &amp; update your library in the Delphi IDE with a single command-line execution.<br><br></p><h3>Prefer a GUI? Meet TMS Dashboard</h3><div>For developers who prefer a visual interface, <a href="https://www.tmssoftware.com/site/tmsdashboard.asp" target="_blank">TMS Dashboard</a> provides a GUI on top of the TMS product management experience.</div><div><br></div><div>TMS Dashboard is positioned as a central place to manage TMS Software products. It allows users to install, update, uninstall, and renew licenses, while also making it easy to search for products, videos, blog posts, and support resources. It also includes a News area to stay on top of the latest movements at tmssoftware.com, be it <a href="https://www.youtube.com/user/tmssoftwareTV" target="_blank">videos</a>, <a href="https://support.tmssoftware.com/" target="_blank">support-center</a> entries, blog articles like this.</div><div><br></div><h3>Classic installers will retire</h3><div>If you are still relying on the classic TMS installers, now is the right time to switch to TMS Smart Setup.</div><div><br></div><div>The classic installers will soon retire, and TMS Smart Setup is clearly the forward-looking path: faster, more flexible, easier to automate, and better aligned with modern Delphi development practices.</div><div><br></div><div>This is not just a replacement. It is a significantly better way to manage TMS products.</div></div></div>
		
		
		
		
		
		<br><br></P>]]></description>
	</item>
	<item>
		<title><![CDATA[﻿TMS VCL UI Pack 13.6: ARM, PDF Forms, and Practical VCL Improvements]]></title>
		<link>https://www.tmssoftware.com/site/blog.asp?post=2467</link>
		<author>Bruno Fierens</author>
		<pubDate>Sat, 28 Mar 2026 12:00:00 +0000</pubDate>
		<description><![CDATA[<P>﻿
		
		
		<meta property="og:title" content="TMS VCL UI Pack 13.6: ARM, PDF Forms, and Practical VCL Improvements">
<meta property="og:description" content="Discover the latest updates in TMS VCL UI Pack 13.6, including Windows on ARM and PDF forms.">
<meta property="og:image" content="https://www.tmssoftware.com/site/img/blog/topic_tmsvcluipack13_6.png">
<meta property="og:url" content="https://www.tmssoftware.com/site/blog.asp?post=2467">

		
		
		
		<p><img src="https://www.tmssoftware.com/site/img/blog/tmsvcluipack13_6.png" style="width: 537.224px; height: 293.031px;" alt="TMS Software Delphi  Components tmsvcluipack"><br></p><p><a href="https://www.tmssoftware.com/site/tmsvcluipack.asp" target="_blank">TMS VCL UI Pack</a> keeps evolving, release after release, decade after decade. That long-term work shows up where Delphi &amp; C++Builder developers actually notice it: support for new compiler and platform targets, better integration with evolving Windows capabilities, and small but meaningful additions that remove friction from day-to-day UI development.</p><h3>Highlights in TMS VCL UI Pack 13.6</h3><p><b>The most important additions in this release are:</b></p><ul><li>Support for the Windows on ARM EC platform</li><li>PDF form field generation in TAdvPDFLib</li><li>Color, brush style, and pen style selector support in the parameter controls</li></ul><p><b>Other additions in 13.6 include:</b></p><ul><li>BeginUpdate/EndUpdate in TAdvOfficePager for faster bulk page creation</li><li>AnimationSteps in TAdvOfficePager</li><li>BookMarkMax in TAdvMemo</li><li>Code folding for non-programming languages in TAdvMemo</li><li>ItemAtXY in TAdvSearchList</li><li>AutoDropDown in TAdvSearchEdit</li><li>BorderColorFocused in Curvy Controls</li></ul><p><br></p><h3>Native platform progress: Windows on ARM EC support</h3><p>TMS VCL UI Pack now leverages the <a href="https://blogs.embarcadero.com/announcing-the-availability-of-rad-studio-13-florence-update-1/" target="_blank">Windows on ARM work introduced in Delphi 13.1</a>. Embarcadero added support for building Windows on Arm applications using Arm64EC, which is Microsoft&#146;s interoperability-friendly ARM application model for migrating existing desktop software. The good news for you: with Delphi 13.1, there isn&#39;t anything to do other than adding the Arm64EC target in your project and recompile your app for ARM.&nbsp;</p><p><br></p><h3>PDF form field generation with TAdvPDFLib</h3><p>The second major addition in 13.6 is PDF form field generation.</p><p>This extends the PDF library beyond static document output. You can now generate interactive PDFs with fillable fields directly from Delphi code.<br><br>For developers, this opens up several practical scenarios:</p><ul><li>Generating fillable business forms</li><li>Exporting documents with editable fields</li><li>Pre-filling part of a document while leaving user input areas open</li><li>Building PDF-based workflows without relying on external tools</li></ul><p>Instead of generating a PDF that only looks right, you can now generate one that is interactive as well.</p><p>The new form field generation supports:</p><ul><li>text edit fields</li><li>memo fields</li><li>password fields</li><li>combo boxes</li><li>list boxes</li><li>check boxes</li><li>grouped radio buttons</li></ul><p><br>Basic workflow</p><ul><li>Create the PDF document</li><li>Draw static labels and layout elements through Graphics</li><li>Add interactive controls through FormFields</li><li>Save the result</li></ul><p>Here is a compact example:</p><p></p><pre class="delphi" name="code">procedure TForm1.BtnCreatePdfClick(Sender: TObject);
var
  PDF: TAdvPDFLib;
begin
  PDF := TAdvPDFLib.Create;
  try
    PDF.Header := &#39;&#39;;
    PDF.BeginDocument(&#39;customer-form.pdf&#39;);
    PDF.NewPage;

    PDF.Graphics.DrawText(&#39;Name&#39;, PointF(30, 30));
    PDF.FormFields.AddEdit(&#39;name_field&#39;, RectF(100, 28, 260, 44));

    PDF.Graphics.DrawText(&#39;Email&#39;, PointF(30, 55));
    PDF.FormFields.AddEdit(&#39;email_field&#39;, RectF(100, 53, 260, 69));

    PDF.Graphics.DrawText(&#39;Comments&#39;, PointF(30, 80));
    PDF.FormFields.AddMemo(&#39;comments_field&#39;, RectF(100, 78, 260, 150));

    PDF.EndDocument(True);
  finally
    PDF.Free;
  end;
end;</pre><p></p><p>Here is a slightly richer example with a combo box and a checkbox:</p><p></p><pre class="delphi" name="code">procedure TForm1.BtnCreateSurveyClick(Sender: TObject);
var
  PDF: TAdvPDFLib;
begin
  PDF := TAdvPDFLib.Create;
  try
    PDF.Header := &#39;&#39;;
    PDF.BeginDocument(&#39;survey.pdf&#39;);
    PDF.NewPage;

    PDF.Graphics.DrawText(&#39;Priority&#39;, PointF(30, 30));
    PDF.FormFields.AddComboBox(
      &#39;priority_field&#39;,
      RectF(100, 28, 180, 44),
      [&#39;High&#39;, &#39;Normal&#39;, &#39;Low&#39;]
    );

    PDF.Graphics.DrawText(&#39;Subscribe&#39;, PointF(30, 60));
    PDF.FormFields.AddCheckBox(&#39;subscribe_field&#39;, RectF(100, 58, 116, 74), false);

    PDF.EndDocument(True);
  finally
    PDF.Free;
  end;
end;</pre><p></p><p>This results in:</p><h3><img src="https://www.tmssoftware.com/site/img/blog/advpdflibforms.gif" style="width: 350px;" alt="TMS Software Delphi  Components tmsvcluipack"><br></h3><h3>Parameter controls: built-in color, brush, and pen style selectors</h3><p>The third major addition in 13.6 is the extension of the <a href="https://www.youtube.com/watch?v=MrZ_IFc1oFc" target="_blank">parameter controls</a> (TParamLabel, TParamListBox, TParamCheckListBox, TParamTreeView) with support for:</p><ul><li>Color selection</li><li>Brush style selection</li><li>Pen style selection</li></ul><p>This is especially useful when building compact editors for drawing, reporting, diagrams, styling, or annotation features. The parameter editor that is used at design-time but can also be used at runtime now recognizes the corresponding parameter classes:</p><ul><li>COLOR</li><li>BRUSH</li><li>PEN</li></ul><p>That means the selector UI is built into the control rather than being something you have to wire up manually.</p><p><img src="https://www.tmssoftware.com/site/img/blog/paramcontrolstypes.gif" style="width: 828px;" alt="TMS Software Delphi  Components tmsvcluipack"></p><p><br></p><h3>Faster bulk updates and animation speed control in TAdvOfficePager</h3><p>If you create large numbers of pages dynamically, wrapping those operations in BeginUpdate/EndUpdate for <a href="https://www.tmssoftware.com/site/aop.asp" target="_blank">TAdvOfficePager </a>avoids repeated intermediate updates and speeds up the process.</p><p></p><pre class="delphi" name="code">procedure TForm1.BuildPages;
var
  I: Integer;
begin
  AdvOfficePager1.BeginUpdate;
  try
    for I := 1 to 100 do
      AdvOfficePager1.AddAdvPage.Caption := &#39;Page &#39; + IntToStr(I);
  finally
    AdvOfficePager1.EndUpdate;
  end;
end;</pre><p></p><p>This is exactly the kind of small API addition that helps in real applications with dynamic tabbed interfaces.</p><p>The new AnimationSteps property gives direct control over animation speed of the page tab underlining moving from active to new activated tab.</p><p></p><pre class="delphi" name="code">procedure TForm1.FormCreate(Sender: TObject);
begin
  AdvOfficePager1.AnimationSteps := 4;
end;</pre>That lets you tune the feel of page transitions without needing more invasive customization.<p></p><p><br></p><div><h3>TAdvMemo gets more editor control</h3><div>Two additions were made to <a href="https://www.tmssoftware.com/site/advmemo.asp" target="_blank">TAdvMemo</a>:</div><div><br></div><ul><li>BookMarkMax is now public</li><li>Code folding was extended to non-programming languages</li></ul><div><b>BookMarkMax</b></div><div><br></div><div>This gives you explicit control over the number of bookmarks supported in the editor.<br><br></div><div><pre class="delphi" name="code">procedure TForm1.FormCreate(Sender: TObject);
begin
  AdvMemo1.BookMarkMax := 32;
end;</pre></div><div>Simple, but useful in editors where bookmark count needs to be limited or standardized. Now you can have more bookmarks than the original 10 bookmark limit.</div><div><br></div><div><b>Code folding for non-programming languages</b></div><div><br></div><div>TAdvMemo is often used for more than source code editing. Many applications use it for:</div><div><br></div><ul><li>Configuration files</li><li>Templates</li><li>Structured text</li><li>DSL-like content</li><li>Markup or script-like data</li></ul><div>Extending code folding to non-programming languages makes the control more broadly useful in those scenarios. The key difference between how the TAdvMemoStyler component treats code-folding is that for programming languages versus non-programmaing languages, is that identifiers for code folding in programming languages typically do not contain symbols characters like : , ; , etc.. that delimit code folding section keywords. To create your styler for a non-programming language, just implement an override for the function HasLanguageDelimiters and return false.<br><br><pre class="delphi" name="code">TMyCustomStyler = class(TAdvCustomMemoStyler)
protected
  function HasLanguageDelimiters: boolean; override;
end;</pre>Now you can code-fold on a section delimiter "section:idx" for example.</div><div><br></div><div><h3>Search controls: a little less friction</h3><div>Two search-related controls also get focused additions.</div><div><br></div><div><b>ItemAtXY in TAdvSearchList</b></div><div><br></div><div>This simplifies coordinate-based hit testing in the list.</div><div><br><pre class="delphi" name="code">procedure TForm1.AdvSearchList1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  Idx: Integer;
begin
  Idx := AdvSearchList1.ItemAtXY(X, Y);
  if Idx &gt;= 0 then
    AdvSearchList1.ItemIndex := Idx;
end;</pre></div><div>This is useful for:</div><ul><li>Custom mouse handling</li><li>Context menus</li><li>Drag and drop</li><li>Item-specific interactions<br><br></li></ul><div><b>AutoDropDown in TAdvSearchEdit</b></div><div><br></div><div>This property controls whether the results list opens automatically or not while typing.<br><br></div><div><pre class="delphi" name="code">procedure TForm1.FormCreate(Sender: TObject);
begin
  AdvSearchEdit1.AutoDropDown := True;
end;</pre></div><div>It is a small change, but it gives you more control over how lookup-style UI behave.</div><div><br></div><div><h3>Curvy Controls: BorderColorFocused</h3><div><a href="https://www.tmssoftware.com/site/curvycontrols.asp" target="_blank">Curvy Controls</a> now get a BorderColorFocused property. This applies to controls such as: TCurvyEdit, TCurvyComboBox, TCurvyMemo and other related Curvy input controls. It allows to set a separate border color for when the control is in focused state.</div><div><br></div><div>It improves focus visibility in a way that feels familiar to users coming from modern UI systems. In particular, it mimics the clearer focus border coloring behavior commonly seen in macOS, where input focus is visually explicit and easy to track.</div><div><br></div><div><img src="https://www.tmssoftware.com/site/img/blog/curvyfocusborder.gif" style="width: 301px;" alt="TMS Software Delphi  Components tmsvcluipack"><br></div><div><br></div><h3>Final thoughts</h3><div><a href="https://www.tmssoftware.com/site/tmsvcluipack.asp" target="_blank">TMS VCL UI Pack 13.6</a> continues the 3 decades tradition of evolving with Delphi &amp; C++Builder, the Windows platform, the software eco-system and most importantly with the needs &amp; feedback of thousands of software developers building real-world applications!<br>All this with backwards compatibility at the core of every evolution. We highlighted the most noticeable additions in this new release but of course, the full details on new features, improvements and fixes can be found in the <a href="https://www.tmssoftware.com/site/tmsvcluipack.asp?s=history" target="_blank">version history.</a>&nbsp; If you are new to TMS VCL UI Pack, you can discover this amazing collection of over 600 components via the fully functional and not time-limited trial version. If you purchased TMS VCL UI Pack years ago and want to be current again with the latest capabilities, there is a discount upgrade offer ready for you from the "My Products" page after login on our website.&nbsp;<br><br></div></div></div></div><p>
		
		</p>
		
		
		
		
		
		
		
		
		
		
		
		
		
		<br><br></P>]]></description>
	</item>
	<item>
		<title><![CDATA[﻿The Next Evolution of Charting in Delphi: Multipoint Series]]></title>
		<link>https://www.tmssoftware.com/site/blog.asp?post=2466</link>
		<author>Pieter Scheldeman</author>
		<pubDate>Fri, 27 Mar 2026 12:00:00 +0000</pubDate>
		<description><![CDATA[<P>﻿
		
		
		
		





<p><span style="font-family: Montserrat, sans-serif; font-size: 18px; font-weight: bold;">Intro</span></p>
<p>Stock data is one of the most demanding chart scenarios: dense OHLC bars, date labels that need rotating, interactive panning across months of history, and overlay series like trend lines and moving averages sitting on top. This post shows how <strong><a href="https://www.tmssoftware.com/site/tmsfncchart.asp" target="_blank">TMS FNC Chart</a></strong> handles all of it with a real NVIDIA price history dataset &#151; loading straight from CSV, switching between OHLC and line views, and adding a trend line and 30-day moving average in a few lines of code.</p>
<p><img src="https://tmssoftware.com/site/img/fnc/chart/FNCChartCandle.png" style="width: 828px;" alt="TMS Software Delphi  Components tmsfncchart"><br></p>

<h4>Watch The Video</h4>
<p>Watch the companion walkthrough on YouTube:<br><br><iframe frameborder="0" src="//www.youtube.com/embed/kU8jDPzJVLk" width="640" height="360" class="note-video-clip"></iframe><br></p>
<p><br></p>

<h4>Quick Highlights</h4>
<ul>
<li><p><strong>LoadFromCSVMultiPointData</strong> maps CSV columns to Open, High, Low, and Close in a single call &#151; no manual parsing.</p></li>
<li><p><strong>LoadFromCSVData</strong> pulls just the Close column for the line view, and <code>AddTrendLine</code> / <code>AddMovingAverage</code> add overlays over the same data immediately after.</p></li>
<li><p>Horizontal panning and zoom are enabled with three properties, and a point-based crosshair snaps to the nearest bar automatically.</p></li>
<li><p>The <code>BeforeDrawSerieXValue</code> event suppresses out-of-range date labels that appear when the scroll window extends past the data.</p></li>
</ul>

<h4>Loading OHLC Data from CSV</h4>
<p>The CSV has five columns: Date, Open, High, Low, Close. <code>LoadFromCSVMultiPointData</code> takes the file path, a load options object, and then the column index for each OHLC field followed by the label column. Setting <code>CSVFirstLine := cflFirstLineSkip</code> discards the header row automatically.</p>
<pre class="delphi" name="code">lo := TTMSFNCChartLoadOptions.Create;
lo.CSVDelimiter := &#39;,&#39;;
lo.CSVFirstLine := cflFirstLineSkip;

TMSFNCChart1.LoadFromCSVMultiPointData(STOCKDATAFILE, lo,
  2,   // Open
  3,   // High
  1,   // Low
  4,   // Close
  -1, -1,
  0);  // Label (Date)

TMSFNCChart1.Series[0].ChartType := ctOHLC;
</pre>
<p>After the load, setting <code>ChartType := ctOHLC</code> is the only change needed to render the bars. The same call works for <code>ctCandleStick</code> if you prefer filled bodies.</p>
<p><br></p>

<h4>Interaction: Panning and Zoom</h4>
<p>Six months of daily bars is too much to read at full width. Three properties turn on horizontal-only scaling and panning, and <code>MinX</code> / <code>MaxX</code> set the initial visible window to the full dataset so the scroll range is correct from the start.</p>
<pre class="delphi" name="code">TMSFNCChart1.Interaction := True;
TMSFNCChart1.InteractionOptions.ScaleMode := smHorizontal;
TMSFNCChart1.InteractionOptions.Panning   := True;

TMSFNCChart1.Series[0].AutoXRange := arDisabled;
TMSFNCChart1.Series[0].MinX := 0;
TMSFNCChart1.Series[0].MaxX := TMSFNCChart1.Series[0].Points.Count - 1;
</pre>
<p>A point-based crosshair snaps to the nearest bar on hover, showing the exact OHLC values without the crosshair drifting between bars.</p>
<pre class="delphi" name="code">TMSFNCChart1.Crosshair.Visible := True;
TMSFNCChart1.Crosshair.Modes   := [ccmPointBased];
</pre>
<p><span style="background-color: #eef6ff; border-left: 4px solid #2492d1; padding: 6px 10px; display: inline-block;"><strong>Highlight:</strong> <code>smHorizontal</code> locks vertical scale while panning, which is exactly what you want for stock charts &#151; the Y axis stays fixed to the full price range while you scroll through time.</span></p>
<p><br></p>

<h4>Line View: Trend Line and Moving Average</h4>
<p>The second button reloads the same CSV using <code>LoadFromCSVData</code>, pulling only the Close column. <code>AddTrendLine</code> and <code>AddMovingAverage</code> are then called over the full point range and each returns a <code>TTMSFNCChartSerie</code> that can be styled like any other series.</p>
<pre class="delphi" name="code">TMSFNCChart1.LoadFromCSVData(STOCKDATAFILE, lo, [4], -1, 0);

TMSFNCChart1.AddTrendLine(0, 0, TMSFNCChart1.Series[0].Points.Count - 1);
TMSFNCChart1.AddMovingAverage(0, 0, TMSFNCChart1.Series[0].Points.Count - 1, 30);

TMSFNCChart1.Series[1].Stroke.Color := gcRed;
TMSFNCChart1.Series[1].Stroke.Width := 3;

TMSFNCChart1.Series[2].Stroke.Color := gcBlue;
TMSFNCChart1.Series[2].Stroke.Width := 3;
</pre>
<p>The trend line (series index 1) is drawn in red, and the 30-day moving average (series index 2) in blue. Both get <code>AutoXRange := arDisabled</code> and matching <code>MinX</code> / <code>MaxX</code> so they align correctly with the price series during pan and zoom.</p>
<p><span style="background-color: #eef6ff; border-left: 4px solid #2492d1; padding: 6px 10px; display: inline-block;"><strong>Highlight:</strong> <code>AddTrendLine</code> and <code>AddMovingAverage</code> append new series to the chart and return them directly. No separate component, no manual calculation &#151; just style the result and move on.</span></p>
<p><br></p>

<h4>Suppressing Out-of-Range X Labels</h4>
<p>When <code>AutoXRange</code> is disabled and the chart draws axis labels beyond the data range, labels with invalid indices appear. The <code>BeforeDrawSerieXValue</code> event catches them before they render.</p>
<pre class="delphi" name="code">procedure TForm1.TMSFNCChart1BeforeDrawSerieXValue(Sender: TObject;
  AGraphics: TTMSFNCGraphics; ASerie: TTMSFNCChartSerie;
  APosition: TTMSFNCChartXAxisPosition;
  var ADrawValue: TTMSFNCChartDrawXYValue; var ADefaultDraw: Boolean);
begin
  if ADrawValue.Value &lt; 0 then
    ADefaultDraw := False;

  if ADrawValue.Value &gt;= ASerie.Points.Count then
    ADefaultDraw := False;
end;
</pre>
<p>Setting <code>ADefaultDraw := False</code> skips the draw for that tick entirely, leaving the axis clean at both ends of the scroll range.</p>
<p><br></p>

<h4>Conclusion</h4>
<p><a href="https://www.tmssoftware.com/site/tmsfncchart.asp" target="_blank">TMS FNC Chart</a> reduces a real-world stock charting scenario to straightforward Delphi code: one call to load OHLC data from CSV, three properties for interactive panning, and two calls to add trend and moving average overlays. The same series model and the same <code>MinX</code> / <code>MaxX</code> scroll pattern apply across both chart types, so switching between the OHLC view and the close-price line view is a matter of reloading the data rather than rebuilding the chart.</p>

		
		
		
		<br><br></P>]]></description>
	</item>
	<item>
		<title><![CDATA[﻿The Next Evolution of Charting in Delphi: Data Binding]]></title>
		<link>https://www.tmssoftware.com/site/blog.asp?post=2465</link>
		<author>Pieter Scheldeman</author>
		<pubDate>Fri, 27 Mar 2026 12:00:00 +0000</pubDate>
		<description><![CDATA[<P>﻿
		
		
		
		




		<p><span style="font-family: Montserrat, sans-serif; font-size: 18px; font-weight: bold;">Intro</span></p>
<p>Charts that pull live data from a database are far more useful than charts that are fed hardcoded arrays. With <strong><a href="https://www.tmssoftware.com/site/tmsfncchart.asp" target="_blank">TMS FNC Chart</a></strong>, the <strong>TTMSFNCChartDatabaseAdapter</strong> bridges your dataset and your chart in just a few steps: point it at a DataSource, mark which field is the X label, configure each series as it arrives, and activate it. From that point, every dataset column becomes a chart series automatically.</p>
<p><img src="data:image/png;base64,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" style="width: 100%;" data-filename="image.png" alt="TMS Software Delphi  Components tmsfncchart"><br></p>

<h4>Watch The Video</h4>
<p>Watch the companion walkthrough on YouTube:<br><br><iframe frameborder="0" src="//www.youtube.com/embed/F1kTrW87iBQ" width="640" height="360" class="note-video-clip"></iframe><br></p>
<p><br></p>

<h4>Quick Highlights</h4>
<ul>
<li><p>Drop a <strong>TTMSFNCChartDatabaseAdapter</strong> on the form, assign its <code>Source.DataSource</code>, and set <code>Active := True</code> to have the chart populated automatically from a dataset.</p></li>
<li><p>Use the <strong>OnSetFieldValueType</strong> event to mark the string field as <code>cvtXLabel</code>, so it drives the X-axis labels instead of being treated as a numeric value.</p></li>
<li><p>Use the <strong>OnFieldsToSeries</strong> event to configure each series as it is created from a dataset field, keeping series setup in one reusable procedure.</p></li>
<li><p>Connect a <strong>TTMSFNCDataGrid</strong> to the same <code>DataSource</code> to show the raw data and the chart side by side with no extra code.</p></li>
</ul>
<p><br></p>

<h4>The Problem With Manual Point Loading</h4>
<p>The previous videos in this series populated the chart by calling <code>AddPoint</code> in a loop. That works well for static or computed data, but it breaks down as soon as the data lives in a database. You would have to iterate the dataset yourself, match fields to series, handle the label column separately, and re-run the whole loop whenever the data changes. The <strong>database adapter</strong> exists to replace all of that with a declarative connection.</p>
<p>The component model stays the same. There is still a <code>TTMSFNCChart</code> on the form, still a series collection, and still the same per-series properties for chart type, markers, and Y range. The difference is that the adapter creates and fills the series from the dataset fields rather than from code you write manually.</p>
<p><span style="background-color: #eef6ff; border-left: 4px solid #2492d1; padding: 6px 10px; display: inline-block;"><strong>Highlight:</strong> The database adapter does not replace the series model. It drives it. Everything you already know about configuring a series still applies, just moved into an event rather than a loop.</span></p>
<p><br></p>

<h4>Building the Dataset</h4>
<p>For this demo, the data is a <code>TClientDataSet</code> built at runtime: a <code>Month</code> string field and three numeric fields, <code>Electronics</code>, <code>Clothing</code>, and <code>Food</code>, each holding 12 monthly revenue values. The same structure would apply to any real dataset coming from a database, a REST API response marshalled into a client dataset, or a query result.</p>
<pre class="delphi" name="code">procedure TFormDataBinding.BuildDataSet;
var
  I: Integer;
begin
  ClientDataSet1.FieldDefs.Add(&#39;Month&#39;, ftString, 20);
  ClientDataSet1.FieldDefs.Add(&#39;Electronics&#39;, ftFloat);
  ClientDataSet1.FieldDefs.Add(&#39;Clothing&#39;, ftFloat);
  ClientDataSet1.FieldDefs.Add(&#39;Food&#39;, ftFloat);
  ClientDataSet1.CreateDataSet;

  for I := 0 to 11 do
  begin
    ClientDataSet1.Append;
    ClientDataSet1.FieldByName(&#39;Month&#39;).AsString      := MonthNames[I];
    ClientDataSet1.FieldByName(&#39;Electronics&#39;).AsFloat := ElectronicsData[I];
    ClientDataSet1.FieldByName(&#39;Clothing&#39;).AsFloat    := ClothingData[I];
    ClientDataSet1.FieldByName(&#39;Food&#39;).AsFloat        := FoodData[I];
    ClientDataSet1.Post;
  end;

  ClientDataSet1.FieldByName(&#39;Month&#39;).ReadOnly := True;
  ClientDataSet1.First;
end;
</pre>
<p>Making the <code>Month</code> field read-only is a small but useful detail. It signals to the grid adapter that the field is a label column and prevents accidental edits to what is essentially a key.</p>
<p><br></p>

<h4>Activating the Adapter</h4>
<p>The connection is a two-step process: assign the <code>DataSource</code> and set <code>Active := True</code>. The adapter then reads the fields, creates one series per numeric column, fires <strong>OnSetFieldValueType</strong> for each field so you can classify it, fires <strong>OnFieldsToSeries</strong> for each series so you can configure it, and fills the points. Disconnecting is the reverse: set <code>Active := False</code>, clear the <code>DataSource</code> reference, and clear the chart.</p>
<pre class="delphi" name="code">procedure TFormDataBinding.BtnConnectClick(Sender: TObject);
begin
  if not TMSFNCChartDatabaseAdapter1.Active then
  begin
    if not ClientDataSet1.Active then
    begin
      BuildDataSet;
      ConfigureChart;
    end;
    TMSFNCChartDatabaseAdapter1.Source.DataSource := DataSource1;
    TMSFNCChartDatabaseAdapter1.Active := True;
    BtnConnect.Text := &#39;Disconnect&#39;;
  end
  else
  begin
    TMSFNCChartDatabaseAdapter1.Active := False;
    TMSFNCChartDatabaseAdapter1.Source.DataSource := nil;
    TMSFNCChart1.Clear;
    ConfigureChart;
    BtnConnect.Text := &#39;Connect&#39;;
  end;
end;
</pre>
<p>Notice that <code>ConfigureChart</code> runs before activation, not after. The chart shell, title, legend, axis positions, and margins are set up independently of the data. The adapter then fills in the series on top of that already-configured shell.</p>
<p><br></p>

<h4>Classifying Fields With OnSetFieldValueType</h4>
<p>The adapter cannot know which field is a label and which fields are numeric values without some guidance. That is what <strong>OnSetFieldValueType</strong> is for. It fires once per field. For any field whose name matches the label column, set <code>AValueType</code> to <code>cvtXLabel</code>. Every other field defaults to a Y value and becomes a series.</p>
<pre class="delphi" name="code">procedure TFormDataBinding.TMSFNCChartDatabaseAdapter1SetFieldValueType(
  Sender: TObject; AFieldName: string; AField: TField;
  var AValueType: TTMSFNCChartPointValueType);
begin
  if AFieldName = &#39;Month&#39; then
    AValueType := cvtXLabel;
end;
</pre>
<p>That single line is the only place where the data model is described to the chart. If your dataset has a date field for the X axis instead of a string, the same event applies: match the field name and assign the appropriate value type.</p>
<p><span style="background-color: #eef6ff; border-left: 4px solid #2492d1; padding: 6px 10px; display: inline-block;"><strong>Highlight:</strong> <code>OnSetFieldValueType</code> is the one place where data semantics are communicated to the chart. Keep it simple: match the field name and set the type. Everything else follows automatically.</span></p>
<p><br></p>

<h4>Configuring Each Series With OnFieldsToSeries</h4>
<p>Once the adapter knows which fields are Y values, it creates a series for each one and fires <strong>OnFieldsToSeries</strong>. This is where series-level configuration belongs: chart type, mode, Y range behavior, axis positions, marker visibility, stroke width, and label visibility. A shared <code>ConfigureSerie</code> procedure handles all of that and is called from the event, passing the series and a flag indicating whether it is the first one in the collection.</p>
<pre class="delphi" name="code">procedure TFormDataBinding.TMSFNCChartDatabaseAdapter1FieldsToSeries(
  Sender: TObject; AFields: TFields; ASeries: TTMSFNCChartSerie);
begin
  ConfigureSerie(ASeries, ASeries.Index = 0);
end;
</pre>
<p>The first-series flag matters because only the first series should render the X and Y axis labels. Subsequent series share the same axis but should not repeat the tick marks and titles, otherwise the axes draw on top of each other.</p>
<pre class="delphi" name="code">procedure TFormDataBinding.ConfigureSerie(ASerie: TTMSFNCChartSerie;
  AIsFirst: Boolean);
begin
  ASerie.Mode := smStatistical;
  ASerie.AutoXRange := arEnabled;
  ASerie.AutoYRange := arCommonZeroBased;
  ASerie.MaxYOffsetPercentage := 10;
  ASerie.XValues.AutoUnits := False;
  ASerie.XValues.MajorUnit := 1;
  ASerie.XValues.Title.Text := &#39;Month&#39;;
  ASerie.YValues.Title.Text := &#39;Revenue (K)&#39;;
  ASerie.XGrid.Visible := False;
  ASerie.YGrid.Visible := True;
  ASerie.Labels.Visible := False; // 36 labels (12 months x 3 series) overlap

  if AIsFirst then
  begin
    ASerie.XValues.Positions := [xpBottom];
    ASerie.YValues.Positions := [ypLeft];
  end
  else
  begin
    ASerie.XValues.Positions := [];
    ASerie.YValues.Positions := [];
  end;

  case FChartMode of
    cmBar:
    begin
      ASerie.ChartType := ctBar;
      ASerie.Bar.Width := 36;
      ASerie.Bar.Spacing := 10;
      ASerie.Markers.Visible := False;
      ASerie.Stroke.Width := 1;
      ASerie.XValues.Angle := -55;
    end;
    cmLine:
    begin
      ASerie.ChartType := ctXYLine;
      ASerie.Markers.Visible := True;
      ASerie.Markers.Width := 8;
      ASerie.Markers.Height := 8;
      ASerie.Stroke.Width := 3;
      ASerie.XValues.Angle := -45;
    end;
  end;
end;
</pre>
<p>A few things are worth noting here. <code>arCommonZeroBased</code> keeps all three series on a shared Y scale that starts at zero, which is essential for a fair comparison between categories. <code>smStatistical</code> distributes points as categories rather than as mathematically scaled X coordinates. And <code>Labels.Visible := False</code> is a deliberate choice: with 12 months across 3 series, 36 labels would overlap and make the chart unreadable.</p><p><br></p>

<h4><span style="color: inherit;">Conclusion</span></h4>
<p>Database binding in <a href="https://www.tmssoftware.com/site/tmsfncchart.asp" target="_blank">TMS FNC Chart</a> follows a clear pattern: configure the chart shell once, let the <strong>TTMSFNCChartDatabaseAdapter</strong> create and fill the series, use <strong>OnSetFieldValueType</strong> to mark the label column, and use <strong>OnFieldsToSeries</strong> to apply per-series styling as each one arrives. After that, switching chart types is a property pass over the existing series, and a side-by-side grid is just a second adapter pointing at the same DataSource. The result is a chart that stays connected to real data with very little glue code between them.</p>






		
		
		
		<br><br></P>]]></description>
	</item>
	<item>
		<title><![CDATA[﻿TMS Custom Consultancy Projects]]></title>
		<link>https://www.tmssoftware.com/site/blog.asp?post=2460</link>
		<author>Aaron Decramer</author>
		<pubDate>Thu, 26 Mar 2026 12:00:00 +0000</pubDate>
		<description><![CDATA[<P>﻿
		
		
		
		
		
		
		
		
		
		
		
		
		
		<p>Every project starts with an idea, but turning that idea into a working software solution often takes more time and resources than planned. That&#146;s where our custom consultancy services come in.&nbsp;<br><br>At TMS Software, we collaborate closely with your development team to design and deliver tailor-made solutions that fit your exact requirements. You can ask us to extend one of our existing components or to create a completely new application built specifically for your project.</p><p></p><p></p><p></p><p><img src="https://www.tmssoftware.com/site/img/blog/CustomConsulting_email_banner.png" style="width: 829px;" alt="TMS Software Delphi  Components "></p><p><br></p><h3>Why choose TMS custom consultancy?
</h3><p>When you work with TMS Software, you collaborate directly with the engineers behind the frameworks and components you already use. That means you gain:</p><ol><li><b>Direct access to deep technical expertise</b>.<br>Our engineers know the Delphi and TMS component ecosystem inside out, ensuring new features integrate smoothly and efficiently into your existing projects.</li><li><b>Solutions that match your workflow</b>.
<br>Off-the-shelf tools rarely cover every need. In a consultancy project, you define the requirements, from new features and custom interfaces to specific integrations for your environment.
</li><li><b>
Proven cross-platform experience</b>.
<br>We&#146;ve built components and applications for Windows, macOS, iOS, Android, Linux, Web, Raspberry Pi, REST APIs, and Excel integration. Our decades of experience ensure your solution performs reliably everywhere.</li><li><b>Faster delivery and lower maintenance</b>.
<br>Instead of dedicating weeks of internal development time, rely on our team to build your feature correctly from the start, saving time and reducing future maintenance.</li><li><b>Smooth web integration and backend connectivity.</b><br>From REST and GraphQL APIs to Delphi web client apps and backend data exchange, our team handles complex communication and web connectivity with ease.
<br><br></li></ol><p></p><h3>Real-world collaborations
</h3>Recent consultancy projects show how effective this partnership can be.<br><br><p></p><div><div style=""><h4>GeoTIFF Support in TMS FNC Maps for Delphi</h4><img src="https://www.tmssoftware.com/site/img/blog/tmsfncmaps_openlayers_geotiff.png" alt="TMS Software Delphi  Components " style="width: 651.875px;"><br><br></div><div style=""><div><div style=""><span style="font-size: 14px;">In one project, we added <b>GeoTIFF layer support</b> for a customer to the <b>TTMSFNCOpenLayers</b> component in <b>TMS FNC Maps</b>.</span></div><div style=""><span style="font-size: 14px;"><br></span></div><div style=""><span style="font-size: 14px;">Thanks to this improvement, Delphi developers can now display and analyze geospatial raster data directly in their applications. This opens the door to using satellite imagery and other map data inside their own projects.</span></div><br></div></div><div style=""><div><a href="https://tmssoftware.com/site/blog.asp?post=2427" target="_blank" style="background-color: white; font-family: sans-serif;">Read more here</a></div><div><br><br></div><h4>Interactive PDF Form Fields in TTMSFNCPDFLib</h4><div><img src="https://www.tmssoftware.com/site/img/blog/tmsfncpdflibformfields1.png" class="note-float-left" alt="TMS Software Delphi  Components " style="width: 203.712px; float: left;"></div><br><div>Another customer worked with us to extend&nbsp;<span style="font-weight: 700;">TTMSFNCPDFLib</span>&nbsp;in&nbsp;<a href="https://www.tmssoftware.com/site/tmsfnccore.asp" target="_blank" style="background-color: white; font-family: sans-serif;">TMS FNC Core</a>. We added support for interactive PDF form fields, allowing developers to build fillable PDF documents for both&nbsp;<span style="font-weight: 700;">Windows</span>&nbsp;and&nbsp;<span style="font-weight: 700;">Linux</span>.</div><div><br></div><div>With these features, users can type data directly into a PDF, making it easier to create dynamic and interactive document workflows. <br><br><a href="https://www.tmssoftware.com/site/blog.asp?post=2431" target="_blank">Read more here</a><span style="font-size: 14px;"></span><br><br><br><br></div><div><br></div><div><br></div><div><br></div><div><br>These collaborations not only achieved our clients&#146; goals but also enriched the TMS component ecosystem for others. Depending on your agreement, your project can remain proprietary or be shared with the wider Delphi community.
<br></div><div><br></div><div><br><h3>Ready to explore your next custom software project?</h3>Do you have a feature, component, or full application in mind? Our consultancy team bridges the gap between concept and production-ready code. With deep technical insight and a forward-thinking approach, we help you turn your ideas into high-quality, lasting software.<br><br></div><div>Contact us at <a href="mailto:sales@tmssoftware.com" target="_blank">sales@tmssoftware.com</a> and let&#146;s create something exceptional together.</div><br><p><br></p><p><br><br></p></div><div style=""><div style=""><br></div><div style=""><br></div><div style=""><br></div></div></div><h3><br></h3><p><br></p><p><br></p><div><br></div>
		
		
		
		
		
		
		
		
		
		
		
		
		<p></p>
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		<p></p><p></p><p></p>
		
		
		
		
		
		
		
		
		
		
		
		
		
		<br><br></P>]]></description>
	</item>
	<item>
		<title><![CDATA[﻿Simplify Mapping Across Platforms with TMS FNC Maps]]></title>
		<link>https://www.tmssoftware.com/site/blog.asp?post=2464</link>
		<author>Aaron Decramer</author>
		<pubDate>Mon, 23 Mar 2026 12:00:00 +0000</pubDate>
		<description><![CDATA[<P>﻿
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		<p>What if you could build mapping applications that are completely free from provider limitations? With <a href="https://www.tmssoftware.com/site/tmsfncmaps.asp" target="_blank">TMS FNC Maps</a>, you can. This flexible, cross-platform component gives you the freedom to integrate, mix, and switch between the world&#146;s leading mapping services with zero code changes.

          From <b>Google Maps</b> and <b>Apple Maps</b> to<b> OpenStreetMap</b>, <b>Azure Maps</b>, <b>Here Maps</b>, <b>Leaflet</b>, <b>OpenLayers,</b> <b>TomTom</b>, <b>GeoApify</b>, <b>OpenRouteService</b>, and <b>MapBox</b>, <a href="https://www.tmssoftware.com/site/tmsfncmaps.asp" target="_blank">TMS FNC Maps</a> puts all your favorite mapping technologies within reach.&nbsp;</p><p></p><div><p><img src="https://www.tmssoftware.com/site/img/blog/blogpost_fnc_maps_services_providers.png" style="width: 829px;" alt="TMS Software Delphi  Components "><span style="font-size: 14px;"><br></span></p><p><span style="font-size: 14px;"><br></span></p><h3>One component, unlimited possibilities</h3><p>Develop once and run anywhere. Whether you are creating a <b>VCL</b>, <b>FMX</b>, or <b>TMS WEB Cor</b>e application, <a href="https://www.tmssoftware.com/site/tmsfncmaps.asp" target="_blank">TMS FNC Maps</a> works seamlessly across all platforms. You can start coding on Windows, continue on macOS or Linux, or deploy it to the web using the same code and the same component.

Its real strength is the ability to combine the best features of different providers. <br><br>For example:</p><ul><li>Use route directions from Google Maps together with the elegant visual design of Apple Maps</li><li>Display OpenStreetMap tiles enriched by traffic data from Azure Maps</li><li>Overlay TomTom traffic information on MapBox satellite imagery</li><li>Combine Here Maps toll cost calculations with OpenLayers interactive polygons for route planning</li><li>Blend Leaflet markers with GeoApify geocoding for precise location search<br><br></li></ul><p>With <a href="https://www.tmssoftware.com/site/tmsfncmaps.asp" target="_blank">TMS FNC Maps</a>, you can shape the user experience exactly the way you want by freely mixing services and capabilities.
<br><br></p><h3>Works everywhere, even on Raspberry Pi</h3><div>
TMS FNC Maps can also run perfectly on a Raspberry Pi. Thanks to the powerful TMS Miletus Framework, you can now bring mapping functionality to your own Pi-based projects.
<br><br>TMS Miletus, part of <a href="https://www.tmssoftware.com/site/tmswebcore.asp" target="_blank">TMS WEB Core</a>, makes it possible to create Delphi-based desktop applications that run directly on the Raspberry Pi. Even better, these applications can access connected hardware devices, giving you endless possibilities for creative and interactive projects that combine software and electronics.
</div><div><br></div><div>
Whether you&#146;re building a home automation dashboard, a small-scale navigation system, or an educational project, TMS FNC Maps and TMS Miletus provide the flexibility you need to make it happen.<br><br>Want to explore TMS Miletus in detail? Check out more information&nbsp;<a href="https://www.tmssoftware.com/site/blog.asp?post=843" target="_blank">here</a>.</div><div><br></div></div><div><div><span style="font-size: 14px;"><br></span></div><h3>Why Developers Love It</h3><ul><li><span style="font-size: 14px;">Instant switching between multiple map providers
</span></li><li><span style="font-size: 14px;">
Unified API across all supported frameworks
</span></li><li><span style="font-size: 14px;">
Code once and deploy to desktop, web, mobile, or embedded apps
</span></li><li><span style="font-size: 14px;">
Freedom to combine features from any mapping service
</span></li><li><span style="font-size: 14px;">
Advanced customization with layered interactivity and thematic control</span></li></ul><p><br></p><h3>Ready to Explore?</h3>An absolute must-see for anyone interested in mapping with Delphi is the video series &#147;<span style="font-weight: 700;">Maps with Delphi using TMS FNC Maps</span>&#148; by <a href="https://www.youtube.com/@code4delphi/featured" target="_blank">Code4Delphi</a>.&nbsp;</div><div style="font-family: sans-serif; font-size: 14px; font-weight: 400;"><br></div><div style="font-family: sans-serif; font-size: 14px; font-weight: 400;">In this extensive series created by C&#233;sar Cardoso, you will learn how to work with maps in Delphi using the TMS FNC Maps component. The videos include practical examples, covering everything from installation and initial setup to selecting map services, adding markers, retrieving coordinates, handling mouse events, creating routes, and exploring advanced component features.</div><div style="font-family: sans-serif; font-size: 14px; font-weight: 400;"><br></div><div style="font-family: sans-serif; font-size: 14px; font-weight: 400;">The videos are available in Portuguese with English dubbing.&nbsp;</div><div style="font-family: sans-serif; font-size: 14px; font-weight: 400;"><br></div><div style="font-family: sans-serif; font-size: 14px; font-weight: 400;">Watch the full playlist here:<div><iframe width="560" height="315" src="https://www.youtube.com/embed/videoseries?si=xLpnSDyp632K-cL1&amp;list=PLp3eFyNKVPpuEsDDCP9hDuRZ97Ho_NDt6" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe></div></div><div><span style="font-size: 14px;"><hr>Discover how <b>TMS FNC Maps</b> helps you go beyond the limits of a single mapping provider.
Try it today and see how easily you can switch, integrate, and innovate.
<b>TMS FNC Maps</b> is available starting at 240 EUR.<br>&nbsp;<br>Learn more about <b>TMS FNC Maps</b> and </span><a href="https://www.tmssoftware.com/site/tmsfncmaps.asp" target="_blank">get started here</a>.</div><div><br></div>
		
		
		
		
		
		
		<p></p>
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		<br><br></P>]]></description>
	</item>
	<item>
		<title><![CDATA[﻿The Next Evolution of Charting in Delphi: Look & Feel]]></title>
		<link>https://www.tmssoftware.com/site/blog.asp?post=2463</link>
		<author>Pieter Scheldeman</author>
		<pubDate>Wed, 18 Mar 2026 12:00:00 +0000</pubDate>
		<description><![CDATA[<P>﻿
		
		
		<p><span style="font-family: Montserrat, sans-serif; font-size: 18px; font-weight: bold;">Intro</span></p>
<p>Great charts do more than display numbers, they shape how users experience your application. With <strong><a href="https://www.tmssoftware.com/site/tmsfncchart.asp" target="_blank">TMS FNC Chart</a></strong>, you can turn a default chart into a polished, brand-ready visual that feels built for your product, from cleaner legends and sharper axes to custom color schemes, markers, animation, and 3D effects.&nbsp;</p>
<p><img src="https://tmssoftware.com/site/img/fnc/chart/FNCChartArea.png" style="width: 828px;" alt="TMS Software Delphi  Components tmsfncchart"><br></p>

<h4>Watch The Video</h4>
<p>Watch the companion walkthrough on YouTube:<br><br><iframe frameborder="0" src="//www.youtube.com/embed/uWDNA2HOalQ" width="640" height="360" class="note-video-clip"></iframe><br></p>
<p><br></p>

<h4>Quick Highlights</h4>
<ul>
<li><p>Use the <strong>Object Inspector</strong> or the <strong>built-in chart editor</strong> to restyle the chart shell, legend, title, axes, and series.</p></li>
<li><p>Switch between the built-in <strong>Excel-compatible color scheme</strong> and your own <strong>custom color list</strong> through <code>Appearance.ColorScheme</code>.</p></li>
<li><p>Build a mixed chart with an <strong>area series</strong> and a <strong>bar series</strong>, then refine it with labels, markers, gradients, and a shared <strong>zero-based Y range</strong>.</p></li>
<li><p>Add runtime polish with <strong>threshold-based point coloring</strong>, <strong>bitmap markers</strong>, <strong>animation</strong>, <strong>3D</strong>, and <strong>pie-slice emphasis</strong>.</p></li>
</ul>
<p><br></p>

<h4>Start in the Designer, Not in Code</h4>
<p>A practical way to begin is with a default chart dropped on a form, then work outward from the <strong>chart shell</strong> before fine-tuning the series. The <strong>Object Inspector</strong> exposes the expected property groups, such as <code>Appearance</code>, <code>Legend</code>, <code>Title</code>, and the <code>Series</code> collection. Double-clicking the chart opens the <strong>design-time editor</strong>, which is the faster way to discover the visual model of the component.</p>
<p>That editor groups styling into the same areas you care about when polishing a chart: <strong>chart type</strong>, <strong>appearance</strong>, <strong>legend</strong>, <strong>title</strong>, <strong>X-axis</strong>, <strong>Y-axis</strong>, and <strong>series</strong>. You can move the legend, restyle its background and font, place the title at the top or bottom, and position axes at the bottom, top, center, left, or right. Duplicate center axes are especially useful when you want a more analytical or dashboard-like look instead of the standard edge-bound layout.</p>
<p><span style="background-color: #eef6ff; border-left: 4px solid #2492d1; padding: 6px 10px; display: inline-block;"><strong>Highlight:</strong> The design-time editor is not just a convenience. It is the fastest way to find the right visual direction before you lock anything into source code.</span></p>
<p><img src="https://tmssoftware.com/site/img/fnc/chart/FNCChartEdiror.png" style="width: 100%;" alt="TMS Software Delphi  Components tmsfncchart"><br></p>

<h4>Color Schemes, Backgrounds, and the Chart Shell</h4>
<p>A useful distinction is the difference between styling a single series and styling the chart as a <strong>system</strong>. That starts with the <strong>chart shell</strong> itself. The chart background can be a plain color, a gradient, or even a texture. Stroke color and opacity are adjusted from the same editor, so the outer frame of the chart can be subtle or intentionally visible depending on the application.</p>
<p>Color handling is also broader than setting one fill color at a time. Use <code>Appearance.ColorScheme</code> to switch between the built-in <strong>Excel-compatible palette</strong> and a <strong>custom color list</strong>. That matters because the palette is reused automatically as series are added, and the same list also drives pie colors. In other words, <strong>color scheme selection</strong> becomes part of the chart configuration, not an afterthought applied series by series.</p>
<p><span style="background-color: #eef6ff; border-left: 4px solid #2492d1; padding: 6px 10px; display: inline-block;"><strong>Highlight:</strong> Picking a color scheme first gives every later series a coherent default look, which is far easier to maintain than manually coloring every chart variant.</span></p>
<p>Once you have a look you like, the chart can also persist that styling as settings. This is especially useful when you want to ship a default theme, reload a saved dashboard layout, or let users tweak the appearance and store it for the next session.</p>
<pre class="delphi" name="code">procedure TFormLookAndFeel.SaveAndRestoreChartSettings;
begin
  TMSFNCChart1.SaveSettingsToFile();

  // Later, or in a new session:
  TMSFNCChart1.LoadSettingsFromFile();
end;
</pre>
<p><br></p>

<h4>Building the Sales Chart Programmatically</h4>
<p>Once the chart shell is in place, a mixed chart with an <strong>area series</strong> for monthly sales and a <strong>bar series</strong> for profit percentage is a good example of how the styling model becomes practical. The <code>LegendText</code> is set per series, the X-axis is constrained to the 12 months of the year, and the Y-axis is configured as a <strong>common zero-based range</strong> so both series share a clean baseline.</p>
<p>This setup also shows an important distinction between chart modes. For business data like monthly sales, <code>smStatistical</code> is the right fit because points are distributed as categories rather than as mathematically scaled X coordinates. On top of that, the area series gets a <strong>gradient fill</strong> and border styling, while the bar series shows <strong>labels</strong> and <strong>markers</strong>.</p>
<pre class="delphi" name="code">procedure TFormLookAndFeel.BuildSalesChart(const ASales, AProfit: array of Double);
var
  I: Integer;
  SalesSerie: TTMSFNCChartSerie;
  ProfitSerie: TTMSFNCChartSerie;
begin
  TMSFNCChart1.BeginUpdate;
  try
    TMSFNCChart1.Series.Clear;

    SalesSerie := TMSFNCChart1.Series.Add;
    SalesSerie.LegendText := &#39;Month sales&#39;;
    SalesSerie.ChartType := ctArea;
    SalesSerie.Mode := smStatistical;
    SalesSerie.AutoYRange := arCommonZeroBased;

    ProfitSerie := TMSFNCChart1.Series.Add;
    ProfitSerie.LegendText := &#39;Profit %&#39;;
    ProfitSerie.ChartType := ctBar;
    ProfitSerie.Mode := smStatistical;
    ProfitSerie.AutoYRange := arCommonZeroBased;
    ProfitSerie.Labels.Visible := True;
    ProfitSerie.Markers.Visible := True;

    for I := 0 to 11 do
    begin
      SalesSerie.AddPoint(ASales[I], FormatSettings.LongMonthNames[I + 1]);
      ProfitSerie.AddPoint(AProfit[I], FormatSettings.LongMonthNames[I + 1]);
    end;
  finally
    TMSFNCChart1.EndUpdate;
  end;
end;
</pre>
<p>The exact values can be randomized or loaded from your own dataset, but the structure is what matters: add the series, set the intent of each series, then add point values and labels. That order keeps <strong>appearance</strong> and <strong>data</strong> readable in the source.</p>
<p>Axis labels and spacing deserve their own pass as well. When there is not enough room to show labels horizontally, rotating the X-axis values is often enough to keep the chart readable without changing the data.</p>
<pre class="delphi" name="code">procedure TFormLookAndFeel.ConfigureMonthLabels;
var
  S: TTMSFNCChartSerie;
  I: Integer;
  Pt: TTMSFNCChartPoint;
begin
  TMSFNCChart1.BeginUpdate;
  try
    TMSFNCChart1.Clear;
    S := TMSFNCChart1.Series.Add;
    S.Mode := smStatistical;
    S.AutoXRange := arEnabled;
    S.XValues.Angle := -90;

    for I := 1 to 12 do
    begin
      Pt := S.Points.Add;
      Pt.XValueText := FormatSettings.LongMonthNames[I];
    end;
  finally
    TMSFNCChart1.EndUpdate;
  end;
end;
</pre>
<p><br></p>

<h4>Runtime Styling: Markers, Events, Orientation, Animation, and 3D</h4>
<p>This is where the component starts to feel less like a static chart and more like a <strong>visual system</strong>. First, the bar series is upgraded with <strong>marker styling</strong>, switching from built-in shapes to a <strong>bitmap marker</strong> loaded from a PNG. That alone makes it clear that markers can carry semantic meaning, not just decoration.</p>
<p>Dynamic customization can then be added through <strong>point-level styling</strong>: bars above a threshold can be recolored at runtime. This is a strong pattern because it moves the visual logic closer to the data. Instead of hard-coding one static color, the chart responds to business rules as it renders.</p>
<pre class="delphi" name="code">procedure TFormLookAndFeel.HighlightStrongMonths(ASerie: TTMSFNCChartSerie);
var
  I: Integer;
begin
  for I := 0 to ASerie.Points.Count - 1 do
    if ASerie.Points[I].YValue &gt; 40 then
      ASerie.Points[I].Color := gcLime;
end;
</pre>
<p>Bitmap markers are equally straightforward. Instead of relying on a generic glyph, you can turn every point into a small branded icon or a visual cue that matches the meaning of the series.</p>
<pre class="delphi" name="code">procedure TFormLookAndFeel.UseBitmapMarkers(ASerie: TTMSFNCChartSerie);
begin
  ASerie.Markers.Visible := True;
  ASerie.Markers.Bitmap.LoadFromFile(&#39;dollar.png&#39;);
  ASerie.Markers.Width := 32;
  ASerie.Markers.Height := 32;
  ASerie.Markers.Shape := msBitmap;
end;
</pre>
<p>From there, global presentation controls can further refine the result. The chart background can be changed to a texture, the orientation can flip between vertical and horizontal, animation can make bars grow from zero to their values, and <strong>3D rendering</strong> can be toggled on for the series. Animation is especially useful because it makes the loading or refresh of a chart easier to follow.</p>
<pre class="delphi" name="code">procedure TFormLookAndFeel.EnableArea3D;
var
  S: TTMSFNCChartSerie;
  I: Integer;
begin
  TMSFNCChart1.BeginUpdate;
  try
    TMSFNCChart1.Clear;
    S := TMSFNCChart1.Series.Add;
    S.ChartType := ctArea;
    S.Mode := smStatistical;
    S.AutoYRange := arEnabledZeroBased;
    S.Enable3D := True;
    S.XGrid.Visible := True;
    S.YGrid.Visible := True;
    for I := 0 to 10 do
      S.AddPoint(RandomRange(25, 75));
  finally
    TMSFNCChart1.EndUpdate;
  end;
end;
</pre>
<p><span style="background-color: #eef6ff; border-left: 4px solid #2492d1; padding: 6px 10px; display: inline-block;"><strong>Highlight:</strong> Mix static styling with event-driven styling. Set the baseline look in properties, then use runtime logic to emphasize the values that matter.</span></p>
<p><br></p>

<h4>Pie Charts Reuse the Same Appearance Model</h4>
<p>Switching from the sales chart to a <strong>pie chart</strong> uses the same overall approach. The series collection is cleared, a new pie series is added, labels are made visible, and extra top and bottom margin is applied so an exploded slice still fits cleanly within the chart area. The same <strong>color-scheme logic</strong> used for line, area, and bar charts is reused for the pie colors.</p>
<p>That is an important design detail. Even though the visual language changes completely, the <strong>appearance model</strong> stays familiar. Labels, margins, colors, animation, and per-point emphasis still behave like part of the same component rather than like a separate API you need to learn from scratch.</p>
<pre class="delphi" name="code">procedure TFormLookAndFeel.BuildPieChart;
var
  S: TTMSFNCChartSerie;
begin
  TMSFNCChart1.BeginUpdate;
  try
    TMSFNCChart1.Legend.Visible := False;
    TMSFNCChart1.Series.Clear;

    S := TMSFNCChart1.Series.Add;
    S.ChartType := ctPie;
    S.Legend.Visible := True;
    S.Pie.AutoSize := False;
    S.Pie.Size := 250;
    S.Stroke.Color := gcBlack;
    S.Labels.Visible := True;

    S.AddPoint(Random(100) + 40, gcDarkred, &#39;Dark Red&#39;);
    S.AddPoint(Random(100) + 40, gcSteelblue, &#39;Steel Blue&#39;);
    S.AddPoint(Random(100) + 40, gcYellowgreen, &#39;Yellow Green&#39;);
    S.AddPoint(Random(100) + 40, gcLightseagreen, &#39;Light Sea Green&#39;);
    S.AddPoint(Random(100) + 40, gcOrange, &#39;Orange&#39;);
  finally
    TMSFNCChart1.EndUpdate;
  end;
end;
</pre>
<p><br></p>

<h4>The Same Ideas Carry Over to WEB Core</h4>
<p>The same chart logic also carries over cleanly to a <strong>TMS WEB Core</strong> application. The point is not that the chart merely compiles for another target, but that the same appearance concepts survive the move: the same mixed area-plus-bar chart, the same color treatment, and the same general configuration flow appear in the browser after Delphi code is transpiled to JavaScript. That <strong>cross-framework consistency</strong> is one of the strongest arguments for investing a little time in the chart editor and in a clean programmatic setup.</p>
<p><br></p>

<h4>Conclusion</h4>
<p>This is less about one special property and more about a repeatable <strong>styling workflow</strong> for <a href="https://www.tmssoftware.com/site/tmsfncchart.asp" target="_blank">TMS FNC Chart</a>. Start with the <strong>design-time editor</strong> to discover the right layout, lock in the <strong>chart shell</strong> with backgrounds, legends, titles, and axes, then refine each series with chart type, labels, markers, and color scheme. Finally, add runtime rules for thresholds, animation, 3D, or pie-slice emphasis. That combination is what turns the default sample chart into something that actually matches the look and feel of your application.</p>

		
		
		<br><br></P>]]></description>
	</item>
	<item>
		<title><![CDATA[﻿Better Delphi Code from AI Agents with TMS Skills]]></title>
		<link>https://www.tmssoftware.com/site/blog.asp?post=2458</link>
		<author>Wagner Landgraf</author>
		<pubDate>Mon, 16 Mar 2026 12:00:00 +0000</pubDate>
		<description><![CDATA[<P>﻿
		
		<p>AI coding agents have become a daily tool for many developers. Tools like <a href="https://claude.ai/code">Anthropic Claude Code</a>, <a href="https://openai.com/codex">OpenAI Codex</a>, and <a href="https://www.cursor.com/">Cursor</a> can read your codebase, write new features, fix bugs, and refactor code &#151; all from a natural language description of what you want. Delphi developers are using them too, and we at TMS Software see that more and more of our users work with these tools every day.</p>

<p>But there&#39;s a recurring problem when you use these agents with specialized libraries. General-purpose AI models are trained on the broad universe of open-source code. They know Java, C#, Python, and JavaScript well. For Delphi, they manage. For TMS-specific APIs &#151; Aurelius entity attributes, XData service definitions, Sparkle middleware &#151; they often guess. And when an AI guesses at a rich, opinionated API, the results are plausible-looking but wrong.</p>

<p>This is why we are releasing an official, curated collection of agent skills for TMS products: the <a href="https://github.com/tmssoftware/skills">TMS Software Agent Skills repository</a>.</p>

<h3>What Are Agent Skills?</h3>

<p>An <a href="https://agentskills.io">agent skill</a> is a focused instruction package that an AI coding agent loads dynamically when it encounters a task it recognizes. Think of it as giving your agent a reference manual that it reads before writing code &#151; except it only reads the relevant manual for the specific task at hand.</p>

<p>Skills follow the open <a href="https://agentskills.io/specification">Agent Skills specification</a>, which means they work across multiple agents: Claude Code, Cursor, Cline, OpenCode, Continue, and others. You install them once and they activate automatically &#151; no prompting, no configuration.</p>

<p>Each skill is a folder with two parts:</p>

<ul>
  <li><strong><code>SKILL.md</code></strong> &#151; describes when to activate and what rules to apply beyond what the reference material covers</li>
  <li><strong><code>references/</code></strong> &#151; detailed API documentation: attribute signatures, option tables, code examples, and common patterns</li>
</ul>

<p>When the agent detects that you&#39;re working on something the skill covers &#151; say, mapping a Delphi class to a database &#151; it reads the relevant reference material and applies those rules as it generates code.</p>

<h3>The TMS Skills Repository</h3>

<p>The <a href="https://github.com/tmssoftware/skills">TMS Software Agent Skills repository</a> currently ships two skills, both focused on <a href="https://www.tmssoftware.com/site/aurelius.asp">TMS Aurelius</a>, our ORM framework for Delphi.</p>

<table>
  <thead>
    <tr><th>Skill</th><th>What it covers</th></tr>
  </thead>
  <tbody>
    <tr>
      <td><code>aurelius-mapping</code></td>
      <td>Mapping Delphi classes to a relational database using Aurelius attributes (<code>[Entity]</code>, <code>[Table]</code>, <code>[Column]</code>, associations, inheritance, nullable fields, blobs, and more)</td>
    </tr>
    <tr>
      <td><code>aurelius-objects</code></td>
      <td>Saving, loading, updating, deleting, and navigating entity objects using <code>TObjectManager</code> &#151; including transactions, change tracking, lazy loading, and concurrency control</td>
    </tr>
  </tbody>
</table>

<p>The reference documentation behind these skills is thorough: over 800 lines covering 25+ mapping scenarios for <code>aurelius-mapping</code>, and 640+ lines covering 15+ operational patterns for <code>aurelius-objects</code>. These are the same concepts our documentation covers &#151; distilled into a format that agents can read and apply directly.</p>

<h3>Installing TMS Skills</h3>

<h4>Using the skills CLI (recommended)</h4>

<p>The <code>skills</code> CLI auto-detects which agents you have installed and places files in the right location. It requires <a href="https://nodejs.org/">Node.js</a> to be installed &#151; once you have it, <code>npx</code> is available and no separate installation is needed.</p>

<pre><code># Install all TMS skills at once
npx skills add tmssoftware/skills

# Install a single skill
npx skills add https://github.com/tmssoftware/skills/tree/main/skills/aurelius-mapping
</code></pre>

<h4>Manual installation</h4>

<p>Clone or download the repository, then copy the skill folder into the directory your agent watches:</p>

<table>
  <thead>
    <tr><th>Agent</th><th>Project-level path</th><th>Global path</th></tr>
  </thead>
  <tbody>
    <tr><td>Claude Code</td><td><code>.claude\skills\</code></td><td><code>%USERPROFILE%\.claude\skills\</code></td></tr>
    <tr><td>Cursor</td><td><code>.agents\skills\</code></td><td><code>%USERPROFILE%\.cursor\skills\</code></td></tr>
    <tr><td>Cline</td><td><code>.cline\skills\</code></td><td><code>%USERPROFILE%\.cline\skills\</code></td></tr>
    <tr><td>OpenCode</td><td><code>.agents\skills\</code></td><td><code>%APPDATA%\opencode\skills\</code></td></tr>
    <tr><td>Continue</td><td><code>.continue\skills\</code></td><td><code>%USERPROFILE%\.continue\skills\</code></td></tr>
  </tbody>
</table>

<p>For example, to install the <code>aurelius-mapping</code> skill for Claude Code in your project (from the cloned repository root):</p>

<pre><code>xcopy /E /I skills\aurelius-mapping your-project\.claude\skills\aurelius-mapping
</code></pre>

<p>Skills placed in a project-level folder activate for that project only. Skills placed in the global folder activate for all your projects.</p>

<h3>Skills in Action</h3>

<p>Here&#39;s what the difference looks like in practice.</p>

<h4>Entity Mapping</h4>

<p>Suppose you ask your agent: <em>"Create an Aurelius entity for a Customer that belongs to a Country."</em></p>

<p>Without a skill, a capable model will often produce plausible-looking but incorrect code &#151; wrong attribute names, wrong association syntax, and missing the <code>RegisterEntity</code> call that Aurelius requires at runtime:</p>

<pre><code class="language-delphi">// What an agent might generate WITHOUT the aurelius-mapping skill:

[Table(&#39;customers&#39;)]          // missing [Entity] &#151; Aurelius ignores this class entirely
TCustomer = class
public
  [PrimaryKey]                // wrong &#151; no such attribute; should be [Id(...)]
  Id: Integer;
  [Column(&#39;name&#39;)]
  Name: string;
  CountryId: Integer;         // wrong &#151; associations must be expressed as object references,
                              // not raw foreign key fields
end;

// Missing initialization section entirely &#151; RegisterEntity never called
</code></pre>

<p>With the <code>aurelius-mapping</code> skill loaded, the agent knows the correct attribute names, where to place them, how to express the association, and the <code>initialization</code> section that anchors the class in the Delphi linker:</p>

<pre><code class="language-delphi">uses
  Aurelius.Mapping.Attributes;

type
  [Entity]
  [Automapping]
  TCountry = class
  private
    FId: Integer;
    FName: string;
  public
    property Id: Integer read FId;
    property Name: string read FName write FName;
  end;

  [Entity]
  [Automapping]
  TCustomer = class
  private
    FId: Integer;
    FName: string;
    [Association([], CascadeTypeAllButRemove)]
    [JoinColumn(&#39;COUNTRY_ID&#39;, [])]
    FCountry: TCountry;
  public
    property Id: Integer read FId;
    property Name: string read FName write FName;
    property Country: TCountry read FCountry write FCountry;
  end;

initialization
  RegisterEntity(TCountry);
  RegisterEntity(TCustomer);
</code></pre>

<p>The <code>[Automapping]</code> attribute lets Aurelius infer the table name (<code>CUSTOMER</code>), column names (<code>ID</code>, <code>NAME</code>), and the identifier from the <code>FId</code> field &#151; no extra attributes needed for straightforward mappings. The <code>RegisterEntity</code> call in the <code>initialization</code> section prevents the Delphi linker from removing the class in server applications where it may not be directly referenced in code &#151; a silent failure that is very easy to miss.</p>

<h4>Saving and Loading Objects</h4>

<p>Now suppose you ask: <em>"Save a new Customer and then load it back by ID."</em></p>

<p>Without the <code>aurelius-objects</code> skill, the agent is likely to miss the <code>AddOwnership</code> call that transfers memory ownership to the manager before the risky <code>Save</code> call. It may also incorrectly set a raw foreign key field instead of assigning the associated object:</p>

<pre><code class="language-delphi">// What an agent might generate WITHOUT the aurelius-objects skill:
var
  Customer: TCustomer;
begin
  Customer := TCustomer.Create;
  Customer.Name := &#39;Acme Corp&#39;;
  Customer.CountryId := 42;       // wrong &#151; set the object reference, not a raw FK value
  Manager.Save(Customer);
  // If Save raises an exception, Customer leaks &#151; AddOwnership was never called
end;
</code></pre>

<p>With the <code>aurelius-objects</code> skill, the agent generates correct, safe code:</p>

<pre><code class="language-delphi">var
  Customer: TCustomer;
  Found: TCustomer;
begin
  Customer := TCustomer.Create;
  Manager.AddOwnership(Customer);  // manager will destroy it even if Save raises
  Customer.Name := &#39;Acme Corp&#39;;
  Customer.Country := Manager.Find&lt;TCountry&gt;(CountryId);  // assign the object, not an ID
  Manager.Save(Customer);          // executes the INSERT immediately

  // Find uses the identity map: same instance returned if already cached
  Found := Manager.Find&lt;TCustomer&gt;(Customer.Id);
  WriteLn(Found.Name);             // &#39;Acme Corp&#39;
  // Do not free Customer or Found &#151; the manager owns them
end;
</code></pre>

<p>The skill teaches the agent that <code>AddOwnership</code> should come before <code>Save</code> so the manager assumes ownership regardless of outcome; that <code>Save</code> itself executes the INSERT immediately (no <code>Flush</code> needed for new objects); and that associations must be expressed as object references &#151; never as raw foreign key values, which would bypass the ORM entirely.</p>

<h3>What&#39;s Next</h3>

<p>Our skills repository is designed to grow. We plan to add skills for more TMS products &#151; XData service definitions, Sparkle middleware, Sphinx authentication flows &#151; as we expand coverage across our library suite.</p>

<p>The skills follow an open specification, and contributions are welcome. If you&#39;ve worked extensively with a TMS library and want to help encode that knowledge for AI agents, open a pull request on the <a href="https://github.com/tmssoftware/skills">GitHub repository</a>.</p>

<p>To get started, install the skills for whichever agent you use, and try asking it to create or work with Aurelius entities. The improvement in code quality should be immediate and noticeable.</p>

<ul>
  <li><a href="https://github.com/tmssoftware/skills">TMS Software Agent Skills on GitHub</a></li>
  <li><a href="https://www.tmssoftware.com/site/aurelius.asp">TMS Aurelius product page</a></li>
  <li><a href="https://agentskills.io/specification">Agent Skills specification</a></li>
</ul>

		
		<br><br></P>]]></description>
	</item>
	<item>
		<title><![CDATA[﻿TMS Training Days 2026 - Community Evening]]></title>
		<link>https://www.tmssoftware.com/site/blog.asp?post=2459</link>
		<author>Aaron Decramer</author>
		<pubDate>Fri, 13 Mar 2026 12:00:00 +0000</pubDate>
		<description><![CDATA[<P>﻿
		
		
		
		
		
		
		<div><div style=""><div><span style="font-size: 14px;">As the <a href="https://www.tmstrainingdays.com/" target="_blank">TMS Training Days</a> in Rotterdam approach, we&#146;re pleased to share more details about the <b>Community Evening</b> taking place on <b>April 23</b>. This evening offers the perfect way to connect with fellow developers, exchange ideas, and enjoy the city&#146;s unique atmosphere beyond the conference sessions.</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">We&#146;ll begin with a <b>guided walking tour</b> through the heart of the city, where you&#146;ll discover its dynamic streets and stunning modern architecture. Afterwards, we&#146;ll gather for a <b>3-course dinner</b> near the iconic Erasmus Bridge, the perfect backdrop to continue conversations and enjoy great food together.</span></div><div><span style="font-size: 14px;"><br></span></div><div><img src="https://www.tmssoftware.com/site/img/blog/rotterdam_3.jpg" style="width: 829px;" alt="TMS Software Delphi  Components "><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;"><br></span></div><div>To end the night, we&#146;ll embark on a <b>boat trip</b> along the Nieuwe Maas. Glide past Rotterdam&#146;s famous bridges and architectural landmarks as the city lights reflect on the water, creating a relaxed and memorable close to the day.</div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">If you haven&#146;t secured your ticket yet, now is the time. A full two‑day pass <b>&#128;595</b>&nbsp;includes access to all sessions, a delicious buffet lunch on both days, and participation in the Community Evening event.</span></div></div></div><div><br></div><div><span style="font-size: 14px;">Tickets are going fast and spots are almost sold out. Do not wait too long to be part of this unforgettable experience.</span></div><div><div style=""><span style="font-size: 14px;">👉 <a href="https://www.tmstrainingdays.com/#registration-form" target="_blank">Get your tickets here</a></span></div><div style=""><span style="font-size: 14px;"><br></span></div><div style=""><span style="font-size: 14px;">You can view the full program of speakers and sessions here:&nbsp;</span><a href="https://www.tmstrainingdays.com/#SessionSchedule" target="_blank" style="background-color: white; font-family: sans-serif;">Training Days Session Schedule</a></div></div><div><br></div>
<a href="https://tmstrainingdays.com/">
 <img src="https://www.tmssoftware.com/site/img/blog/email_banner_trainingdays2026.png" style="width: 829px;" alt="TMS Software Delphi  Components ">
		
		</a>
		
		
		
		
		
		
		
		
		<br><br></P>]]></description>
	</item>
	<item>
		<title><![CDATA[﻿Meet Dennis Roehner at TMS Training Days 2026]]></title>
		<link>https://www.tmssoftware.com/site/blog.asp?post=2455</link>
		<author>Aaron Decramer</author>
		<pubDate>Fri, 13 Mar 2026 12:00:00 +0000</pubDate>
		<description><![CDATA[<P>﻿
		
		<div><span style="font-size: 14px;">The countdown to <a href="https://www.tmstrainingdays.com/" target="_blank">TMS Training Days 2026 </a>reaches its finale. Today, we&#146;re shining the spotlight on our twelfth and final featured speaker, <b>Dennis Roehner</b>.</span></div><br><div><div><img src="https://www.tmssoftware.com/site/img/blog/dennis_tmstrainingdays.png" style="float: left;" class="note-float-left" alt="TMS Software Delphi  Components "></div></div><div><div><div><div>As CEO of TMS Software since August 2025, Dennis brings a strong background in computational physics and software engineering to his leadership role. His vision drives the company forward, building powerful and future-ready developer tools for Delphi and beyond. Under his guidance, TMS continues to explore new technologies and empower developers around the world.</div><div><br></div><div>During TMS Training Days 2026, Dennis will lead a session on "<b>PDF Generation and PDF Form Fields</b>", offering a practical look at how to create and manage dynamic PDF content with TMS tools. The session focuses on automating document workflows, designing custom forms, and adding interactive capabilities, showing how to combine precision and efficiency in every step.</div></div></div><div><div style=""><div><br></div></div></div></div><div><div><span style="font-size: 14px;">The final version of the schedule is now online. Check out all the <a href="https://www.tmstrainingdays.com/#SessionSchedule" target="_blank">sessions and speakers</a>.</span></div></div><div><br></div><div><span style="color: inherit; font-family: Montserrat, sans-serif; font-size: 24px; font-weight: bold;"><br></span></div><div><span style="color: inherit; font-family: Montserrat, sans-serif; font-size: 24px; font-weight: bold;">No ticket yet?</span></div><div>The ticket price is<b> &#128;595</b>, covering both event days, meals during the day, and participation in the evening community event.</div><div><a href="https://tmstrainingdays.com/#registration-form" target="_blank">Secure your spot here</a></div><div><br></div><div>We&#146;re looking forward to seeing you in Rotterdam for another fantastic edition of TMS Training Days!</div><div><br></div>
			
<a href="https://tmstrainingdays.com/">
 <img src="https://www.tmssoftware.com/site/img/blog/email_banner_trainingdays2026.png" style="width: 829px;" alt="TMS Software Delphi  Components ">
		
		</a>
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		<br><br></P>]]></description>
	</item>
	</channel></rss>
