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.
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:
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
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….
/// This is a candidate to be removed or left to store the Locale that created the FormatSettings.
/// Creates a TFormatSettings record with current default values provided
…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.
I already posted about how easy it is to add markers to a map using
TMSWebGMaps in a VCL Forms Application. However, the documentation is rather slim on how to focus the map on all the markers added. You might find the method
MapZoomTo sooner or later. This method expects the bounds to be specified and for that you may use
Map.Markers.Bounds which will yield the bounds encompassing all the markers that have been added to the map.
The approach is very logical and — as always — if you know which method and propery to use it makes very much sense and it is easy to remember. Just finding it for the first time is always a challenge.
Looking at the following code snippet that iterates over a data set and adds exactly one marker for every record, we can also see the call to
MapZoomTo at the end. Accoding to the documentation and also to what I just wrote, this should work:
To be blunt: Depending on the internet connection available it won’t work. Especially if you make the call to
MapZoomTo right after the start of the application, the call will lead to nothing. It will simply be ignored by the Google API. You always have to remember that any call to the WebGMaps framework will lead to some sort of interaction with the Google API sooner or later. If that API is not able to receive the call or has not processed all the previous calls, the call will be ignored and not queued.
The solution is again rather simple, but you need to know the fact that the map control has to be ready to be zoomed or panned. It is ready right after the download has completed. Thus, we can use the event called
OnMapDownloadDidFinish would have been a much better name) of the map control:
The instance to
Map and also
Map.Markers.Bounds can be called at any time after the markers have been added. As the map is owned by the form, this requires no additional variables etc. Putting the call to zoom into the event makes certain that the control is ready.
In order to not miss these things, TMS offers a FAQ for all their components. You can find the FAQ for the VCL mapping component here. Furthermore, you also find a solution how to zoom in on all the markers.
Finally, be sure to subscribe to their newsletter. It contains valuable technical information for all products and is released frequently.