Not much to add. I'm (finally) changing my registrar and DNS provider. Hope everything goes smootly, but it might be that the site and blog are not working in the few coming days. The physical server is not moving, so there should be no big trouble.
Moving DNS, Some Hiccups Expected
VIDEO TUTORIAL #4/#5: FireDAC Fetching, Monitor / Neue VCL Komponenten

Hier, nach einiger Zeit, mal wieder zwei weitere Video Tutorials
Video Tutorial #4: FireDAC Monitor & FireDAC Fetching
Video Tutorial #5: Neue VCL Komponenten in RAD Studio 10.2 Release 2
My Year in Cities 2017
This is my end-of-the-year blog post listing places I've visited in 2017 for at least one night (plus some relevant daily trips, marked with an asterisk), in chronological order. At times, the reason for the trip is listed:
Torino (Italy)*
Trento (Italy)*
Sydney (Australia)
Brisbane (Australia), ADUG conference
Melbourne (Australia), ADUG conference
Altdorf (Switzerland)
Sprendlingen (Germany)
Nieuwegein (Netherlands)
Amsterdam (Netherlands)
Texel Island (Netherlands)
Nieuw Vennep (Netherlands)
Rotterdam (Netherlands)
Bruxelles (Belgium)
Vincey (France)
Colmar (France)
Berlin (Germany)
Zegrze (Poland), Delphi conference
Pisa (Italy)*
Frascati (Italy), ITDevCon conference
Koln (Germany), EKON conference
Viareggio (Italy)
Lucca (Italy)*, Lucca Comics event
Katowice (Poland)*
Ravenna (Italy)*
While I've been traveling a bit, my trips this year have been limited to Europe, plus a long trip to Australia. Planning a trip to the US within a few weeks, and spend some time booking flights today. Good sign.
Have a great 2018 full of health and happiness (and traveling!).
Experimenting with Neural Networks – Part 8
Best viewed full screen (recorded 1080p)
HTTP Protocol Related Improvements in Delphi 10.2.2
The new features for the HTTP client library offer more flexibility and options in terms of protocol and standards support.
Better Secure Protocols Support
The first change is the improved support for security protocols. In the past it wasn't possible to specify the required security protocols (TLS1.1, TLS1.2, etc.) for an HTTP request. We have added a new enumeration, THTTPSecureProtocol with the values (SSL2, SSL3, TLS1, TLS11, TLS12). THPPTClient and related classes have now a SecureProtocols property which is a set based on that enumeration.
The property (available only at run-time) controls which security protocols to use and it is currently implemented only for Windows. This was requested in our Quality Portal at https://quality.embarcadero.com/browse/RSP-18713
HTTP Redirect Improvements
Another set of improvements is in the way the HTTP client library handles redirects. There is a new RedirectsWithGET runtime property offering another set of options, this time based on the following enumeration:
THTTPRedirectWithGET = (Post301, Post302, Post303, Post307, Post308, Put301, Put302, Put303, Put307, Put308, Delete301, Delete302, Delete303, Delete307, Delete308);The property controls which request method and response status must be redirected using GET method and it was reported in several entries in QP, including https://quality.embarcadero.com/browse/RSP-14671.
New REST Client Events OnNeedClientCert and OnAuthEvent
These events corresponds to their HTTPClient counterparts and are now surfaces at a higher level:
TRESTClient.OnNeedClientCertificate: TNeedClientCertificateEvent TRESTClient.OnAuthEvent: TCredentialAuthEventThis was requested in https://quality.embarcadero.com/browse/RSP-15857
MIME Name Helper
We added a function that to the TEncoding support, which returns the encoding MIME for a speficied encoding:
function GetEncodingMimeName(AEncoding: TEncoding): string;
Changed TIniFile Behaviour
This one is totally unrelated, beside the fact it was also done in 10.2.2. The Ini File behavior was platform specific, not is it platform independent. On Windows, TIniFile ReadString ignores the case of Key parameter. On Linux, the ReadString call was case sensitive, leading to issues when migrating code and configuration files. Now by default TIniFile content structure (not the actual values) is treated in a case-insensitive way on all supported platforms.
HTTP Protocol Related Improvements in Delphi 10.2.2
The new features for the HTTP client library offer more flexibility and options in terms of protocol and standards support.
Better Secure Protocols Support
The first change is the improved support for security protocols. In the past it wasn't possible to specify the required security protocols (TLS1.1, TLS1.2, etc.) for an HTTP request. We have added a new enumeration, THTTPSecureProtocol with the values (SSL2, SSL3, TLS1, TLS11, TLS12). THPPTClient and related classes have now a SecureProtocols property which is a set based on that enumeration.
The property (available only at run-time) controls which security protocols to use and it is currently implemented only for Windows. This was requested in our Quality Portal at https://quality.embarcadero.com/browse/RSP-18713
HTTP Redirect Improvements
Another set of improvements is in the way the HTTP client library handles redirects. There is a new RedirectsWithGET runtime property offering another set of options, this time based on the following enumeration:
THTTPRedirectWithGET = (Post301, Post302, Post303, Post307, Post308, Put301, Put302, Put303, Put307, Put308, Delete301, Delete302, Delete303, Delete307, Delete308);
The property controls which request method and response status must be redirected using GET method and it was reported in several entries in QP, including https://quality.embarcadero.com/browse/RSP-14671.
New REST Client Events OnNeedClientCert and OnAuthEvent
These events corresponds to their HTTPClient counterparts and are now surfaces at a higher level:
TRESTClient.OnNeedClientCertificate: TNeedClientCertificateEvent TRESTClient.OnAuthEvent: TCredentialAuthEvent
This was requested in https://quality.embarcadero.com/browse/RSP-15857
MIME Name Helper
We added a function that to the TEncoding support, which returns the encoding MIME for a speficied encoding:
function GetEncodingMimeName(AEncoding: TEncoding): string;
Changed TIniFile Behaviour
This one is totally unrelated, beside the fact it was also done in 10.2.2. The Ini File behavior was platform specific, not is it platform independent. On Windows, TIniFile ReadString ignores the case of Key parameter. On Linux, the ReadString call was case sensitive, leading to issues when migrating code and configuration files. Now by default TIniFile content structure (not the actual values) is treated in a case-insensitive way on all supported platforms.
Upgrade Produkte werden zum Ende März 2018 eingestellt

Hier eine interessante Nachricht von Ananas Popov (dem General Manager von Embarcadero) in deutscher Sprache
Sehr geehrte Kunden,
Vor einigen Jahren führten wir das "Update Subscription-Programm" ein. Mit dieser Form der Lizenzierung reagierten wir auf einen Trend der Branche, weg von regelmäßigen Upgrades hin zu fortlaufenden Abonnements, um unsere Kunden auf dem neuesten Stand zu halten. Unsere Produkt-Roadmap und unsere Marktstrategie folgen dieser Philosophie.
Wir haben viele langjährige und treue Kunden, die unsere Produkte gern auf ihre gewohnte Art und Weise erwerben. Deshalb haben wir die Upgrade-Produkte auch in den letzten zwei Jahren weiter angeboten. Da unsere Kunden einen größtmöglichen zeitlichen Vorlauf für die Ankündigung von Änderungen wünschen und uns das auch laut und deutlich wissen lassen, möchte ich Sie schon heute über die geplante Einstellung der Upgrade Produkte informieren.
Es ist uns ein Anliegen, es allen so einfach wie möglich zu machen, die Vorteile der neuesten, von uns entwickelten Funktionen zu nutzen sowie von Fehlerbehebungen zu profitieren. Mit dem Stand von heute sind die meisten unserer Kunden längst Abonnenten der Update Subscription und klassische Upgrade-Produkte werden kaum noch nachgefragt. Darüber hinaus hörten wir von einigen Kunden, dass sie bei unseren letzten Werbeaktionen durch Upgrades bei ihren Kaufentscheidungen eher verwirrt wurden.
Da so ziemlich alle anderen Anbieter Upgrade-Produkte aus ähnlichen Gründen aus ihrem Portfolio entfernt haben, werden auch wir mit dem Ende von diesem Quartal, am 31. März 2018 den Verkauf von Upgrade-Produkten einstellen. Wir möchten jedoch allen unseren Kunden, die den Upgradepfad nutzen wollen, genügend Zeit und Gelegenheit für die Umstellung geben. Wir haben in den letzten Jahren schon mehrere sogenannte "Amnesty-Aktionen" durchgeführt und so Kunden mit älteren Versionen Zugriff auf Upgrades gewährt. Wir werden noch eine weitere starten, bevor wir Upgrade-Produkte aus dem Angebot nehmen. Upgrades zwischen den Editionen werden wir natürlich auch weiterhin anbieten, da wir sowohl die Enterprise- als auch die Architect-Edition für die Entwicklung von Unternehmensanwendungen noch attraktiver gestalten werden. Im Großen und Ganzen ist das keine wirklich große Umstellung, da nur noch wenige Kunden betroffen sein werden, aber dennoch möchten wir nicht, dass diese Änderung für Sie überraschend kommt.
Gemeinsam haben wir RAD Studio für die Entwicklung in Delphi und C++ zu einem Erfolg gemacht. Sorgfältig beobachten wir die Angebote der Konkurrenz und sind davon überzeugt, dass der Wert, den Kunden mit unseren Produkten erhalten, die Kosten mehr als rechtfertigt. Ich hoffe, Sie sehen das genauso. Wir sind entschlossen, auch weiterhin in unsere Produkte zu investieren, um Ihre Investitionskalkulation zum Kinderspiel zu machen. Ich freue mich sehr auf die kommenden Versionen. Sowohl auf die Version 10.2.3, die wir noch in diesem Quartal erwarten, als auch auf 10.3 im nächsten Quartal, die einige großartige Funktionen und Qualitätsverbesserungen bieten wird. 2018 ist ein weiteres Jahr, in dem das Momentum von Delphi und C++Builder noch mehr zunehmen wird - Weiter so, RAD Studio!!!
Zögern Sie nicht, mich jederzeit direkt zu kontaktieren. Wir hören liebend gerne von Kunden, die sich für unsere Produkte interessieren.
Mit freundlichen Grüßen
Atanas
Try-Finally Blocks for Protecting Multiple Resources in Delphi
The Delphi language shares with many others a standard resource allocation pattern to make sure that in case of an exception the resources is properly released. Resources in this context are memory objects, files, operating system objects and handles, and the like. In Delphi, compared to other languages with a garbage collector, the relevance increased by memory management considerations.
Protecting a Single Object
In the most simple cases, you'd write code like:
allocate resource try use resource finally free resource end;A more specific example would be like:
A1 := TTest.Create; try A1.DoSomething; finally A1.Free; end;So far, so good. Notice that is an error happen during the constructor execution, Delphi will automatically execute the destructor for the partially initialized object (but this could be a topic for another blog post).
Protecting Two Objects: How NOT to Write the Code
The issue I want to focus on is how to write the same type of code if you need to allocate and dispose two resources. Here there are multiple options. What you shouldn't do (but is fairly common) is to write:
A1 := TTest.Create; A2 := TTest.Create; try A1.DoSomething; A2.DoSomething (A1); finally A2.Free; A1.Free; end;The issue with this code is that in case the creation of A2 fails (and there could be many reasons), the A1 object would remain in memory. Simply pushing the second allocation within the try block is also not good:
A1 := TTest.Create; try A2 := TTest.Create; A1.DoSomething; A2.DoSomething (a); finally A2.Free; A1.Free; end;With this code in case of a failure in object A2 constructor call, the finally block will try to Free an uninitialized object (the default value of a local object reference is undefined). This is why a possible solution is to set A2 to nil at the beginning -- as calling Free on a nil object has no effect. Or set all object reference to nil for simplicity and uniformity. Or write two nested try blocks to protect each of the resources.
Protecting Two Objects: A Tale of Three Solutions
This long introduction brings us to the point of this blog post. There are at least 3 different correct solution for the issue of protecting two resources in the same code block, as I just mentioned. Here are the three solutions in an image I "borrowed" from one of our RAD Studio R&D architects, Bruneau Babet.
Provided they are all correct in terms of proper resource management in all scenarios, which are the advantages and disadvantages of these 3 solutions? What is important to consider is that the 2 resources could be 3, or 4 or half a dozen.
Which One to Pick?
The first solution with the nested try blocks fairly clean but more verbose (more lines of code) and has additional nesting that could become an annoyance with multiple resources. Also, there is a runtime cost associated with try blocks, clearly limited but not zero.
The second solution has the least amount of lines of code code and the least amount of runtime cost. The only additional is setting A2 to nil. The code remains readable also with many resources. However, the code is "unbalanced" and it might be slightly confusing.
The third solution goes in the same direction, but it adds one extra technically useless assignment to nil (for A1), offering the advantage of being cleaner and more balanced, and likely more readable after all.
So what's the best solution? This is really hard to tell,. I personally mostly used #1 in my books, but at Embarcadero we tend to prefer the cleaner and faster ones (that is, #2 or #3) for library code. Interested in your opinions, of course.
Creating custom TEdit styles with the FireMonkey Style Designer
This tutorial outlines the steps for creating and customizing a new FireMonkey style element and applying the newly created style to your FireMonkey application. This tutorial focuses on deploying the resulting application to iOS, but the same steps can be repeated for creating custom style elements for macOS, Android and Windows applications.
Feeding a HTML report dashboard from a Delphi application.
In this video, an overview of a reporting system fed from a Delphi application.
Best Viewed full-screen.
My New RTTI in Delphi Class on Embarcadero Academy
As you might remember, I'm helping building the Delphi curricula on the Embarcadero Academy web site. My focus so far has been on the Delphi language, while other tackle VCL and other areas, or other languages and tools. Last week I completed my set of classes on the Modern Delphi language (Interfaces, Generics, Anonymous Methods) with a class on reflection and RTTI. You can buy each of these classes separately (price vary depending on the length) or buy the complete bundle with over 8 hours of content.
The class on reflection and RTTI has a lot of information on the modern RTTI (compared to the classic one), covers the RTTI unit, the TValue record, the use of attributes and much more. And for those who already purchased the Modern Delphi bundle in th past, the new class has been added to their account for free!
Lockless Multi-Threading in Delphi
In this video, I demonstrate a technique for communicating between threads in a Delphi application, without using typical locking mechanisms such as critical sections. Best Viewed in Full Screen (Recorded 1080p).
The Ultimate Developer Keyboard?
I never really thought of my keyboard as an important accessory, but rather, as that essential item that you buy for the cheapest price possible and be done with. I mean, a keyboard is a keyboard right? Well, I discovered that your choice of keyboard can make a big difference, and so I wanted to share my story with you…
Around six or eight months back, I had to replace a broken keyboard and so I stopped out to the local grocery store with a tech isle, and bought the cheapest keyboard I could find. It’s only a keyboard, what does it matter right? Well it did matter. I found myself making an alarming number of typos. I didn’t want to blame the keyboard because I’m far from a perfect typist, and yet I knew that something was unusual, surely I wasn’t this bad at typing?!
It turns out that the cheap keyboard I’d bought was introducing typos into my work. This was a wireless keyboard, and it seems that as the radio was transmitting my key presses from the keyboard, through a thin and mostly hollow desk, 2 feet away to the usb dongle in the computer, some data was being lost. I determined this was the case, as each of the typos that I was noticing appeared to be the very next key over, which could either be a fat finger rolling over to another key, or could be a single binary bit dropped from the key-code. Since the key-codes are generally sequential right to left over the keyboard, this made sense as a theory, so I tested it. Sure enough, the keyboard would typo about once every 30 or so key presses.
So I went out looking for a replacement keyboard. My only real requirements at the time were:
Wired keyboard.To avoid the wireless issues that I’d previously encountered and save on battery replacement. This keyboard is for my desktop computer, so wireless really isn’t necessary. No silly LED lighting!
I know that LED and RGB lighting is popular with gamers right now but I think it looks ugly. Besides, when you look for keyboards with LED lighting on them, they usually also have some back-lit glowing dragon design, or space-ship shaped surrounds. This is great for serious gamers I’m sure, but for my development rig it just feels silly, distracting and unnecessary.
You may not agree with either of the above requirements for your needs, but this is what I went looking for. For around $40 I came across the Perixx PERIBOARD-512 keyboard with built in Trackball. The ad for it also stated “Standard Full Size Layout” which it turns out wasn’t entirely true…
The Perixx Periboard-512 actually isn’t too bad as a keyboard, but I did have some issues with it. First of all, it’s quite light and a little flimsy. It doesn’t feel too solid, not that this is necessarily a problem, but I didn’t like the feedback I got as the keyboard flexed under heavy use.
More annoyingly however, was that the trackball (which I’d thought would be a great feature) is located where the arrow/cursor keys should be, an so the cursor keys are in a non-standard location beneath the right shift key. In addition to this, the print-screen, scroll lock and pause keys are slightly lower down towards the center control keys than on a standard layout, which makes them very easy to catch when going for the ins/home/page-up keys. This was a problem for me because I actually use those arrow and center control keys quite a lot while editing code.
I also didn’t like the membrane keys, there was no satisfying key-travel or click. I know that some people don’t like keyboards which click but I do. I guess something about my subconscious gets a kick out of hearing it. As you’ll see though, the keyboard I finally landed on is actually available in both clicky and silent variants.
Ultimately I went looking to replace this Perixx keyboard, but I kept it around and have found an interesting secondary purpose for it. You see, because this presents as a simple keyboard and mouse, all in one, it’s now my go-to device for working with newly built computers and OS installation. I’ve no need to keep a separate keyboard and mouse in order to get into and operate the bios in a new build, instead, I just grab the Perixx. So if you need a keyboard that you’re going to use during PC builds, or to carry from one headless system to another, this is a handy little device.
Armed now with a few more requirements, I went back to shopping.
Wired, as before. No silly LED as before. Solid feel.The Perixx was just too flimsy and I didn’t like the feel. Mechanical switches.
I did not know there were so many variants of switches available, it’s not the kind of thing I’d have previously looked into, but apparently it’s quite a science. I remembered the satisfying old Cherry keyboards from the early 90’s and how much I’d enjoyed typing on them, and as it turns out, you can still get the same feel from a modern keyboard with Cherry Mx Switches. Who knew? Standard Keyboard Layout!
I don’t know if there is such a thing as a ‘standard’ in keyboard layout, though I’m sure there must be – all I know is that I want my querty’s where they should be, my arrows where they should be, my control keys where they should be, and so on. Also a number pad is essential, who uses the number row anyway? Roll-over support.
Though I didn’t know this was a requirement at the time, I’ve since come to realize how important this is. When I get my head into coding, or typing up a blog post, gradually my typing speed increases the more I type. Before I realize it, I’m going at a fair old pelt. On occasion I’ve noticed that I can hit two keys in quick succession and one of them won’t register. It turns out this is an issue with some keyboards, or rather, some typists. You see, I’m typing so quickly that I’ve not fully released the previous key when I press the next, and so the keyboard is not able to register them as different key presses. Unless that-is, your keyboard has “Rollover” support. With this feature the keyboard is able to determine the instant each key is pressed, regardless of the previous key being fully released.
I should also point out that despite seeming negative towards gaming keyboards, I do also game on this computer. A keyboard that meets my requirements list will be great for games too, it just won’t have the ‘fun’ graphics and flashy lights that gamers seem to crave.
For $120 the next keyboard I bought was the Das Keyboard S Professional. This keyboard is manufactured in Germany, which seems to be something of an unusual thing with the vast majority of keyboards available in the US today being manufactured in China. The Das Keyboard (translated simply as “The Keyboard”) is available in both noisy and quiet variants. My selection was for the Brown MX (mechanical) keys, and of course, clicky!
So, this keyboard meets my above requirements. It is wired, with mechanical clicky switches and it solid. I mean, like any keyboard, if you put sufficient lateral pressure on it, it will twist a little, but it’s otherwise quite nicely weighted and feels rock solid on a desk. It has a very standard keyboard layout, no silly lighting or fun design patterns, and as an added bonus it has a built in USB 2.0 hub…
While this is only USB 2.0, it is sufficient for me to plug in which ever Android device I’m deploying code to at the moment, and carries sufficient power for charging devices right on the desk too. In fact, I frequently use it to plug in an external webcam because, the camera I have has a very short USB cable, which otherwise doesn’t reach the PC. Rather than extend the cable, I simply plug the camera in when required. ( That’ll also please anyone that is paranoid about being watched through their webcam, since you can remove it from your keyboard to disconnect it. )
This Das Keyboard has two USB connections at the end of it’s cable. One labeled for the keyboard and the other for the USB hub. It is also supplied with a USB to PS2 adapter, which MUST be used on the keyboard USB plug in order to enable the Rollover support feature. So while this keyboard can be used with USB only, you’ll only get the RollOver feature through the PS2 socket.
I LOVE this keyboard. I’m very likely going to buy a second one and several spare switches to ensure that I never have to worry about finding a good keyboard again. So I’ll apologize to anyone that watches my videos, for the keyboard noise introduced by this keyboard. I’ve done what I can to mitigate this by mounting my microphone on the wall (to avoid vibration through the desk), but I’ve no intention of changing the keyboard. This does what I want, feels great, has keys in all the right places for operating the IDE and text editors, and just happens to also make a really satisfying clicking rattle as I type.
Is this the ultimate keyboard for Coders?!
Well, that’ll be a very subjective thing I’m sure. Many of you may not like my choices, you may need wireless, you might actually like RGB LED’s (you animal). I also have not tried a wide range of keyboards, I feel like I struck lucky with this one. Ultimately though my answer is Yes, from my range of experiences with keyboards and a purchasing spree, which actually included more keyboards than I featured in this post, this is the ultimate keyboard for a coder such as myself.
Until next time,
Thanks for Reading!
Exciting RAD Studio Developments in 2018

We have many exciting new features and product enhancements planned for Delphi, C++Builder and RAD Studio in 2018. In our September 2017 roadmap, we covered many of the new plans and features planned for 2017 and 2018.
We are pleased to share details for Release 3 of 10.2 Tokyo (i.e. 10.2.3), targeted for the first quarter of 2018. For this release, we have three key themes. First, it provides enhancements for our core visual frameworks, including better HighDPI support for VCL and quality improvements for FireMonkey (FMX). Second, we continue to improve our C++ capabilities, by including CMake command line support and C++ Rename Refactoring. Third, we provide expanded RAD Server support for Ext JS. As always, there are a number of quality items that address specific customer concerns and overall performance issues. Those features are close to ready, and we’ve decided to provide them with a 10.2.3 release to be able to deliver them to you sooner. Below are some additional details for selected items that will be part of 10.2.3.
C++ Rename Refactoring allows you to right-click an identifier in your code, and rename it throughout your project. It’s a complex feature, and contains the core of a new C++ IDE tooling capability that stores an AST for your project - symbols, code structure, and more. Unlike project indexing, introduced in XE2, this runs in the background and can currently provide information for both Find References and Refactoring. Rename Refactoring has been a longtime feature request from our C++Builder customers. It’s been in the works for a while and we’re looking forward to introducing it in the upcoming release.
CMake is a popular C++ build tool. Our first stage of CMake support is building CMake projects (i.e. projects with a CMakeLists.txt) on the command line, using our compilers. This will be very useful for those who want to easily build third-party libraries without converting them to a C++Builder project. We also specifically support Ninja, allowing for very fast parallel builds.
We’re also continuing work to simplify the development of a RAD Server backend for a Sencha Ext JS client. As you probably know, Embarcadero parent company Idera, Inc. acquired Sencha last year, and Sencha provides first in-class enterprise web application capabilities. In 10.2.2, we added a new FireDAC component that helps generate JSON in a format suitable for a Sencha Ext JS client. In 10.2.3, we are adding additional helper classes and the ability to host HTML files as part of RAD Server, both designed to make it easier to use RAD Server as the backend for an Ext JS web application.
Update subscription allows us to release features throughout the year, instead of having a single major release followed only by quality fixes. This means any feature that misses one release is a candidate for the next, and all update subscription customers will get the feature.
We are also working on a number of FireMonkey UI templates, designed to highlight FMX's multi-device capabilities, showcase best practices and help new users get started quicker. The GUI templates will be added to GetIt in the coming months, in addition to a new RAD Server app template that is also in the works.
Installing Tokyo Release 3 should be a fast and seamless process, but will require an uninstall/reinstall, since it introduces new features and touches many files throughout the product. We continue to evaluate other installation options for point releases that wouldn’t require a full uninstall/reinstall, but so far that has been not only the safest but also most time effective solution in terms of installation time for our customers. We’ve made a number of improvements to the GetIt installer over the past several releases, including the ability to preserve your existing registry settings.
Key roadmap themes for 10.3 (and 10.3.x) include macOS 64-bit support, C++17 support, consolidating our debuggers and updating the IDE UI/UX, in addition to FireMonkey z-order support on Android and more. We plan to publish an updated roadmap after the 10.2.3 release.
Note: These plans and roadmap represent our intentions as of this date, but our development plans and priorities are subject to change. Accordingly, we can’t offer any commitments or other forms of assurance that we’ll ultimately release any or all of the described products on the schedule or in the order described, or at all. These general indications of development schedules or “product roadmaps” should not be interpreted or construed as any form of a commitment, and our customers’ rights to upgrades, updates, enhancements and other maintenance releases will be set forth only in the applicable software license agreement.
A Birthday Present for Delphi at 23!
I decided to write an app to celebrate Delphi’s 23rd birthday and valentines day.
Happy Birthday my beloved Delphi!
(Best Viewed Full Screen, Source and binary downloads below).
The binaries provided here are Debug builds, and should be considered an Alpha version.
I intend to put release builds on the app stores as time permits.
The following are un-tested binaries for Mac / iOS provided by Jim McKeeth (Thank you!)
Note: You may need to build from source in order to install on iOS, as I’m not sure you can side-load binaries.
Delphi 23 and Delphi 10.2.3
Today is Delphi's 23rd birthday. The product was launched on Valentine day in 1995 in San Francisco (and I had the luck to be there, as I covered in the past). 23 years is a lot of time for people. It is a incredibly long time for technologies. It is hard to find a language, framework and IDE from 23 years ago you can use to build todays's and tomorrow's software. Of course, the IDE, language and frameworks have evolved and keep evolving -- developers using them can modernize their apps without a full rewrite.
In this 23 years, millions of developers and have used Delphi to build millions of applications, and applications used by millions of users. The most used Delphi application ever build is probably Skype for Windows. But it has been used to build applications worth millions in sales and moving millions in financial markets. And Delphi is still used to day to maintain those applications and create new ones in industrial, financial, health, travel, and sport fields (among others)... including mobile apps for its birthday. Or to run a miniature airport.
In these 23 years the product has changed a lot (Hey, I've changed a lot from the picture in the link above!), Below you can find a comparison of Delphi 1 running on a VM and Delphi 10.2.2 (with dark theme) running on the same machine. It is not a Photoshop, it is an actual screenshot!
Both versions of the IDE have a VCL application with a Button and the Caption property highlighted in the Object Inspector. I didnt' include the about bos of 10.2.2 (as I was trying to do) because it is a little too big. One of these days I'll make a parallel video of working on both. But you know what? Most applications you build in Delphi 1 can be recompiled with few changes in the 23 year later version. Well, as long as you don't use pointers, as Delphi 1 had 16 bit pointers (ugh!). Of course, most applications you write in todays product don't have a chance to run in the older sibling.
Speaking of today, Embarcadero (and the PM team I'm part of) just announced some more plans for this year, and the plan does include the coming release of an additional quality focused update for 10.2 Tokyo, 10.2.3. Now 10 x 2 + 3 is in fact 23. Or Delphi 10 version 2.3. We have a lot in the works for the next mayor release, but also want to keep improving on the quality of Tokyo and release it as soon as possible.
What else can I say? Just invite to you watch Jim Mckeeth great "23 years" Why I Love Delphi video.
RAD Studio 10.2.2 Tokyo February 2018 Patch Re-Released
Last week, Embarcadero released a patch for Tokyo 10.2.2, focused on Android and RTL improvements. What happened is that Windows would not always ask for execution with admin account (on systems with active User Account Control) and could end up copying the replacement files in a wrong location. It did affect a few of the developers who tried it, so we pulled it, fixed the installer and now re-issued the patch.
If you are a registered user of Tokyo (or have a license for it), you can find it at https://cc.embarcadero.com/item/30819.
There is no change in the content on the patch, so if you already installed it successfully, there is no need to repeat the process. On the other hand, if your installation got broken, we have provided an alternative ZIP-based option (in the same download page). We have already sent it to developers who had got in trouble, but might not have reached everyone.
As for the content, the main fix is the Android animations and tab animation issue. These have been addressed. There are still cases in code where the combination of called to Application.ProcessMessages and timers might get you in trouble. I'll blog more information ASAP, but the general recommendation is to use threads rather than timers for background processing -- an all platforms, although in Windows that coding style can be used.
Running a Delphi Linux Application on Google Cloud Shell
Google has made available to all its Gmail users a Linux Shell to interact with their Cloud Services, called Google Cloud Shell. This shell is a free Debian 7 shell with 5Gb of storage. It is not a VM that keeps running while you are disconnected, but it is a shell allowing you to perform task on a Linux box. Every time the session expires and you reconnect, a new machine is created for you. The 5GB of storage is persistent, though.
You access to this shell via browser at:
https://console.cloud.google.com/home/dashboard?cloudshell=true
It is an online Linux machine you can use... also for running Delphi Linux applications. So, as an experiment, I've written a console app that downloads some RSS feeds data (via TIdHTTP) and dumps it in a local file. The file name is a timestamp:
SaveToFile (FormatDateTime ('yymmdd_hhnnss', Now) + '.txt');I've pushed it to a web site, opened the shell, used wget (plus the URL) to download it, chmod u+x to mark it as an executable for the user, and could simply invoke it in the local folder, as in the image below:
Now the power of this shell comes from integrating with other Google Cloud services, but it certainly nice to have a Linux shell at hand, for free, for running any application including those you build with Delphi Tokyo for Linux.
Delphi PodCast – Favorite Coding Books
As many of you may already be aware, I am now a regular guest on Jim McKeeth’s Delphi podcast along side David Millington.
The pod-casts recently became video streamed, and have adopted a more structured “Themed Episode” format.
Catch us Live on Tuesdays at noon CST.
In case you missed it, here’s the Feb 19th 2018 episode on our Favorite Coding Books:
Delphi PodCast – Delphi Game Engines
In case you missed it, here’s the Delphi podcast for Feb 27th 2018 – Delphi Game Engines
(skip to about 9:30 to spare yourself the technical difficulties with the stream)