<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-29331675</id><updated>2026-03-14T12:59:19.205+01:00</updated><category term="Delphi"/><category term="OmniThreadLibrary"/><category term="programming"/><category term="multithreading"/><category term="source code"/><category term="open source"/><category term="presentations"/><category term="books"/><category term="best practices"/><category term="Smart Mobile Studio"/><category term="work in progress"/><category term="Object Pascal"/><category term="utilities"/><category term="The Delphi Magazine"/><category term="Windows"/><category term="compiler"/><category term="Blaise Pascal"/><category term="documentation"/><category term="enumerators"/><category term="C++Builder"/><category term="RAD Studio"/><category term="AI"/><category term="not programming"/><category term="JavaScript"/><category term="DelphiAndAI"/><category term="LLM"/><category term="bug"/><category term="iOS"/><category term="Android"/><category term="Embarcadero Akademija"/><category term="ITDevCon"/><category term="practical-otl"/><category term="DSL"/><category term="OS X"/><category term="debugging"/><category term="RTL"/><category term="SQL"/><category term="Spring4D"/><category term="benchmarking"/><category term="beta"/><category term="x64"/><category term="xe7"/><category term="xe8"/><category term="FireMonkey"/><category term="Win32"/><category term="attributes"/><category term="definitely not best practices"/><category term="events"/><category term="high performance"/><category term="synchronization"/><category term="Chatterbox"/><category term="DataSnap"/><category term="FastMM"/><category term="XML"/><category term="design patterns"/><category term="generics"/><category term="job"/><category term="memory management"/><category term="this I believe"/><category term="tips"/><category term="writing"/><category term="Delphi Day"/><category term="Delphi; programming; books"/><category term="Parallel Programming Library"/><category term="RTTI"/><category term="Unicode"/><category term="anonymous methods"/><category term="command line"/><category term="error"/><category term="language"/><category term="profiling"/><category term="rant"/><category term="reviews"/><category term="version control"/><category term="xe5"/><category term="ANSI"/><category term="COM"/><category term="Chromecast"/><category term="Claude"/><category term="ClaudeCode"/><category term="DOS"/><category term="DWS"/><category term="Delphi25th"/><category term="Google"/><category term="Google+"/><category term="Linux"/><category term="NUMA"/><category term="OmniXML"/><category term="Python"/><category term="REST"/><category term="Turbo Pascal"/><category term="UTF-8"/><category term="accelerometer"/><category term="apology"/><category term="blogs"/><category term="build"/><category term="code formatting"/><category term="computer vision"/><category term="conferences"/><category term="continuous integration"/><category term="databases"/><category term="dcc32"/><category term="features"/><category term="git"/><category term="graphics"/><category term="imaging"/><category term="operators"/><category term="pascal"/><category term="printing"/><category term="regular expressions"/><category term="short tips"/><category term="testing"/><category term="time"/><category term="timestamp"/><category term="undocumented"/><category term="unlabeled"/><category term="user interface"/><category term="video"/><category term="web"/><category term="wiki"/><category term="woodworking"/><category term="xe3"/><category term="xe6"/><title type='text'>The Delphi Geek</title><subtitle type='html'>random ramblings on Delphi, programming, Delphi programming, and all the rest</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.thedelphigeek.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://www.thedelphigeek.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>gabr42</name><uri>http://www.blogger.com/profile/06903558857617342477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>583</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-29331675.post-7542829355353717161</id><published>2026-03-04T13:27:00.002+01:00</published><updated>2026-03-09T11:25:16.583+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="multithreading"/><category scheme="http://www.blogger.com/atom/ns#" term="OmniThreadLibrary"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows"/><title type='text'>Fixing Windows error 1400 in OTL tasks</title><content type='html'>&lt;p&gt;From time to time I got error reports about &amp;quot;error 1400&amp;quot; in OTL and my response is always the same: &amp;quot;You are using it wrong.&amp;quot; I never wrote anything about that, though. My bad :(&lt;/p&gt;&lt;p&gt;This time, however, I received an excellent error report with a minimal reproducible example (thanks!), which gave me an excellent excuse for this blog post ;)&lt;/p&gt;&lt;p&gt;Let me start with a little demonstration...&lt;/p&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;http://www.thedelphigeek.com/2026/03/fixing-windows-error-1400-in-otl-tasks.html#more&quot;&gt;Read more »&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;font size=-2&gt;--- Published under the &lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons Attribution 3.0&lt;/a&gt; license&lt;/font&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.thedelphigeek.com/feeds/7542829355353717161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.thedelphigeek.com/2026/03/fixing-windows-error-1400-in-otl-tasks.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/7542829355353717161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/7542829355353717161'/><link rel='alternate' type='text/html' href='http://www.thedelphigeek.com/2026/03/fixing-windows-error-1400-in-otl-tasks.html' title='Fixing Windows error 1400 in OTL tasks'/><author><name>gabr42</name><uri>http://www.blogger.com/profile/06903558857617342477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29331675.post-6142192792174678253</id><published>2026-01-17T18:50:00.003+01:00</published><updated>2026-01-20T10:14:33.475+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Claude"/><category scheme="http://www.blogger.com/atom/ns#" term="ClaudeCode"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="DelphiAndAI"/><title type='text'>Delphi and AI[10]: Coding GpTimestamp with Claude Code</title><content type='html'>&lt;p&gt;A month ago I wrote a nice little unit that simplifies working with timestamps received from different sources - GpTimestamp - with help from Claude Code. Actually, to be fair - I took a backseat, set the goals, provided some info, and let Claude do all the work. I already wrote a &lt;a href=&quot;https://www.thedelphigeek.com/2025/12/introducing-gptimestamp.html&quot; target=&quot;_blank&quot;&gt;post about GpTimestamp&lt;/a&gt;, but I said nothing about the coding experience. Let&amp;#39;s fix that!&lt;/p&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;http://www.thedelphigeek.com/2026/01/delphi-and-ai10-coding-gptimestamp-with.html#more&quot;&gt;Read more »&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;font size=-2&gt;--- Published under the &lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons Attribution 3.0&lt;/a&gt; license&lt;/font&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.thedelphigeek.com/feeds/6142192792174678253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.thedelphigeek.com/2026/01/delphi-and-ai10-coding-gptimestamp-with.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/6142192792174678253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/6142192792174678253'/><link rel='alternate' type='text/html' href='http://www.thedelphigeek.com/2026/01/delphi-and-ai10-coding-gptimestamp-with.html' title='Delphi and AI[10]: Coding GpTimestamp with Claude Code'/><author><name>gabr42</name><uri>http://www.blogger.com/profile/06903558857617342477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29331675.post-2726233566501378931</id><published>2025-12-15T22:40:00.000+01:00</published><updated>2025-12-15T22:40:01.614+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><category scheme="http://www.blogger.com/atom/ns#" term="time"/><category scheme="http://www.blogger.com/atom/ns#" term="timestamp"/><title type='text'>Introducing GpTimestamp</title><content type='html'>&lt;p class=&quot;font-claude-response-body break-words whitespace-normal leading-[1.7]&quot;&gt;In my programmer&amp;#39;s life I frequently deal with all kinds of timestamps. As the code is relatively, ahem, &amp;quot;mature&amp;quot; those timestamps come from all kinds of sources. There are 64-bit ticks (GetTickCount64), multimedia time (timeGetTime), performance counters (QueryPerformanceCounter), performance counters in disguise (TStopwatch), and there is also a TDateTime (NowUTC) mixed in from time to time.&lt;/p&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal leading-[1.7]&quot;&gt;All this mess would not be that bad had the timestamps been only used locally. If you sample a timestamp and then a few lines later check whether so-and-so time has expired, all is well. You will always know what the source of the timestamp was and what to compare it to.&lt;/p&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal leading-[1.7]&quot;&gt;Problems occur when the timestamps are grabbed on one side of the system and consumed on the other side. Let&amp;#39;s say that the code receives a block of data over some internal communication mechanism. A part of that data is a timestamp representing a creation time of that data block. You have to check how much time has elapsed since then. How do you do that?&lt;/p&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal leading-[1.7]&quot;&gt;Well, firstly you have to know in what units this timestamp is stored. Is it a floating point number (TDateTime) or a 64-bit integer? In the latter case, does it store a number of milliseconds, &amp;#39;ticks&amp;#39; (whatever that is) or something else?&lt;/p&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal leading-[1.7]&quot;&gt;Secondly, you have to get &amp;quot;current timestamp&amp;quot; from the correct time source so you can do the calculation. So you have to know what the source was. And if you&amp;#39;re not sure, you&amp;#39;ll have to dig through the code to find the point where the original timestamp was created.&lt;/p&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal leading-[1.7]&quot;&gt;The former problem is somewhat solvable by using descriptive variable/field names. For example, if a variable stores a timestamp in milliseconds, I always use a suffix &lt;code class=&quot;bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]&quot;&gt;_ms&lt;/code&gt;. In the example above I would use a field &lt;code class=&quot;bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]&quot;&gt;DataCreationTime_ms&lt;/code&gt; or something similar.&lt;/p&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal leading-[1.7]&quot;&gt;The latter problem, however, is hard. You could use suffixes (&lt;code class=&quot;bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]&quot;&gt;DataCreationTime_Tick64_ms&lt;/code&gt;) but that gets ugly pretty fast. You could also document the time source (and you should!) but that again stops you when you just want to write some code.&lt;/p&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal leading-[1.7]&quot;&gt;Even worse, both solutions only work if you take care when coding. Delphi won&amp;#39;t stop you from subtracting TStopwatch.GetTimeStamp from a value that is storing a result of timeGetTime, although the result won&amp;#39;t make much sense.&lt;/p&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal leading-[1.7]&quot;&gt;Clearly, I needed something better, so I wrote* the &lt;a href=&quot; https://github.com/gabr42/GpDelphiUnits/blob/master/src/GpTimestamp.pas&quot; target=&quot;_blank&quot;&gt;GpTimestamp&lt;/a&gt; unit which tries to solve this mess. There is also &lt;a href=&quot;https://github.com/gabr42/GpDelphiUnits/blob/master/src/GpTimestamp.md&quot; target=&quot;_blank&quot;&gt;documentation &lt;/a&gt;and &lt;a href=&quot;https://github.com/gabr42/GpDelphiUnits/blob/master/src/GpTimestamp.UnitTests.pas&quot; target=&quot;_blank&quot;&gt;unit tests&lt;/a&gt;, if you want to jump in now.&lt;/p&gt;&lt;p&gt;

&lt;/p&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal leading-[1.7]&quot;&gt;(* When I say &amp;quot;I&amp;quot; I actually mean Claude. I was just an idea-man on this project. I&amp;#39;ll say more about that in the following post...)&lt;/p&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;http://www.thedelphigeek.com/2025/12/introducing-gptimestamp.html#more&quot;&gt;Read more »&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;font size=-2&gt;--- Published under the &lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons Attribution 3.0&lt;/a&gt; license&lt;/font&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.thedelphigeek.com/feeds/2726233566501378931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.thedelphigeek.com/2025/12/introducing-gptimestamp.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/2726233566501378931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/2726233566501378931'/><link rel='alternate' type='text/html' href='http://www.thedelphigeek.com/2025/12/introducing-gptimestamp.html' title='Introducing GpTimestamp'/><author><name>gabr42</name><uri>http://www.blogger.com/profile/06903558857617342477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29331675.post-2151637767341068594</id><published>2025-11-15T18:07:00.003+01:00</published><updated>2025-11-15T18:07:59.363+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ANSI"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="Unicode"/><category scheme="http://www.blogger.com/atom/ns#" term="UTF-8"/><title type='text'>When is AnsiString(String(ansstr)) &lt;&gt; ansstr?</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;z-0 flex min-h-[46px] justify-start&quot;&gt;&lt;/div&gt;&lt;div class=&quot;mt-3 w-full empty:hidden&quot;&gt;&lt;div class=&quot;text-center&quot;&gt;&lt;div&gt;&lt;div class=&quot;inline-flex border border-gray-100 dark:border-gray-700 rounded-xl&quot;&gt;&lt;div class=&quot;text-token-text-secondary flex items-center justify-center gap-4 px-4 py-2.5 text-sm whitespace-nowrap&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;flex max-w-full flex-col grow&quot;&gt;&lt;div class=&quot;min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&amp;amp;]:mt-1&quot; data-message-author-role=&quot;assistant&quot; data-message-id=&quot;84be806a-7cac-4751-af58-46a420ee2745&quot; data-message-model-slug=&quot;gpt-5-1&quot; dir=&quot;auto&quot;&gt;&lt;div class=&quot;flex w-full flex-col gap-1 empty:hidden first:pt-[1px]&quot;&gt;&lt;div class=&quot;markdown prose dark:prose-invert w-full break-words light markdown-new-styling&quot;&gt;&lt;p data-end=&quot;319&quot; data-start=&quot;117&quot;&gt;&lt;br&gt;Remember the good old times when strings were composed of 8-bit characters? Those were simpler times. When we needed a data buffer, we just used an AnsiString. An 8-bit character is just a byte, surely?&lt;/p&gt;
&lt;p data-end=&quot;690&quot; data-start=&quot;321&quot;&gt;Then Unicode arrived and suddenly all strings were based on 16-bit characters. The code broke all around us. At the company I&amp;#39;m working for we needed about one year to port all our applications to Unicode. (And by “we” I mean myself. I allocated one day per week to work on Unicode issues and slowly worked through the code. Today I&amp;#39;d probably use AI for the task. :) )&lt;/p&gt;
&lt;p data-end=&quot;913&quot; data-start=&quot;692&quot;&gt;We completed this port in Delphi 2010 times. And then we spent the next 10-ish Delphi versions fixing bugs related to this change. And when I thought we had fixed them all (hope, hope), Microsoft did something unexpected.&lt;/p&gt;
&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;a href=&quot;http://www.thedelphigeek.com/2025/11/when-is-ansistringstringansstr-ansstr.html#more&quot;&gt;Read more »&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;font size=-2&gt;--- Published under the &lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons Attribution 3.0&lt;/a&gt; license&lt;/font&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.thedelphigeek.com/feeds/2151637767341068594/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.thedelphigeek.com/2025/11/when-is-ansistringstringansstr-ansstr.html#comment-form' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/2151637767341068594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/2151637767341068594'/><link rel='alternate' type='text/html' href='http://www.thedelphigeek.com/2025/11/when-is-ansistringstringansstr-ansstr.html' title='When is AnsiString(String(ansstr)) &lt;&gt; ansstr?'/><author><name>gabr42</name><uri>http://www.blogger.com/profile/06903558857617342477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEgDROY7brjAUBwGAHddKsicKEoVBqnsXdJX71g4Bc5d04f29qbw03omosKEdK6uIEh-lbCZC1KoeglJEwN_xWaRpA_lkdwFEizAUvlUTWwWa7tUrKFm0x1pLLt1jUgSpzil02X3vdWCFGTzlauTxNFIVNzGnnw_X46KOkNWiKtTKLqvVNVQj9ePkw=s72-w640-h250-c" height="72" width="72"/><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29331675.post-4786864182388496535</id><published>2025-11-03T17:22:00.001+01:00</published><updated>2025-11-03T17:22:27.088+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="code formatting"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="RAD Studio"/><title type='text'>Restoring code formatter in Delphi 13</title><content type='html'>&lt;p&gt;While I don&#39;t miss the Refactor menu in Delphi 13 -- I&#39;m used to MMX -- I do sometimes miss ability to format Delphi code (the in/famous Ctrl+D). On my recent RAD Studio presentation in Ljubljana I learned that there are many other Delphi programmers who also miss this functionality, so I looked around to find a way of restoring it.&lt;/p&gt;&lt;p&gt;As it happened, I didn&#39;t have to look far. Pretty quick I found an excellent &lt;a href=&quot;https://corneliusconcepts.tech/code-formatting-delphi-13&quot; target=&quot;_blank&quot;&gt;blog post&lt;/a&gt; written by David Cornelius. If you also miss code formatter, read his post!&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;font size=-2&gt;--- Published under the &lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons Attribution 3.0&lt;/a&gt; license&lt;/font&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.thedelphigeek.com/feeds/4786864182388496535/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.thedelphigeek.com/2025/11/restoring-code-formatter-in-delphi-13.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/4786864182388496535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/4786864182388496535'/><link rel='alternate' type='text/html' href='http://www.thedelphigeek.com/2025/11/restoring-code-formatter-in-delphi-13.html' title='Restoring code formatter in Delphi 13'/><author><name>gabr42</name><uri>http://www.blogger.com/profile/06903558857617342477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29331675.post-7995227750652607938</id><published>2025-10-22T21:09:00.002+02:00</published><updated>2025-10-22T21:09:32.287+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="multithreading"/><category scheme="http://www.blogger.com/atom/ns#" term="OmniThreadLibrary"/><title type='text'>OmniThreadLibrary 3.07.11 with RAD Studio 13 support</title><content type='html'>&lt;p&gt;I just released a new OmniThreadLibrary. Not many changes, just some fixes and - of course - support for RAD Studio 13.&lt;/p&gt;&lt;p&gt;OmniThreadLibrary now supports 19 major Delphi releases: 2007, 2009, 2010, XE, XE2, XE3, XE4, XE5, XE6, XE7, XE8, 10 Seattle, 10.1 Berlin, 10.2 Tokyo, 10.3 Rio, 10.4 Sydney, 11 Alexandria, 12 Athens, and 13 Florence. I wonder whether this is a record in the Delphi open-source world :)&lt;/p&gt;&lt;p&gt;&lt;b&gt;New features&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Added Delphi 13 packages supporting 64-bit IDE.&lt;/li&gt;&lt;li&gt;Implemented TOmniValue.AsUInt64.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;b&gt;Bug fixes&lt;/b&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;[SMelnyk64] Fix: AV in TOmniParallelLoopBase.InternalExecute when taskFinalizer is not provided.&lt;/li&gt;&lt;li&gt;Fixed TOmniGroupAffinity.Create with 64 processors on 64-bit.&lt;/li&gt;&lt;li&gt;Use correct time-measurement functions in OtlEventMonitor.&lt;/li&gt;&lt;li&gt;[Anton Alisov] Fixed critical section handling in TOmniValueQueue.DoWithCritSec.&lt;/li&gt;&lt;li&gt;Avoid range check in OtlThreadPool on 64 CPU systems.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;You can get it on &lt;a href=&quot;https://github.com/gabr42/OmniThreadLibrary/releases/tag/release-3.07.11&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;, download it from my &lt;a href=&quot;https://drive.google.com/file/d/1iFFrRHhvldLWv2SwMJaQKfaqs63Wig25/view?usp=sharing&quot; target=&quot;_blank&quot;&gt;Google Drive&lt;/a&gt;, or - soon - install it via GetIt!&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;font size=-2&gt;--- Published under the &lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons Attribution 3.0&lt;/a&gt; license&lt;/font&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.thedelphigeek.com/feeds/7995227750652607938/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.thedelphigeek.com/2025/10/omnithreadlibrary-30711-with-rad-studio.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/7995227750652607938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/7995227750652607938'/><link rel='alternate' type='text/html' href='http://www.thedelphigeek.com/2025/10/omnithreadlibrary-30711-with-rad-studio.html' title='OmniThreadLibrary 3.07.11 with RAD Studio 13 support'/><author><name>gabr42</name><uri>http://www.blogger.com/profile/06903558857617342477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29331675.post-3237896610409981061</id><published>2025-10-16T17:17:00.002+02:00</published><updated>2025-10-16T17:17:29.082+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C++Builder"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="presentations"/><category scheme="http://www.blogger.com/atom/ns#" term="RAD Studio"/><title type='text'>RAD Studio 13 presentation in Ljubljana</title><content type='html'>&lt;p&gt;Next week I&amp;#39;m presenting all that is shiny and new in RAD Studio 13 in Ljubljana. As the presentation will be in Slovenian language, so is the next of this post ...&lt;/p&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;http://www.thedelphigeek.com/2025/10/rad-studio-13-presentation-in-ljubljana.html#more&quot;&gt;Read more »&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;font size=-2&gt;--- Published under the &lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons Attribution 3.0&lt;/a&gt; license&lt;/font&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.thedelphigeek.com/feeds/3237896610409981061/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.thedelphigeek.com/2025/10/rad-studio-13-presentation-in-ljubljana.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/3237896610409981061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/3237896610409981061'/><link rel='alternate' type='text/html' href='http://www.thedelphigeek.com/2025/10/rad-studio-13-presentation-in-ljubljana.html' title='RAD Studio 13 presentation in Ljubljana'/><author><name>gabr42</name><uri>http://www.blogger.com/profile/06903558857617342477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29331675.post-8326759920917588495</id><published>2025-08-08T14:14:00.001+02:00</published><updated>2025-08-08T14:14:26.963+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="writing"/><title type='text'>Delphi and AI [9]: Guided writing</title><content type='html'>&lt;p&gt;Some time ago, I tried using AI to write a blog post, but things&lt;a href=&quot;https://www.thedelphigeek.com/2025/07/delphi-and-ai-8-write-me-article-about.html&quot; target=&quot;_blank&quot;&gt; didn’t go quite as planned&lt;/a&gt;. For my second attempt, I aimed to do better. I focused on a single engine—OpenAI—and used it in a more granular way. Instead of simply saying, “Write me an article about...,” I started with basic introductory questions, then asked it to write the article, and finally requested improvements where I felt the draft was lacking. The end result was &lt;a href=&quot;https://www.thedelphigeek.com/2025/07/integrating-llm-engines-in-your-delphi.html&quot; target=&quot;_blank&quot;&gt;quite satisfying&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;This article is my analysis of that process. If you’re only interested in reading the transcript, you can find it &lt;a href=&quot;https://github.com/gabr42/DelphiAndAI/blob/main/09%20Using%20Chatterbox%20client%20AI%20libraries%20from%20your%20code/chatgpt.pdf&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;http://www.thedelphigeek.com/2025/08/delphi-and-ai-9-guided-writing.html#more&quot;&gt;Read more »&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;font size=-2&gt;--- Published under the &lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons Attribution 3.0&lt;/a&gt; license&lt;/font&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.thedelphigeek.com/feeds/8326759920917588495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.thedelphigeek.com/2025/08/delphi-and-ai-9-guided-writing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/8326759920917588495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/8326759920917588495'/><link rel='alternate' type='text/html' href='http://www.thedelphigeek.com/2025/08/delphi-and-ai-9-guided-writing.html' title='Delphi and AI [9]: Guided writing'/><author><name>gabr42</name><uri>http://www.blogger.com/profile/06903558857617342477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29331675.post-1385368908596245488</id><published>2025-07-24T10:16:00.006+02:00</published><updated>2025-07-24T10:53:11.149+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="Chatterbox"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="LLM"/><title type='text'>Integrating LLM engines in your Delphi app with Chatterbox</title><content type='html'>&lt;span&gt;&lt;/span&gt;&lt;p&gt;But the real changes happened under the hood.&lt;/p&gt;&lt;p&gt;I’ve refactored the codebase to fully separate the AI client logic from both the UI and the network layer. And what does that mean for you? It means you can now use the Chatterbox AI libraries directly in your own code.&lt;/p&gt;&lt;p&gt;Let me say that again, loud and clear:&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;b&gt;You can now use Chatterbox AI libraries from your code!&lt;/b&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;To test this, I created a very basic demo called &lt;a href=&quot;https://github.com/gabr42/Chatterbox/tree/main/demos/EngineDemo&quot; target=&quot;_blank&quot;&gt;EngineDemo&lt;/a&gt;. And naturally, for this announcement, I had to explain how the demo uses the Chatterbox libraries.&lt;/p&gt;&lt;p&gt;Since this was a brand-new development that the AI had no prior knowledge of, I decided to revisit an experiment I mentioned in a &lt;a href=&quot;https://www.thedelphigeek.com/2025/07/delphi-and-ai-8-write-me-article-about.html&quot; target=&quot;_blank&quot;&gt;previous post&lt;/a&gt;—one that was only partially successful. This time, I took a different approach. But more on that in the next post.&lt;/p&gt;&lt;p&gt;For now, take a look at what ChatGPT had to say on the topic. Just keep in mind: this wasn’t a simple “click and publish” process. ChatGPT and I had a long back-and-forth, and the result of that collaboration is the article below.&lt;/p&gt;

&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;a href=&quot;http://www.thedelphigeek.com/2025/07/integrating-llm-engines-in-your-delphi.html#more&quot;&gt;Read more »&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;font size=-2&gt;--- Published under the &lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons Attribution 3.0&lt;/a&gt; license&lt;/font&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.thedelphigeek.com/feeds/1385368908596245488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.thedelphigeek.com/2025/07/integrating-llm-engines-in-your-delphi.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/1385368908596245488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/1385368908596245488'/><link rel='alternate' type='text/html' href='http://www.thedelphigeek.com/2025/07/integrating-llm-engines-in-your-delphi.html' title='Integrating LLM engines in your Delphi app with Chatterbox'/><author><name>gabr42</name><uri>http://www.blogger.com/profile/06903558857617342477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29331675.post-9153155553375923349</id><published>2025-07-13T17:35:00.005+02:00</published><updated>2025-07-24T09:59:15.685+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="multithreading"/><title type='text'>Delphi and AI [8]: Write me an article about ComputeCore</title><content type='html'>&lt;p&gt;This was supposed to be an article comparing three major AI players in their ability to write technical articles. In preparation, however, I made some mistakes ... :(&lt;/p&gt;&lt;p&gt;When I prepared for the initial article, I asked them to fetch the data from &lt;a href=&quot;https://github.com/gabr42/ComputeCore/blob/main/ComputeCore.pas&quot;&gt;https://github.com/gabr42/ComputeCore/blob/main/ComputeCore.pas&lt;/a&gt; and write about it. (See the end of this article for the initial query and results.) At that moment, however, that link was not public yet. All three AIs ignored that and happily wrote about the code they knew nothing about. It was only Claude that complained about the bad link but I missed that while checking the results. &lt;/p&gt;&lt;p&gt;So I decided to rerun the experiment on all platforms. I started by asking the engines the following question: &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;i&gt;Can you accesss &lt;a href=&quot;https://github.com/gabr42/ComputeCore/blob/main/ComputeCore.pas&quot;&gt;https://github.com/gabr42/ComputeCore/blob/main/ComputeCore.pas&lt;/a&gt;&lt;a href=&quot;https://github.com/gabr42/ComputeCore/blob/main/ComputeCore.pas&quot;&gt;&lt;/a&gt; and provide an overview of the code in one paragraph?&lt;/i&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;&lt;a href=&quot;https://github.com/gabr42/ComputeCore/blob/main/ComputeCore.pas&quot;&gt;&lt;/a&gt; &lt;/i&gt;&lt;/p&gt;&lt;div&gt;This worked with ChatGPT but both Claude and Gemini complied that they cannot access the link. I had to rerun the query with the link to the raw file for the latter two to work:&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;i&gt;Can you accesss &lt;a href=&quot;https://raw.githubusercontent.com/gabr42/ComputeCore/refs/heads/main/ComputeCore.pas&quot;&gt;https://raw.githubusercontent.com/gabr42/ComputeCore/refs/heads/main/ComputeCore.pas&lt;/a&gt; and provide an overview of the code in one paragraph?&lt;/i&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Analyzing the answer shows that the answers were not done purely on the basis of the linked code. Both Claude and Gemini have included details that they got from my previous article on &lt;a href=&quot;https://www.thedelphigeek.com/2025/06/computecore-simple-parallel-task.html&quot; target=&quot;_blank&quot;&gt;ComputeCode&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;In the answers below I marked hallucinated misinformation with &lt;span style=&quot;background-color: #f4cccc;&quot;&gt;red&lt;/span&gt; and information that was obviously retreived from different sources with &lt;span style=&quot;background-color: #cfe2f3;&quot;&gt;blue&lt;/span&gt;&lt;span style=&quot;background-color: white;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;a href=&quot;http://www.thedelphigeek.com/2025/07/delphi-and-ai-8-write-me-article-about.html#more&quot;&gt;Read more »&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;font size=-2&gt;--- Published under the &lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons Attribution 3.0&lt;/a&gt; license&lt;/font&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.thedelphigeek.com/feeds/9153155553375923349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.thedelphigeek.com/2025/07/delphi-and-ai-8-write-me-article-about.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/9153155553375923349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/9153155553375923349'/><link rel='alternate' type='text/html' href='http://www.thedelphigeek.com/2025/07/delphi-and-ai-8-write-me-article-about.html' title='Delphi and AI [8]: Write me an article about ComputeCore'/><author><name>gabr42</name><uri>http://www.blogger.com/profile/06903558857617342477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29331675.post-6602502831425742215</id><published>2025-06-28T18:59:00.001+02:00</published><updated>2025-06-28T18:59:14.138+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="multithreading"/><category scheme="http://www.blogger.com/atom/ns#" term="Spring4D"/><title type='text'>ComputeCore - A Simple Parallel Task Framework</title><content type='html'>&lt;p&gt;Today, I want to talk about a small multithreading kernel (framework, library, or whatever you want to call it) that I&amp;#39;ve recently helped develop for the &lt;a href=&quot;https://bitbucket.org/sglienke/spring4d/src/maste&quot; target=&quot;_blank&quot;&gt;Spring4D &lt;/a&gt;project.&lt;/p&gt;&lt;p&gt;ComputeCore is a lightweight parallel processing framework for Delphi that lets you easily run CPU-intensive tasks across multiple threads. Its goals are straightforward: to run (possibly compute-heavy) tasks concurrently, allow tasks to spawn child tasks, and expose a very simple interface for the caller.&lt;/p&gt;&lt;p&gt;It will eventually be published as Spring.Threading, but until that happens, we can examine the almost-final version at &lt;a href=&quot;https://github.com/gabr42/ComputeCore&quot;&gt;https://github.com/gabr42/ComputeCore&lt;/a&gt;. In Spring4D, it will run the parallel implementation of the new sorting algorithm, but that doesn&amp;#39;t mean it is only useful for one specific job! It is indeed a completely open (although intentionally simple) framework that can be used for your projects too.&lt;/p&gt;&lt;p&gt;[This article was written with the help of an AI. My next article will explain this decision and the writing process.]&lt;/p&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;http://www.thedelphigeek.com/2025/06/computecore-simple-parallel-task.html#more&quot;&gt;Read more »&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;font size=-2&gt;--- Published under the &lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons Attribution 3.0&lt;/a&gt; license&lt;/font&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.thedelphigeek.com/feeds/6602502831425742215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.thedelphigeek.com/2025/06/computecore-simple-parallel-task.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/6602502831425742215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/6602502831425742215'/><link rel='alternate' type='text/html' href='http://www.thedelphigeek.com/2025/06/computecore-simple-parallel-task.html' title='ComputeCore - A Simple Parallel Task Framework'/><author><name>gabr42</name><uri>http://www.blogger.com/profile/06903558857617342477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29331675.post-7926637813306716093</id><published>2025-04-04T09:02:00.001+02:00</published><updated>2025-04-04T09:02:16.904+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="presentations"/><category scheme="http://www.blogger.com/atom/ns#" term="web"/><title type='text'>Run your Delphi programs in a browser</title><content type='html'>&lt;p style=&quot;text-align: left;&quot;&gt;Next Wednesday I&amp;#39;ll be talking about Delphi and TMS Web Core in Ljubljana. As the presentation will be in Slovenian language, so is the rest of this post.&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;a href=&quot;http://www.thedelphigeek.com/2025/04/run-your-delphi-programs-in-browser.html#more&quot;&gt;Read more »&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;font size=-2&gt;--- Published under the &lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons Attribution 3.0&lt;/a&gt; license&lt;/font&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.thedelphigeek.com/feeds/7926637813306716093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.thedelphigeek.com/2025/04/run-your-delphi-programs-in-browser.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/7926637813306716093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/7926637813306716093'/><link rel='alternate' type='text/html' href='http://www.thedelphigeek.com/2025/04/run-your-delphi-programs-in-browser.html' title='Run your Delphi programs in a browser'/><author><name>gabr42</name><uri>http://www.blogger.com/profile/06903558857617342477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29331675.post-7699215198717252640</id><published>2025-02-02T17:21:00.000+01:00</published><updated>2025-02-02T17:21:07.364+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="DelphiAndAI"/><category scheme="http://www.blogger.com/atom/ns#" term="LLM"/><title type='text'>Delphi and AI [7]: How good are local DeepSeek models (for Delphi)</title><content type='html'>&lt;p&gt;Due to potential privacy concerns with DeepSeek servers (we’re unsure if the data sent over the paid API is kept private), I looked into some smaller DeepSeek models available on the Ollama.com site. These models use less complex AI with fewer parameters than the online version, but they might still be good enough for an average Delphi programmer. We’ll see.&lt;/p&gt;&lt;p&gt;For testing, I used a powerful RTX 4090 card with 24 GB of memory. If your graphics card has less memory, your selection of useful models will be more limited.&lt;/p&gt;&lt;p&gt;I asked all models the same two questions: one on a general programming topic and another specific to the FireMonkey platform. The first question was:&lt;/p&gt;&lt;span style=&quot;font-family: helvetica;&quot;&gt;&lt;blockquote&gt;&amp;quot;I have a multiline string containing newline ASCII characters (TMemo.Text). I want to change it to a single-line string with only printable ASCII characters. I could do that with BASE64 encoding, for example. I would, however, like to keep the text as much readable as possible by &amp;quot;encoding&amp;quot; only non-printable characters. Is there a simple way to do that?&amp;quot;&lt;/blockquote&gt;&lt;/span&gt;&lt;p&gt;You can check Codellama’s response in an older post (Codellama being the only local model I had tested so far): &lt;a href=&quot;https://www.thedelphigeek.com/2025/01/delphi-and-ai5-encoding-multi-line.html#codellama&quot; target=&quot;_blank&quot;&gt;Delphi and AI [5]: Encoding Multi-line Strings&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Last week, I asked the same question to the online DeepSeek-Reasoning model. Check the answers in this post: &lt;a href=&quot;https://www.thedelphigeek.com/2025/01/delphi-and-ai6-deepseek-reasoning-model.html&quot; target=&quot;_blank&quot;&gt;Delphi and AI [6]: DeepSeek-Reasoning Model&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The second question was:&lt;/p&gt;&lt;span style=&quot;font-family: helvetica;&quot;&gt;&lt;blockquote&gt;&amp;quot;How can I copy text to clipboard in a Delphi Firemonkey application?&amp;quot;&lt;/blockquote&gt;&lt;/span&gt;&lt;p&gt;Read here for Codellama’s response: &lt;a href=&quot;https://www.thedelphigeek.com/2025/01/delphi-and-ai-4-device-independent.html#codellama&quot; target=&quot;_blank&quot;&gt;Delphi and AI [4]: Device-ndependent clipboard&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The answer from the online DeepSeek-Reasoning model can be found at the end of this post.&lt;/p&gt;&lt;p&gt;Let’s see how the models are performing! As always, full logs are available on &lt;a href=&quot;https://github.com/gabr42/DelphiAndAI/tree/main/07%20Comparing%20local%20DeepSeek%20models&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;http://www.thedelphigeek.com/2025/02/delphi-and-ai-7-how-good-are-local.html#more&quot;&gt;Read more »&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;font size=-2&gt;--- Published under the &lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons Attribution 3.0&lt;/a&gt; license&lt;/font&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.thedelphigeek.com/feeds/7699215198717252640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.thedelphigeek.com/2025/02/delphi-and-ai-7-how-good-are-local.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/7699215198717252640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/7699215198717252640'/><link rel='alternate' type='text/html' href='http://www.thedelphigeek.com/2025/02/delphi-and-ai-7-how-good-are-local.html' title='Delphi and AI [7]: How good are local DeepSeek models (for Delphi)'/><author><name>gabr42</name><uri>http://www.blogger.com/profile/06903558857617342477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29331675.post-7164284911645830418</id><published>2025-01-30T19:29:00.000+01:00</published><updated>2025-01-30T19:29:07.833+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="Chatterbox"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="DelphiAndAI"/><category scheme="http://www.blogger.com/atom/ns#" term="LLM"/><title type='text'>Chatterbox v0.2 - Now with DeepSeek support!</title><content type='html'>&lt;p&gt;As I’m writing this, a new Chatterbox release is available on &lt;a href=&quot;https://github.com/gabr42/Chatterbox/tree/main&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;. As with the initial release, you can either download the source and recompile it or grab an executable (Windows, 32-bit) from &lt;a href=&quot;https://github.com/gabr42/Chatterbox/releases/tag/v0.2&quot; target=&quot;_blank&quot;&gt;the release&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;i&gt;(If you have never heard of Chatterbox, you should probably read the &lt;a href=&quot;https://www.thedelphigeek.com/2024/12/delphi-and-ai-intermission-introducint.html&quot; target=&quot;_blank&quot;&gt;initial release article&lt;/a&gt;.)&lt;/i&gt;&lt;/p&gt;&lt;p&gt;The biggest change since v0.1 is support for &lt;b&gt;DeepSeek AI&lt;/b&gt;.&lt;/p&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;http://www.thedelphigeek.com/2025/01/chatterbox-v02-now-with-deepseek-support.html#more&quot;&gt;Read more »&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;font size=-2&gt;--- Published under the &lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons Attribution 3.0&lt;/a&gt; license&lt;/font&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.thedelphigeek.com/feeds/7164284911645830418/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.thedelphigeek.com/2025/01/chatterbox-v02-now-with-deepseek-support.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/7164284911645830418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/7164284911645830418'/><link rel='alternate' type='text/html' href='http://www.thedelphigeek.com/2025/01/chatterbox-v02-now-with-deepseek-support.html' title='Chatterbox v0.2 - Now with DeepSeek support!'/><author><name>gabr42</name><uri>http://www.blogger.com/profile/06903558857617342477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEg6E6VKlHZdrucKFPnw1y_7mqmHENQ6qUO3a3JVtaU_ZjIcsXTgTE4L_FyEZN3fm-rZsKGaOqk2czrQlpOXCa4AW4k4PQTAzZ6G6IjHkMhauELCUmAmcR2lbsSd8JplAyR0NwvkuhIvbrr7FqwiGGRhyjkkCEOsQRSxSSBlwC8mdPD_kYig6dfxLQ=s72-w400-h354-c" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29331675.post-4442069745976160240</id><published>2025-01-24T18:45:00.002+01:00</published><updated>2025-01-24T18:45:49.318+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="DelphiAndAI"/><category scheme="http://www.blogger.com/atom/ns#" term="LLM"/><title type='text'>Delphi and AI[6]: DeepSeek reasoning model (Encoding a multi-line string)</title><content type='html'>&lt;p&gt;An interesting AI has just appeared on my radar - DeepSeek. It exposes a &amp;quot;normal&amp;quot; chat model &lt;i&gt;deepseek-chat&lt;/i&gt; and a &amp;quot;reasoning&amp;quot; (that&amp;#39;s the interesting part) model &lt;i&gt;deepseek-reasoning&lt;/i&gt;. While working on DeepSeek support for the Chatterbox (more on that in few days) I thought it would be interesting to ask the &amp;quot;reasoning&amp;quot; model the &amp;quot;multi-line string encoding&amp;quot; question that every other AI has failed.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;Warning: DeepSeek privacy policy states: &amp;quot;&lt;i&gt;&lt;b&gt;When you use our Services, we may collect your text or audio input, prompt, uploaded files, feedback, chat history, or other content that you provide to our model and Services.&lt;/b&gt;&lt;/i&gt;&amp;quot; Don&amp;#39;t send any private or proprietary information in the chat!&lt;/blockquote&gt;&lt;p&gt;The log is provided on &lt;a href=&quot;https://github.com/gabr42/DelphiAndAI/tree/main/06%20Encoding%20multi-line%20string%20-%20DeepSeek%20reasoning&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;Just as a reminder, the question was:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style=&quot;font-family: helvetica;&quot;&gt;&amp;quot;I have a multiline string containing newline ASCII characters (TMemo.Text). I want to change it to a single-line string with only printable ASCII characters. I could do that with BASE64 encoding, for example. I would, however, like to keep the text as much readable as possible by &amp;quot;encoding&amp;quot; only non-printable characters. Is there a simple way to do that?&amp;quot;&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;http://www.thedelphigeek.com/2025/01/delphi-and-ai6-deepseek-reasoning-model.html#more&quot;&gt;Read more »&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;font size=-2&gt;--- Published under the &lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons Attribution 3.0&lt;/a&gt; license&lt;/font&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.thedelphigeek.com/feeds/4442069745976160240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.thedelphigeek.com/2025/01/delphi-and-ai6-deepseek-reasoning-model.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/4442069745976160240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/4442069745976160240'/><link rel='alternate' type='text/html' href='http://www.thedelphigeek.com/2025/01/delphi-and-ai6-deepseek-reasoning-model.html' title='Delphi and AI[6]: DeepSeek reasoning model (Encoding a multi-line string)'/><author><name>gabr42</name><uri>http://www.blogger.com/profile/06903558857617342477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29331675.post-5150093166415370833</id><published>2025-01-19T14:46:00.003+01:00</published><updated>2025-02-02T14:14:35.434+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="DelphiAndAI"/><category scheme="http://www.blogger.com/atom/ns#" term="LLM"/><title type='text'>Delphi and AI[5]: Encoding a multi-line string</title><content type='html'>&lt;p&gt;Recently I had to convert a multi-line string into a single-line string value for storage (ignore the &amp;#39;why&amp;#39; of it; let&amp;#39;s just blame it on a legacy code). My first idea was to do a Base64 encode of the string, but I was in a mood for some fun and so I asked my friendly AI helpers:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style=&quot;font-family: helvetica;&quot;&gt;&amp;quot;I have a multiline string containing newline ASCII characters (TMemo.Text). I want to change it to a single-line string with only printable ASCII characters. I could do that with BASE64 encoding, for example. I would, however, like to keep the text as much readable as possible by &amp;quot;encoding&amp;quot; only non-printable characters. Is there a simple way to do that?&amp;quot;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Let&amp;#39;s see what they came up with!&lt;/p&gt;&lt;p&gt;Full transcripts, as usual, are on &lt;a href=&quot;https://github.com/gabr42/DelphiAndAI/tree/main/05%20Encoding%20multi-line%20string&quot;&gt;GitHub&lt;/a&gt;. This time I had also created a program containing all implementations.&lt;/p&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;http://www.thedelphigeek.com/2025/01/delphi-and-ai5-encoding-multi-line.html#more&quot;&gt;Read more »&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;font size=-2&gt;--- Published under the &lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons Attribution 3.0&lt;/a&gt; license&lt;/font&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.thedelphigeek.com/feeds/5150093166415370833/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.thedelphigeek.com/2025/01/delphi-and-ai5-encoding-multi-line.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/5150093166415370833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/5150093166415370833'/><link rel='alternate' type='text/html' href='http://www.thedelphigeek.com/2025/01/delphi-and-ai5-encoding-multi-line.html' title='Delphi and AI[5]: Encoding a multi-line string'/><author><name>gabr42</name><uri>http://www.blogger.com/profile/06903558857617342477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29331675.post-2856193653051185894</id><published>2025-01-05T19:54:00.006+01:00</published><updated>2025-02-02T16:20:50.184+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="DelphiAndAI"/><category scheme="http://www.blogger.com/atom/ns#" term="LLM"/><title type='text'>Delphi and AI [4]: Device-independent clipboard</title><content type='html'>&lt;p&gt;While working on &lt;a href=&quot;https://www.thedelphigeek.com/2024/12/delphi-and-ai-intermission-introducint.html&quot; target=&quot;_blank&quot;&gt;Chatterbox&lt;/a&gt; I ran into number of problems, most of them caused by my limited knowledge of device-independent programming with Firemonkey. One particular challenge was copying data to the clipboard - something that is AFAIK available on all supported platforms. So I asked my friendly AI helpers:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: helvetica;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style=&quot;font-family: helvetica;&quot;&gt;&amp;quot;How can I copy text to clipboard in a Delphi Firemonkey application?&amp;quot;&lt;/span&gt;&lt;/blockquote&gt;As always, all logs are available on &lt;a href=&quot;https://github.com/gabr42/DelphiAndAI/tree/main/04%20Device-independent%20clipboard&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;.&lt;p&gt;&lt;/p&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;http://www.thedelphigeek.com/2025/01/delphi-and-ai-4-device-independent.html#more&quot;&gt;Read more »&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;font size=-2&gt;--- Published under the &lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons Attribution 3.0&lt;/a&gt; license&lt;/font&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.thedelphigeek.com/feeds/2856193653051185894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.thedelphigeek.com/2025/01/delphi-and-ai-4-device-independent.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/2856193653051185894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/2856193653051185894'/><link rel='alternate' type='text/html' href='http://www.thedelphigeek.com/2025/01/delphi-and-ai-4-device-independent.html' title='Delphi and AI [4]: Device-independent clipboard'/><author><name>gabr42</name><uri>http://www.blogger.com/profile/06903558857617342477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29331675.post-2151557747427345465</id><published>2024-12-25T10:27:00.006+01:00</published><updated>2025-01-06T08:49:34.931+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="DelphiAndAI"/><category scheme="http://www.blogger.com/atom/ns#" term="LLM"/><title type='text'>Delphi and AI [3]: The meaning of Christmas</title><content type='html'>&lt;p&gt;It&amp;#39;s the time of the year to be merry and have fun, so no code today!&lt;/p&gt;&lt;p&gt;I&amp;#39;ve decided to ask our future AI overlords about the meaning of Christmas. The Delphi way, of course!&lt;/p&gt;&lt;p&gt;Today I&amp;#39;m posting just the answer I liked the most. You can &lt;a href=&quot;https://github.com/gabr42/DelphiAndAI/tree/main/03%20The%20meaning%20of%20Christmas&quot; target=&quot;_blank&quot;&gt;read the others&lt;/a&gt; on GitHub.&lt;/p&gt;&lt;p&gt;Happy holidays, fellow programmers! And remember - &lt;b&gt;Delphi, it is the way&lt;/b&gt;!&lt;/p&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://github.com/gabr42/DelphiAndAI/blob/main/03%20The%20meaning%20of%20Christmas/happy%20holidays.png?raw=true&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Happy holidays!&quot; border=&quot;0&quot; data-original-height=&quot;1365&quot; data-original-width=&quot;2048&quot; height=&quot;266&quot; src=&quot;https://github.com/gabr42/DelphiAndAI/blob/main/03%20The%20meaning%20of%20Christmas/happy%20holidays.png?raw=true&quot; width=&quot;400&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;i&gt;As befits an article on AI-generated content, the image was created by &lt;a href=&quot;https://www.midjourney.com/jobs/07d93029-2479-406e-a6a3-c8be29617487?index=0&quot; target=&quot;_blank&quot;&gt;Midjourney&lt;/a&gt;.&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;http://www.thedelphigeek.com/2024/12/delphi-and-ai-3-meaning-of-christmas.html#more&quot;&gt;Read more »&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;font size=-2&gt;--- Published under the &lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons Attribution 3.0&lt;/a&gt; license&lt;/font&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.thedelphigeek.com/feeds/2151557747427345465/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.thedelphigeek.com/2024/12/delphi-and-ai-3-meaning-of-christmas.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/2151557747427345465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/2151557747427345465'/><link rel='alternate' type='text/html' href='http://www.thedelphigeek.com/2024/12/delphi-and-ai-3-meaning-of-christmas.html' title='Delphi and AI [3]: The meaning of Christmas'/><author><name>gabr42</name><uri>http://www.blogger.com/profile/06903558857617342477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29331675.post-6582518591603962910</id><published>2024-12-17T19:37:00.002+01:00</published><updated>2024-12-18T12:53:44.831+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="Chatterbox"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="DelphiAndAI"/><category scheme="http://www.blogger.com/atom/ns#" term="LLM"/><title type='text'>Delphi and AI [Intermission]: Introducing Chatterbox</title><content type='html'>&lt;p&gt;t’s great that Embarcadero has added an AI Chat window to RAD Studio, but let’s be honest—the implementation is lacking. As one participant at a recent workshop noted: &lt;em&gt;“It looks like someone wrote it two hours before the release.”&lt;/em&gt; Sadly, I have to agree. The AI Chat feature is practically useless if you intend to use AI for anything more than a quick demo.&lt;/p&gt;&lt;p&gt;That’s when I started considering better ways to interface with LLMs. Instead of searching for an alternative, I decided to build my own AI chat interface. It’s called &lt;strong&gt;Chatterbox&lt;/strong&gt;, and it’s fully open source. You can find it on &lt;a href=&quot;https://github.com/gabr42/Chatterbox/tree/main&quot; target=&quot;_blank&quot;&gt;GitHub &lt;/a&gt;under a “do with it (almost) whatever you want” license.&lt;/p&gt;&lt;p&gt;To start using Chatterbox, you can either build it from source or download the precompiled EXE from &lt;a href=&quot;https://github.com/gabr42/Chatterbox/releases&quot; target=&quot;_blank&quot;&gt;GitHub &lt;/a&gt;(currently available only for Windows 32-bit). The app is written with FireMonkey, so—at least theoretically—it can also be built for macOS, iOS, Android, and Linux. However, I haven’t tested it on platforms other than Windows.&lt;/p&gt;&lt;p&gt;To build Chatterbox, you’ll need the following libraries: &lt;strong&gt;Spring4D&lt;/strong&gt;, &lt;strong&gt;DCPCrypt2&lt;/strong&gt;, and &lt;strong&gt;TAES&lt;/strong&gt;. Links to these dependencies are included in the &lt;a href=&quot;https://github.com/gabr42/Chatterbox/blob/main/README.md&quot;&gt;README &lt;/a&gt;file.&lt;/p&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;http://www.thedelphigeek.com/2024/12/delphi-and-ai-intermission-introducint.html#more&quot;&gt;Read more »&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;font size=-2&gt;--- Published under the &lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons Attribution 3.0&lt;/a&gt; license&lt;/font&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.thedelphigeek.com/feeds/6582518591603962910/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.thedelphigeek.com/2024/12/delphi-and-ai-intermission-introducint.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/6582518591603962910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/6582518591603962910'/><link rel='alternate' type='text/html' href='http://www.thedelphigeek.com/2024/12/delphi-and-ai-intermission-introducint.html' title='Delphi and AI [Intermission]: Introducing Chatterbox'/><author><name>gabr42</name><uri>http://www.blogger.com/profile/06903558857617342477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29331675.post-7157035604933678169</id><published>2024-12-11T22:05:00.002+01:00</published><updated>2025-01-05T19:48:32.394+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="DelphiAndAI"/><category scheme="http://www.blogger.com/atom/ns#" term="LLM"/><title type='text'>Delphi and AI [2]: Clipboard Monitor</title><content type='html'>&lt;p&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;While preparing for my &lt;a href=&quot;https://www.thedelphigeek.com/2024/12/recently-i-led-workshop-in-slovenia.html&quot;&gt;Delphi and AI workshop&lt;/a&gt;, I decided to keep a log of all my interactions with AI helpers in a file for later analysis. Initially, I searched for an existing utility to log clipboard changes to a file (and I found one), but then I thought—why not ask the AI helpers to help me create one? After all, it’s not a big problem: set up a timer, check if the clipboard content changes, and log the content to a file. What could be simpler?&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;I posed the same question to all five engines:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style=&quot;font-family: helvetica;&quot;&gt;&amp;quot;I want to create a Delphi application that would monitor clipboard content (on Windows) and append clipboard content to a log file each time the clipboard has changed (and has a text inside).&amp;quot;&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Let&amp;#39;s see how they performed!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/gabr42/DelphiAndAI/tree/main/02%20Clipboard%20monitor&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Logs and code are available here.&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;http://www.thedelphigeek.com/2024/12/delphi-and-ai-2-clipboard-monitor.html#more&quot;&gt;Read more »&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;font size=-2&gt;--- Published under the &lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons Attribution 3.0&lt;/a&gt; license&lt;/font&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.thedelphigeek.com/feeds/7157035604933678169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.thedelphigeek.com/2024/12/delphi-and-ai-2-clipboard-monitor.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/7157035604933678169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/7157035604933678169'/><link rel='alternate' type='text/html' href='http://www.thedelphigeek.com/2024/12/delphi-and-ai-2-clipboard-monitor.html' title='Delphi and AI [2]: Clipboard Monitor'/><author><name>gabr42</name><uri>http://www.blogger.com/profile/06903558857617342477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29331675.post-3278365912484725725</id><published>2024-12-07T12:01:00.013+01:00</published><updated>2025-01-05T19:58:15.802+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="DelphiAndAI"/><category scheme="http://www.blogger.com/atom/ns#" term="LLM"/><title type='text'>Delphi and AI</title><content type='html'>&lt;p&gt;Recently, I led a workshop in Slovenia where we explored the current state of AI in relation to Delphi programming. &lt;em&gt;(A note to participants: the slides are finally &lt;a href=&quot;https://www.thedelphigeek.com/p/presentations.html&quot;&gt;online&lt;/a&gt;—apologies for the delay!)&lt;/em&gt; The initial results were, let’s say, interesting enough to warrant further study.&lt;/p&gt;&lt;p&gt;Now, let’s see how today’s &amp;quot;state-of-the-art&amp;quot; AIs perform with Delphi programming!&lt;/p&gt;&lt;p&gt;The contenders are:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;b&gt;OpenAI &lt;/b&gt;with the &lt;i&gt;o1-mini&lt;/i&gt; model (my testing suggests that it gives better results than &lt;i&gt;chatgpt-4o&lt;/i&gt;)&lt;/li&gt;&lt;li&gt;&lt;b&gt;Ollama &lt;/b&gt;with &lt;i&gt;codellama:13b&lt;/i&gt; model (the largest model I can run on my NVidia 4090)&lt;/li&gt;&lt;li&gt;&lt;b&gt;Gemini &lt;/b&gt;with &lt;i&gt;gemini-pro &lt;/i&gt;(currently pointing to &lt;i&gt;gemini-1.5-pro&lt;/i&gt;)&lt;/li&gt;&lt;li&gt;&lt;b&gt;Claude &lt;/b&gt;with &lt;i&gt;claude-3-5-sonnet-latest&lt;/i&gt; (at this moment this resolves to &lt;i&gt;claude-3-5-sonnet-20241022&lt;/i&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;As I care for the privacy of the code I send to these tools, I&amp;#39;m using a paid version of Gemini.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;These four engines I&amp;#39;ll be using directly from the RAD Studio, most of the time through the &amp;quot;AI Chat&amp;quot; panel. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;When the privacy wouldn&amp;#39;t be a concern, I&amp;#39;ll also be using:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;b&gt;CoPilot&lt;/b&gt; via Microsoft Edge (I use it a lot and I like it for general-purpose questions with googlable answers)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;All chat logs will be published on &lt;a href=&quot;https://github.com/gabr42/DelphiAndAI&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;. &lt;/div&gt;&lt;/div&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;http://www.thedelphigeek.com/2024/12/recently-i-led-workshop-in-slovenia.html#more&quot;&gt;Read more »&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;font size=-2&gt;--- Published under the &lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons Attribution 3.0&lt;/a&gt; license&lt;/font&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.thedelphigeek.com/feeds/3278365912484725725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.thedelphigeek.com/2024/12/recently-i-led-workshop-in-slovenia.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/3278365912484725725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/3278365912484725725'/><link rel='alternate' type='text/html' href='http://www.thedelphigeek.com/2024/12/recently-i-led-workshop-in-slovenia.html' title='Delphi and AI'/><author><name>gabr42</name><uri>http://www.blogger.com/profile/06903558857617342477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29331675.post-4750878984559525207</id><published>2024-11-19T12:18:00.007+01:00</published><updated>2024-11-19T12:18:57.093+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="presentations"/><title type='text'>RAD Studio 12.2 and AI helpers</title><content type='html'>&lt;p&gt;This is an invitation to the workshop in Ljubljana next week. As the session will be in Slovenian language, so is this invitation ...&lt;/p&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextBlock&quot; style=&quot;background-color: white; border-collapse: collapse; color: black; font-family: Consolas, calibri, arial; font-size: 12px; min-width: 100%; text-size-adjust: 100%; width: 100%;&quot;&gt;&lt;tbody class=&quot;mcnTextBlockOuter&quot;&gt;&lt;tr&gt;&lt;td class=&quot;mcnTextBlockInner&quot; style=&quot;padding-top: 9px; text-size-adjust: 100%;&quot; valign=&quot;top&quot;&gt;&lt;table align=&quot;left&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextContentContainer&quot; style=&quot;border-collapse: collapse; float: left; max-width: 100%; min-width: 100%; text-size-adjust: 100%; width: 100%;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;mcnTextContent&quot; style=&quot;color: #757575; font-family: Helvetica; font-size: 16px; line-height: 24px; padding: 0px 18px 9px; text-size-adjust: 100%; word-break: break-word;&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;line-height: 24px; margin: 10px 0px; padding: 0px; text-size-adjust: 100%;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;Odkar smo se nazadnje srečali, je minilo kar nekaj časa. Medtem je izšla nova različica&lt;strong&gt;&amp;nbsp;RAD Studio 12.2.&lt;/strong&gt;&amp;nbsp;Ta med drugim prinaša novost, ki smo jo vsi čakali&amp;nbsp;-&amp;nbsp;&lt;strong&gt;integracijo umetne inteligence&lt;/strong&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 24px; margin: 10px 0px; padding: 0px; text-size-adjust: 100%;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;Pridružite se nam na delavnici, kjer bomo predstavili &amp;nbsp;novosti v&amp;nbsp;&lt;strong&gt;RAD Studiu 12.2&lt;/strong&gt;.,podporne sisteme&amp;nbsp;&lt;strong&gt;ChatGPT&lt;/strong&gt;,&amp;nbsp;&lt;strong&gt;Gemini, Claude in Ollama&amp;nbsp;&lt;/strong&gt;ter skušali ugotoviti, ali so že dovolj napredni, da jih lahko Delphi programerji uporabljajo pri svojem delu.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 24px; margin: 10px 0px; padding: 0px; text-size-adjust: 100%;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;Poigrali se bomo z računalniškimi pomočniki in preizkusili vaše ideje&amp;nbsp;o uporabi teh orodij.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 24px; margin: 10px 0px; padding: 0px; text-size-adjust: 100%;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;Vidimo se v &lt;b&gt;sredo, 27. 11.&lt;/b&gt;, ob &lt;b&gt;9.30&lt;/b&gt; v prostorih OOZ Vič, Tržaška cesta 207, Ljubljana!&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 24px; margin: 10px 0px; padding: 0px; text-size-adjust: 100%;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;a href=&quot;https://mailchi.mp/integralis.si/embarcadero-rad-studio-122&quot; target=&quot;_blank&quot;&gt;Klikni za prijavo!&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;font size=-2&gt;--- Published under the &lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons Attribution 3.0&lt;/a&gt; license&lt;/font&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.thedelphigeek.com/feeds/4750878984559525207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.thedelphigeek.com/2024/11/rad-studio-122-and-ai-helpers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/4750878984559525207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/4750878984559525207'/><link rel='alternate' type='text/html' href='http://www.thedelphigeek.com/2024/11/rad-studio-122-and-ai-helpers.html' title='RAD Studio 12.2 and AI helpers'/><author><name>gabr42</name><uri>http://www.blogger.com/profile/06903558857617342477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29331675.post-6015533707565725203</id><published>2024-04-05T09:39:00.006+02:00</published><updated>2024-04-05T09:39:52.723+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="presentations"/><category scheme="http://www.blogger.com/atom/ns#" term="Python"/><title type='text'>Delphi and Python, working happily together</title><content type='html'>&lt;p&gt;Next Wednesday, 10th, I&#39;ll be talking about Delphi and Pyhon in Ljubljana. As usual for Slovenian workshops, the talk will be in Slovenian language so I&#39;ll continue this invitation appropriately ...&lt;/p&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;MsoNormalTable&quot; style=&quot;background-color: white; border-collapse: collapse; font-family: Consolas, calibri, arial; min-width: 100%; text-size-adjust: 100%; width: 100%;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding: 6.75pt 0cm 0cm; text-size-adjust: 100%;&quot; valign=&quot;top&quot;&gt;&lt;table align=&quot;left&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;MsoNormalTable&quot; style=&quot;border-collapse: collapse; margin-left: -2.25pt; margin-right: -2.25pt; text-size-adjust: 100%; width: 100%;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding: 0cm; text-size-adjust: 100%; width: 450pt;&quot; valign=&quot;top&quot; width=&quot;600&quot;&gt;&lt;table align=&quot;left&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;MsoNormalTable&quot; style=&quot;border-collapse: collapse; text-size-adjust: 100%; width: 100%;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding: 0cm 13.5pt 6.75pt; text-size-adjust: 100%;&quot; valign=&quot;top&quot;&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: Aptos, sans-serif; font-size: 11pt; line-height: 22px; margin: 0cm 0cm 7.5pt; text-size-adjust: 100%;&quot;&gt;&lt;strong&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Helvetica, sans-serif;&quot;&gt;Python&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Helvetica, sans-serif;&quot;&gt;je izjemno priljubljen programski jezik, ki slovi po svoji raznoliki in preprosti uporabi. Skupnost razvijalcev nenehno prispeva k njegovemu razvoju in izboljšanju jezika,&amp;nbsp;kar dodatno krepi njegovo privlačnost za širok nabor uporabnikov. Kot večina večplatformnih sistemov pa ne slovi po podpori za izdelavo uporabniških vmesnikov.&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #757575; font-family: Helvetica, sans-serif;&quot;&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: Aptos, sans-serif; font-size: 11pt; line-height: 22px; margin: 0cm 0cm 7.5pt; text-size-adjust: 100%;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Helvetica, sans-serif;&quot;&gt;Tu nastopi&amp;nbsp;&lt;strong&gt;Delphi&lt;/strong&gt;, ki slovi po svoji hitrosti in učinkovitosti in je odličen za razvoj aplikacij za Windows okolje. Zato ni presenetljivo, da okolji ne delujeta kot neposredna konkurenca, pač pa&amp;nbsp;se izredno dobro&amp;nbsp;&lt;strong&gt;dopolnjujeta&lt;/strong&gt;.&amp;nbsp;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #757575; font-family: Helvetica, sans-serif;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: Aptos, sans-serif; font-size: 11pt; line-height: 22px; margin: 0cm 0cm 7.5pt; text-size-adjust: 100%;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Helvetica, sans-serif;&quot;&gt;Največja prednost je združevanje moči obeh jezikov. Delphi ponuja hitrost in zmogljivost, Python pa berljivost in obsežno knjižnico razširitev.&amp;nbsp;&lt;strong&gt;S tem lahko razvijalci izkoristite najboljše iz obeh svetov.&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;MsoNormalTable&quot; style=&quot;background-color: white; border-collapse: collapse; font-family: Consolas, calibri, arial; min-width: 100%; text-size-adjust: 100%; width: 100%;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding: 6.75pt 0cm 0cm; text-size-adjust: 100%;&quot; valign=&quot;top&quot;&gt;&lt;table align=&quot;left&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;MsoNormalTable&quot; style=&quot;border-collapse: collapse; margin-left: -2.25pt; margin-right: -2.25pt; text-size-adjust: 100%; width: 100%;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding: 0cm; text-size-adjust: 100%; width: 450pt;&quot; valign=&quot;top&quot; width=&quot;600&quot;&gt;&lt;table align=&quot;left&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;MsoNormalTable&quot; style=&quot;border-collapse: collapse; text-size-adjust: 100%; width: 100%;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding: 0cm 13.5pt 6.75pt; text-size-adjust: 100%;&quot; valign=&quot;top&quot;&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: Aptos, sans-serif; font-size: 11pt; line-height: 22px; margin: 0cm 0cm 7.5pt; text-size-adjust: 100%;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Helvetica, sans-serif;&quot;&gt;Na predavanju si bomo ogledali:&amp;nbsp;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #222222; font-family: Helvetica, sans-serif;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;margin-bottom: 0cm;&quot; type=&quot;disc&quot;&gt;&lt;li class=&quot;MsoNormal&quot; style=&quot;color: #222222; font-family: Aptos, sans-serif; font-size: 11pt; line-height: 22px; margin: 0cm; text-size-adjust: 100%;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; font-family: Helvetica, sans-serif;&quot;&gt;Kako lahko Python in Delphi sodelujeta na dva različna načina,&amp;nbsp;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Helvetica, sans-serif;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;MsoNormal&quot; style=&quot;color: #222222; font-family: Aptos, sans-serif; font-size: 11pt; line-height: 22px; margin: 0cm; text-size-adjust: 100%;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; font-family: Helvetica, sans-serif;&quot;&gt;predstavili bomo orodji DelphiVCL in DelphiFMX, s katerima lahko v Pythonu enostavno ustvarite lep uporabniški vmesnik&amp;nbsp;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Helvetica, sans-serif;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;MsoNormal&quot; style=&quot;color: #222222; font-family: Aptos, sans-serif; font-size: 11pt; line-height: 22px; margin: 0cm; text-size-adjust: 100%;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; font-family: Helvetica, sans-serif;&quot;&gt;ter nekaj orodij (Python4Delphi, PythonEnvironments, Lightweight Python Wrappers), ki omogočajo, da kodo, napisano v Pythonu, vgradite v svoj Delphi program.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style=&quot;font-family: Helvetica, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: Helvetica, sans-serif; font-size: 14.6667px;&quot;&gt;Spotoma si bomo na kratko ogledali še novosti v novem&amp;nbsp;&lt;/span&gt;&lt;b style=&quot;font-family: Helvetica, sans-serif; font-size: 14.6667px;&quot;&gt;Delphi 12.1&lt;/b&gt;&lt;span style=&quot;font-family: Helvetica, sans-serif; font-size: 14.6667px;&quot;&gt;!&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;a href=&quot;https://mailchi.mp/integralis.si/embarcadero-python-delphi-seminar&quot;&gt;Kliknite za prijavo!&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;font size=-2&gt;--- Published under the &lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons Attribution 3.0&lt;/a&gt; license&lt;/font&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.thedelphigeek.com/feeds/6015533707565725203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.thedelphigeek.com/2024/04/delphi-and-python-working-happily.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/6015533707565725203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/6015533707565725203'/><link rel='alternate' type='text/html' href='http://www.thedelphigeek.com/2024/04/delphi-and-python-working-happily.html' title='Delphi and Python, working happily together'/><author><name>gabr42</name><uri>http://www.blogger.com/profile/06903558857617342477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29331675.post-1551706657050633665</id><published>2023-12-02T13:27:00.004+01:00</published><updated>2023-12-02T13:27:45.943+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C++Builder"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="presentations"/><category scheme="http://www.blogger.com/atom/ns#" term="RAD Studio"/><title type='text'>Learn all about RAD Studio 12 in Ljubljana</title><content type='html'>&lt;p&gt;Next week I&amp;#39;ll present all about the new RAD Studio 12 in Ljubljana. As usual, the presentation will be in Slovenian language and so will be the rest of this post ...&lt;/p&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;http://www.thedelphigeek.com/2023/12/learn-all-about-rad-studio-12-in.html#more&quot;&gt;Read more »&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;font size=-2&gt;--- Published under the &lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons Attribution 3.0&lt;/a&gt; license&lt;/font&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.thedelphigeek.com/feeds/1551706657050633665/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.thedelphigeek.com/2023/12/learn-all-about-rad-studio-12-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/1551706657050633665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/1551706657050633665'/><link rel='alternate' type='text/html' href='http://www.thedelphigeek.com/2023/12/learn-all-about-rad-studio-12-in.html' title='Learn all about RAD Studio 12 in Ljubljana'/><author><name>gabr42</name><uri>http://www.blogger.com/profile/06903558857617342477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29331675.post-7494814653359703533</id><published>2023-07-21T16:20:00.001+02:00</published><updated>2023-07-21T16:20:15.591+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="open source"/><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><category scheme="http://www.blogger.com/atom/ns#" term="source code"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><title type='text'>CQLBr for Delph/Lazarus</title><content type='html'>&lt;p&gt;It is so nice when you see how a small idea grows into a nice, rounded project!&lt;/p&gt;&lt;p&gt;Years age I wrote a unit that allowed you to write SQL statements as Pascal code (&lt;a href=&quot;https://www.thedelphigeek.com/search/label/SQL&quot; target=&quot;_blank&quot;&gt;GpSQLBuilder&lt;/a&gt;). This has allowed me to write a code like this:&lt;/p&gt;&lt;pre style=&quot;background-color: #fefdfa; color: #333333; font-size: 13px; line-height: normal;&quot;&gt;&lt;code&gt;&lt;span class=&quot;pas1-space&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span class=&quot;pas1-identifier&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;query&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;pas1-space&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;pas1-symbol&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;:=&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;pas1-space&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;pas1-identifier&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;CreateGpSQLBuilder;&lt;br&gt;  query&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;pas1-space&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;pas1-symbol&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;.&lt;strong&gt;Select&lt;/strong&gt;.&lt;strong&gt;All&lt;/strong&gt;&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;pas1-space&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;pas1-symbol&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;.&lt;strong&gt;From&lt;/strong&gt;(DB_TEST)&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;pas1-space&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;pas1-symbol&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;.&lt;strong&gt;OrderBy&lt;/strong&gt;(&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;pas1-space&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;      &lt;span class=&quot;pas1-identifier&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;query&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;pas1-identifier&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;strong&gt;&amp;amp;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;pas1-reservedword&quot;&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: black;&quot;&gt;Case&lt;/span&gt;&lt;/strong&gt;&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;pas1-space&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;pas1-symbol&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;.&lt;strong&gt;When&lt;/strong&gt;([COL_2,&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;pas1-space&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;pas1-string&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;&amp;#39;&amp;lt; 0&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;pas1-symbol&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;]).&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;strong&gt;&amp;amp;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;pas1-reservedword&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: black;&quot;&gt;Then&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span class=&quot;pas1-symbol&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;(COL_3)&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;pas1-space&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;pas1-symbol&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;strong&gt;&amp;amp;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;pas1-reservedword&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: black;&quot;&gt;Else&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span class=&quot;pas1-symbol&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;(COL_4)&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;pas1-space&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;pas1-symbol&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;strong&gt;&amp;amp;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;pas1-reservedword&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: black;&quot;&gt;End&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;pas1-symbol&quot;&gt;&lt;span style=&quot;color: black; font-size: 12pt;&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It was a small project with minimum support -- as long as it generated SQL code that I&amp;#39;ve needed, I was fine with it. Much of the SQL language support was missing, there was no support for different SQL dialects and so on ...&lt;/p&gt;&lt;p&gt;Luckilly, Isaque Pinheiro liked the idea and converted it into a full-fledged library with support for multiple SQL dialects, much more complete SQL language support, units tests, installer, a ton of samples and more. &lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;a href=&quot;http://www.thedelphigeek.com/2023/07/cqlbr-for-delphlazarus.html#more&quot;&gt;Read more »&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;font size=-2&gt;--- Published under the &lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons Attribution 3.0&lt;/a&gt; license&lt;/font&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.thedelphigeek.com/feeds/7494814653359703533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.thedelphigeek.com/2023/07/cqlbr-for-delphlazarus.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/7494814653359703533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29331675/posts/default/7494814653359703533'/><link rel='alternate' type='text/html' href='http://www.thedelphigeek.com/2023/07/cqlbr-for-delphlazarus.html' title='CQLBr for Delph/Lazarus'/><author><name>gabr42</name><uri>http://www.blogger.com/profile/06903558857617342477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry></feed>