5-Minute-Snack: What’s been going on?

You might have noticed that I have gotten rather quiet these last few months and there are two major reasons for that:

At the beginning of September of 2017 I was on vacation in Florida and as you surely remember, the state was hit by Hurricane Irma. The backlash was unimaginable for a resident of Germany. It was quite a lot to deal with mentally and physically. My flights were canceled and traveling back to Germany was delayed. 

Thus, it just so happened that somebody ran a red light and hit the car I was a passenger in with about 55 mph. We were hardly moving as we were taking a left turn. For legal reasons, I will not post any images of the car wreck. 

To this day first responders, police, doctors and friends call it a miracle that we survived the impact.

The front of the car was completely “gone” , but for some reason the driver and passenger metal cage prevailed and sustained the impact. The airbags also deployed, we were wearing our safety belts and were able to escape from the burning vehicle in time.

For me, the injuries were mainly mental, the driver was hit more severe and is still coping with the injuries to this very day.

That means in the last months, I needed to put things into perspective and spent a lot of time working on things without any public involvement.

One of these things has already become public knowledge: TMS Web. A wonderful, new, modern Web Framework for Delphi! I have been busy producing video and textual content and served as a tester and consultant for that project. 

Today, I finally had an idea for another 5 Minute Snack that I will publish shortly.



Tagged with: , , ,

5 Minute Snack: Is a package installed? The Package Manager icons tell you!

I noticed this rather recently. It might have been the case for a long time, but I never noticed it before. The Project Manager uses different icons to show if a package is installed or not!

Look at this example:

The very first package icon is colored with a purple box, the last two icons feature a gray box. That is basically the difference between packages being installed or not. The first package for FMX is installed, the package for VCL and the FNC design-time package are not installed.

Sometimes I am surprised about the subtle improvements I still notice in the Delphi IDE after using it all these years.

Tagged with: ,

TMS FNC UI Beta: Beta release announces upcoming Table View component for the FNC Framework

TMSSoftware.com is offering an inside look into the coming version of FNC UI in form of a Beta version for all registered customers.

After presenting a Ribbon component with version 2.0 — i.e. you can use the same component in VCL, FMX, LCL for all targets that Delphi offers —  the next version will introduce a Table View control that became famous with iOS. A table view is the basis for any listing of values with hierarchical navigation in iOS. Having the same component available in desktop environments as well, will increase usability of your applications immensely.

Have a look at my detailed tutorial for the new component that will be part of FNC UI 2.1:

Tagged with: , , , , , , , ,

5 Minute Snack: Reading floats with StrToFloat and TFormatSettings independent of system region settings

This is one of the topics that sadly shows up mostly at run-time when you already deployed the app to your customers.

We all have our development machine. Our application works just fine. And then we deploy to the customer and the customer says that he gets an error that “12,5 is not a valid float value”.

Why is it 12,5  you wonder… on your system it is always 12.5  and works just fine.

Well, different regions different ways to write a number. In Europe most countries use “,” (comma) as a decimal separator and “.” as a thousand separator. In the United States of America it is exactly vice versa. 

It gets even more complicated if you have to read a number from a string that is produced by a device that always formats numbers a certain way no matter what and you have to make sure that your application is able to interpret these numbers.

There is always lots of information on the web when it comes to Delphi and its functions. In order to convert a string to a float value you use StrToFloat . Sadly, most of the information is outdated. Recent versions of Delphi use an approach that has been established by Java and .NET and has found its way into the Delphi RTL.

Here’s how Delphi tries to parse a string into a float: Delphi uses the local regional settings of the user profile the application runs in. This means if your application runs on a US-based system without any individual changes the decimal separator most likely will be “.”. If your application is run on a system in Germany, Delphi will use “,” as a decimal separator.

How you say what Delphi shall use: Let me just start with this. I have seen so many strange things to solvet his issue, it made me dizzy sometimes. There’s people rewriting registry settings to get it done and trying to load different regional configurations using the Win API… the sky seems to be the limit.

However, the solution is so easy if you have a look at the different fingerprints of the StrToFloat  method:

There is the option to specify a setting of type TFormatSettings  as the second parameter for the parse operation. And that is already the solution. TFormatSettings  is a record that is designed to hold regional settings of all sorts. Date and Time formats, day names, number formats — all you need.

And if you look at the source….

…you even get information what different methods can be used to fill the record with data. 

If you know that your external device will deliver measurement data in US format all the time, i.e. with ‘.’ as a decimal separator and you want to make sure that Delphi knows it you need to create TFormatSettings  either with a US-locale or you can also create one based on your system and set the delimiter manually. You have the option.

Here we create the record for US settings:

LFormat  is of type TFormatSettings . Mind that it does not have to be released as it is a record and not an object instance; even though the method is called create it is not a constructor that is called.

Alternatively, you can say:

So, whenever you encounter a string that has “12.5” as a number it will be able to parse that number no matter on what system your application runs.

Once you know that you have TFormatSettings  at your disposal it becomes really easy.

Tagged with: , ,