VCL

Introducing the new TMS Aurelius Dictionary

TMS Aurelius 5.6 has been released, and the major feature is a brand new, full-feature dictionary. Aurelius dictionary is intended to be used in Aurelius queries. The idea is that instead of using strings to reference entity properties, you use the dictionary properties directly. For example, a usual Aurelius query is like this: Results := Manager.Find   .Where(Linq[‘Name’].Like(‘M%’))   .List; But the above approach is error prone, the ‘Name’ string can be wrong, it can be wrongly typed, or the name might be modified. You will only find the errors at runtime. With the dictionary, you can write the query like this: Results := Manager.Find   .Where(Dic.Customer.Name.Like(‘M%’))   .List; You can also reference associated objects, for example, querying all invoices where the country of the customer of the invoice is from Brazil:   Manager.Find     .Select(Dic.Invoice.Total.Sum)     .Where(Dic.Invoice.Customer.Country.Name = ‘Brazil’) It’s a simple thing that makes a huge difference when you are using it daily. You have code completion, you have compile-time check, you minimize the errors at runtime. In summary, it increases your productivity a lot. TDictionaryGenerator.GenerateFile(‘C:SomeFolderMyDictionary.pas’); Or from command-line using the AureliusDictionaryGenerator.exe tool, which generates it from a BPL package: AureliusDictionaryGenerator.exe -i:Default -p:”C:MyProjectBplEntities” “C:MyProjectMyDictionary.pas” Last but not least, the dictionary can be validated at runtime! This way, if somehow the dictionary and the real classes do not match (for example, you might modify your classes and forget to generate the dictionary again), the dictionary will tell you the differences: TDictionaryValidator.Check(Dic); It’s as simple as that. This way you make sure you don’t have surprises at runtime and your dictionary is correct! This is an awesome new feature that brings a night-and-day difference when writing Aurelius queries. If you want to have more detailed information, of course please refer to the documentation where all the above features are explained in details. Wagner R. Landgraf

Read More

Static code analysis for Delphi with TMS FixInsight v2021.10

We are pleased to announce the immediate availability of the new TMS FixInsight version v2021.10! Highlights of this new release are: Delphi 11 support Better type resolving Improved & more robust code parser 5 New code analysis rules added The first three highlights are quite obvious, but let’s have a deeper look at the 5 new code analysis rules that have been added and that will enable you to detect possible code issues faster. W537 Format parameter type mismatch The Delphi compiler is not able to check data types used in Format() function. The example below will compile, but will never work properly. FixInsight is able to catch that.  var  StringTypeParameter: string; begin   Result := Format(‘String type parameter value = %d’, [StringTypeParameter]); end; W539  Interface method call passing the same interface reference as out parameter In the example below access violation will be raised because Delphi compiler cleans up Node variable before the actual Node.GetParent() function call.  type    INode = interface   [‘{39EE5CA9-C4C1-46E1-B326-BAA2D004A5CD}’]    function GetParent(out Parent: INode): Boolean; end;  TNode = class(TInterfacedObject, INode) strict private   // INode.    function GetParent(out Parent: INode): Boolean; end; { TNode } function TNode.GetParent(out Parent: INode): Boolean; begin   Parent := TNode.Create;   Result := True; end; procedure InterfaceErrorSample; var   Node: INode; begin   Node := TNode.Create;   // Before calling Node GetParent, the compiler generates code that clears the Node variable   // because the GetParent parameter is declared with the out parameters.   // Thus calling Node.GetParent will result in AV.   while Node.GetParent(Node) do     // Getting root node.   ;   // Do somthing with root node. end; W540 String variable used twice in a call both as an output and an input parameter In the example below Str parameter in IsStringSliceNotEmpty() function will always be an empty string if you pass the same variable twice. Because the variable will be cleaned up by Delphi compiler. function IsStringSliceNotEmpty(const Str: string; out Slice: string; Index, Count: Integer): Boolean; begin   Slice := Copy(Str, Index, Count);   Result := Slice ”; end; procedure StringErrorSample; var   Str: string; begin   Str := ‘qwerty’;   if IsStringSliceNotEmpty(Str, Str, 1, Length(Str)) and (Str[Length(Str)] = ‘y’) then     ShowMessage(Str); // ShowMessage never run because Str was cleared before the SliceString call. end;  W541 Type-casting from Pointer to Integer type (or vice versa) Type casting from Pointer to Integer and Integer to Pointer is often used in legacy code. But it is not safe on some platforms, because types size are differ. For instance, Pointer is 8 byte on x64, and the code below will lead to data loss. procedure TypecastSample(A: Pointer); var   B: Integer; begin   B := Integer(A);   //… end; W542 Direct floating-point comparison There are several not obvious problems with comparing floating-point numbers. They are perfectly explained in DocWiki https://docwiki.embarcadero.com/RADStudio/Sydney/en/Floating-Point_Comparison_Routines In short, you should never use equal sign to compare two floating-point numbers, but rather use special comparison routines. var    X:Single;    Y:Double; begin   X:=0.1;   Y:=0.1;   if X=Y then    Writeln(‘Equal’)   else    Writeln(‘Not equal’);   ReadLn; end. The program outputs: Not equal Get the update & increase the quality of your code! If you have an active license for TMS FixInsight, the update is available for you free. Users with an expired license […]

Read More

Discover the Abstract IP Geolocation API with FNC

Intro You would be amazed to find out how much detailed and accurate information you can retrieve from an IP address. Collecting data based on the IP address can be key to various parts of your business. Want to know where your customers are located during an online meeting? Want to include this technology in your application to gather statistical data and don’t know exactly how to get started? The TTMSFNCCloudIPLocalization component (part of the TMS FNC Cloud Pack) is designed to retrieve detailed and accurate information from an IP address and is capable of doing this via the IP Geolocation API from Abstract. The TTMSFNCCloudIPLocalization component is able to retrieve the following information from an IP address. Country name, code & flag image Region name & code Virtual Private Network (VPN) detection Internet Service Provider (ISP) information Latitude & Longitude Timezone information Getting Started The code snippets below are based on the IP Geolocation API from Abstract to retrieve the information we want to visualize. To get started, you will need to create a free account. After logging in, go to dashboard, select IP Geolocation. The process only takes a couple of seconds, afterwards you can copy the API key which is required to work with the TTMSFNCIPLocalization component. Below you can see the page you get after setting up your account. The above steps is all we need to do get started with the TTMSFNCIPLocalization component. Drop an instance of TTMSFNCIPLocalization on the form. Set the API key and set the service property. (Replace ‘MyAPIKey’ with a valid API key). TMSFNCCloudIPLocalization1.APIKey := ‘MyAPIKey’; TMSFNCCloudIPLocalization1.Service := ipsAbstractAPI; TMSFNCCloudIPLocalization1.OnGetIP := DoGetIP; After assigning the OnGetIP event, add a button with the following code to retrieve your own IP address. TMSFNCCloudIPLocalization1.GetIP; Alternatively, you can also add a custom IP address. This can be done with the following code. (Replace ‘x.x.x.x’ with a valid IP address) TMSFNCCloudIPLocalization1.GetIP(‘x.x.x.x’); After clicking the button, calling the GetIP procedure, the OnGetIP event will be triggered. In this event, we have immediate access to the information retreive from the IP address. Backtracing which IP address was requested can be done via AIP.IPAddress procedure TGetIPDataForm.DoGetIP(Sender: TObject; AIP: TTMSFNCCloudIPLocalizationIP; AError: Boolean; const ARequestResult: TTMSFNCCloudBaseRequestResult); begin //retrieve IP address information via the AIP parameter end; Below is an overview of the properties that are available when using the AIP parameter after the request has finished executing. Demo Included in the distribution is a demo, which shows the capabilities of the TTMSFNCCloudIPLocalization component. Below is a screenshot of the demo in action. Note that the IP address and coordinates have been blurred for privacy reasons. Additional Services The blog post focuses on the IP Geolocation API from Abstract, but the TTMSFNCCloudIPLocalization component is also capable of connecting to the following additional services. The account creation and API retrieval process is different for each service, but the way the component operates remains identical. To select one of the other services, set the Service property to either ipsIPData or ipsIPStack and set the API key for that specific service. IPData IPStack Available Today! The TTMSFNCCloudIPLocalization component is available in the latest update, available today. So go ahead and download the latest version of the TMS FNC Cloud Pack. The TMS FNC Cloud Pack is part of the FNC family, so as a reminder, below is an overview […]

Read More

Stay on top of what’s happening in the Delphi world with new webinars in October

The Delphi train is unstoppable. Not only did Embarcadero bring a brand new Delphi 11 with tons of valuable new features, our team also worked around the clock to keep bringing useful add-ons to get even more out of Delphi. Here is your chance to stay on top of this with three webinars we have scheduled in October so far: The Aurelius dictionary : Oct 7, 2021 4h00PM UTC / 18h00 CET Learn more about the brand new TMS Aurelius dictionary feature, and how it will bring even more capabilities to your favorite ORM framework for Delphi. Get compile-time errors, check for dictionary validation and make your database queries even easier to build.In short, a webinar that is not to miss for anyone pondering about adding ORM technology to existing applications or get even more out of Aurelius based applications! Your host is Wagner Landgraf, the architect and product manager for TMS Aurelius. Register here now! The new WX pack, new territories open for your Delphi apps : Oct 12, 2021 3h00PM UTC / 17h00 CET WX Pack controls bring a brand new approach to leverage existing non-trivial and complex components and libraries for Delphi VCL Windows applications, cross-platform FireMonkey applications or web client apps. Among the first such components in WX Pack will be: PDF viewer, QR code generator, barcode generator, text to speech, OCR, JSON viewer, …  Learn about the architecture of the new WX controls and see how these are universal and work in VCL, FMX, LCL or WEB Core apps. See the first WX controls in action. We will show also new WX controls in development, what further WX controls we have on our radar and we listen to your questions and inputs, suggestions for more WX controls. Your host is Bruno Fierens, CTO of tmssoftware.com.  Register here now! Miletus brings creating Raspberry Pi apps from your Delphi IDE : Oct 19, 2021 3h00PM UTC / 17h00 CET Miletus technology now also enables you to create applications running directly on the Raspberry Pi SBC. And this all directly from the Delphi IDE. And of course, from the Miletus application, you can control various hardware accessories via the i²c, SPI or UART on the Raspberry Pi. Discover how Miletus will empower you to bring Raspberry Pi apps from the Delphi IDE in this webinar!  Your host is Bruno Fierens, CTO of tmssoftware.com.  Register here now! TMS WEB Academy All webinars will be brought to you via the TMS WEB Academy. Our TMS WEB Academy is our platform, fully created with TMS WEB Core to host webinars for you. During the webinars, interaction is encouraged, you can ask questions via messages or directly spoken and when extra resources are coupled with the webinar content, these will also be live shared during the webinar.

Read More

Miletus brings Raspberry Pi target in Delphi

Last week, we showed a first glimpse in our lab where we demonstrated building a Raspberry Pi application from the Delphi IDE using Miletus. Today, we have a closer look at some of the new components as well as an extra video. Creating a new Miletus Raspberry Pi app From the IDE, simply select TMS WEB Miletus Application: Now, in the project manager, under build targets, you see all the build targets Miletus offers. And there you have Raspberry Pi debug and release new targets.  With this Miletus project created and the Raspberry Pi target selected, you are ready to create your first Miletus application. XCOPY deployment When you compile the Miletus for Raspberry Pi project from the Delphi IDE, you’ll find the generated application and Raspberry Pi OS desktop shortcut link file in the output folder. Just XCOPY these 2 files to your Raspberry Pi with the Raspberry Pi OS and run the application. There is possibly just one extra step needed to prepare your Raspberry Pi to run the app and that is: sudo apt install libwebkit2gtk-4.0-dev New components While the entire array of TMS WEB Core components and TMS FNC Components is available to build a Miletus Raspberry Pi app, the Raspberry Pi target introduces three new components to access hardware attached to your Raspberry Pi SBC: You see here: TMiletusRaspberryI2C : read and write via the i²c ports to various sensors or other devices TMiletusRaspberrySPI : read and write via the SPI port to various hardware extensions using the SPI port TMiletusRaspberryUART : read and write from the UART to devices connected to the Raspberry Pi I²C I²C is a standard 2 wire protocol to communicate with devices. The Raspberry Pi offers out of the box two I²C interfaces. There is SCLK and SDA signal, i.e. the clock signal and the data signal that is open-collector based input / output. Communicating over I²C works via sending first an 8bit address and read or write bit over the SDA signal and then either write or read data bits. We exposed this in the TMiletusRaspberryI2C component via methods: TMiletusRaspberryI2C.Open; TMiletusRaspberryI2C.Close; TMiletusRaspberryI2C.ReadByte(Address:byte): TJSPromise; TMiletusRaspberryI2C.ReadSmallInt(Address:byte): TJSPromise; TMiletusRaspberryI2C.ReadBuffer(Address:byte, Size: integer): TJSPromise; Yes, you can see that the response of the read instruction is a promise as the read methods are asynchronous. Thanks to the promise based approach, we can still write sequential code to deal with reading and writing over I²C.   To write data, six methods exist TMiletusRaspberryI2C.WriteByte(Address: byte; AData: byte); TMiletusRaspberryI2C.WriteByteP(Address: byte; AData: byte): TJSPromise; TMiletusRaspberryI2C1.WriteAddress(Address: byte); TMiletusRaspberryI2C1.WriteAddressP(Address: byte): TJSPromise; TMiletusRaspberryI2C1.WriteBuffer(AData: Array of byte; ASize: integer); TMiletusRaspberryI2C1.WriteBufferP(AData: Array of byte; ASize: integer): TJSPromise As you can see, you can write a byte to some specific address or write an address followed by a buffer of data. The methods are all asynchronous and a promise based variant exists to allow to create sequential code. This code snippet shows how to write two register values from an I²C device in a sequential way thanks to await()   ac1 := await(Integer, MiletusRaspberryI2C1.ReadSmallInt($AA));   ac2 := await(Integer, MiletusRaspberryI2C1.ReadSmallInt($AC)); SPI The SPI protocol (Serial peripheral interface) uses a 3-wire connection, a clock and the data-in and data-out signal. Other than this, it is similar to I²C, meaning, it also uses an address and reads and writes data serialized over this 2 data wires. The methods for […]

Read More

Quadruple your number of components for TMS WEB Core on Windows, macOS or Linux

Background One of the many reasons to develop TMS WEB Core for Visual Studio Code was that you could use this highly popular development environment directly on your favorite desktop Windows, macOS or Linux system. And this without any virtualization software! With this mission accomplished, a next goal was to bring our wide portfolio of TMS WEB Core enabled FNC components to TMS WEB Core for Visual Studio Code on any of these platforms.  The entire range of TMS FNC Components was already for some time available for Delphi developers on the Windows operating system. That means, when you have TMS WEB Core installed in the IDE and you install any of the TMS FNC Components using its installer, these components also become automatically available for use in TMS WEB Core web client applications or Miletus desktop applications.  Now, with TMS WEB Core for Visual Studio Code running on a macOS or Linux machine, this was somewhat more problematic. Our FNC component installer is an executable designed for Windows that does not work out of the box for macOS or Linux. Enthusiast TMS WEB Core for Visual Studio Code users did the cumbersome extra effort to find a Windows machine, install it there and then manually move over the files and install in Visual Studio Code. A new easy way to install FNC components But from today, this inconvenience is all a thing of the past! We’re pleased to announced that the full portfolio of TMS FNC Products is now also available both for trial and registered versions as simple ZIP file distributions that can be used from any desktop operating system. Simply unpack, pick from Visual Studio Code the folder where the ZIP file was extracted and pick the package to install it in the IDE. Done! Our colleague and evangelist Holger Flick has it for you all explained and demonstrated in the video he created especially for this: What do you get today? From today, you can easily install following FNC component as trial version or as registered version in TMS WEB Core for Visual Studio Code: TMS FNC Chart : business, statistical, financial & scientific data TMS FNC Dashboard Pack : dashboard UI controls TMS FNC Maps : the world of mapping services, directions, geolocation, … in your hands TMS FNC UI Pack : sophisticated UI controls including grid, planner, ribbon, treeview, navigation, … And it doesn’t end there! You have most likely seen the announcement of our new WX technology that encapsulates web technology for any type of Delphi application or TMS WEB Core application. Our upcoming TMS FNC WX Pack is also already enabled for easy install in TMS WEB Core for Visual Studio Code.  And on top of this, in the future we want to make it even easier than this as we are researching right now to use the Microsoft Visual Studio Code Market Place for FNC component distribution. With this in-place, you’ll have the ultimate experience, that is: an IDE that takes care itself of always keeping your components automatically up-to-date.  Stay tuned! There is a lot more in the pipeline and never-seen-before developments we will soon unveil.

Read More

Huh, Raspberry Pi app from the Delphi IDE?!?

Excitement Before we dive into more technical details and bring a first beta build with this new milestone reached, we just wanted to brighten up your day and share on this gray, cold, rainy Thursday our excitement in the lab. Excitement because months of R&D work result today in closing the circle and having the ability to simply select from our Delphi IDE a new target : Raspberry Pi and then XCOPY the app and run it directly from the Raspberry Pi, including accessing all sorts of hardware hooked up to this small SBC. It goes without saying this concerns an app written 100% in Object Pascal with a RAD component based methodology and as a bonus with a couple of our FNC components and using the Miletus technology of TMS WEB Core. Expect more details coming, but enjoy for now this first glimpse:

Read More

To be (live) or not to be (live): a poll

Ever since the covid-19 pandemie caused the first lockdown in March 2020, we did not organize and did not participate in any live Delphi related event. Instead, we embarked on a new project, the TMS Web Academy to reach out to you, to create our own platform where we have full control and to prove the strength of TMS WEB Core to create web applications. We launched the TMS Web Academy in the beginning of this year successfully. The number of participants to the number of webinars we already offered exceeded our expectations.  It’s clear that the TMS Web Academy is here to stay. But it is also clear there is no substitute for real in person and face to face meeting with fellow Delphi developers.  For a long time and till now, the uncertainty about new possible lockdowns withheld us from setting up a new live event.  In Belgium, the country where the main office of TMS software is located, there is a high degree of vaccination and it appears that restrictions keep diminishing. And that makes us reflect about new possibilities for a live event.  The sole purpose of this blog post is to feel how this resonates with you, as possible attendee of a live TMS training day. So, in a nutshell, with this poll you can indicate how you feel about this. The idea we play with is a TMS training day about the newest TMS WEB Core and TMS FNC developments. As a location, we think about Bruges, the venice of the North with easy access by highway, train, airports in Ostend & Brussels and a one of a kind authentic and historic heart of the city.  We are very curious to hear how you feel about this! Please fill-in this poll or add any remarks about how you think about live events in the comments!

Read More

Lazarus Linux support for FNC webbrowser

Intro Up until now, the only way to use the TTMSFNCWebBrowser in a Linux environment was through FMXLinux. Today, we can proudly announce official Linux support through Lazarus as well. A couple of FNC products were already working in Linux, but the browser based components, such as the TTMSFNCWebBrowser and the TTMSFNCMaps components (& descendants) were not working. We have been working hard the past months to make our browser based products ready for Linux. With Linux support through Lazarus, we add yet again a new platform to the wide variety of already supported platforms in FNC. TMS FNC Components can be used simultaneously on these frameworks TMS FNC Components can be used simultaneously on these operating systems/browsers TMS FNC Controls can be used simultaneously on these IDEs Getting Started The components have been tested and deployed on a Linux environment (Ubuntu 20.04) after properly setting up Lazarus and other dependencies required for various parts of FNC. To setup your Linux environment please execute the following commands sudo apt install joe wget p7zip-full curl openssh-server build-essential zlib1g-dev libcurl4-gnutls-dev libncurses5 sudo apt-get install zlib1g-dev sudo apt install libgl1-mesa-glx libglu1-mesa libgtk-3-common libgstreamer1.0-0 libgstreamer-plugins-base1.0-0 sudo apt install libwebkit2gtk-4.0-dev Uninstall previously installed FNC packages and rebuild the Lazarus IDE. Remove LIB folders generated in the source directory. During compilation of dependant packages, checksum errors might appear. If this is the case, follow the exact steps below. LCLTMSFNCCorePkg.lpk >> Install LCLTMSFNCCorePkgDE.lpk >> Install >> Error LCLTMSFNCCorePkg.lpk >> Only compile LCLTMSFNCCorePkgDE.lpk >> Install >> OK LCLTMSFNCMapsPkg.lpk >> Install LCLTMSFNCMapsPkgDE.lpk >> Install >> Error LCLTMSFNCMapsPkg.lpk>> Only compile LCLTMSFNCMapsPkgDE.lpk >> Install >> OK Repeat steps 5-8 for other FNC products if necessary GTK 3.0 Note that the TTMSFNCWebBrowser is relying on GTK 3.0 as a minimum. By default Lazarus applications target GTK 2.0. To change this, select “Project Options”, go to “Additions and Overrides”, and change the default “LCLWidgetType” to GTK 3.0 Start the application to explore the capabilities of the TTMSFNCWebBrowser TMS FNC Maps Lazarus Linux support for TTMSFNCWebBrowser also means the TMS FNC Maps component set is available. Below is a screenshot of one of the demos in action. Stay tuned! With Linux support through Lazarus we add yet another major and exciting platform to the already huge amount of platforms FNC has to offer. Stay tuned for more FNC improvements and features coming up in the near future!.

Read More

TMS FNC Maps v2.1: Introducing OverlayViews

The new TMS FNC Maps update includes support for OverlayViews. This is a heavily improved equivalent of the Marker Labels functionality in TMS VCL WebGMaps and TMS FMX WebGMaps. OverlayViews are a Google Maps API specific functionality and therefore currently only available in TTMSFNCGoogleMaps. OverlayViews can be positioned anywhere on the map and support HTML tags. 3 ways to use OverlayViews 1. Connected to a Marker The OverlayView is automatically displayed below an existing Marker and functions as a Marker Label.  In code, adding a call to AddOverlayView on an existing Marker with the text that goes in to the OverlayView as a parameter value is all that is needed. var m: TTMSFNCGoogleMapsMarker; begin TMSFNCGoogleMaps1.BeginUpdate; m := TTMSFNCGoogleMapsMarker(TMSFNCGoogleMaps1.AddMarker(TMSFNCGoogleMaps1.Options.DefaultLatitude, TMSFNCGoogleMaps1.Options.DefaultLongitude)); m.AddOverlayView(‘Hello World!This is an OverlayView.’); TMSFNCGoogleMaps1.EndUpdate; 2. Positioned at a fixed Coordinate The OverlayView is positioned at a fixed coordinate on the map. The size of the OverlayView remains fixed regardless of the map’s zoom level. In code, setting the Latitude and Longitude coordinates will position the OverlayView at that exact location on the map. var ov: TTMSFNCGoogleMapsOverlayView; begin TMSFNCGoogleMaps1.BeginUpdate; ov := TMSFNCGoogleMaps1.AddOverlayView; ov.CoordinatePosition := cpCenterCenter; ov.Coordinate.Latitude := TMSFNCGoogleMaps1.Options.DefaultLatitude; ov.Coordinate.Longitude := TMSFNCGoogleMaps1.Options.DefaultLongitude; ov.Padding := 5; ov.Width := 500; ov.Text := ” + ‘Uluru’+ ”+ ‘Uluru, also referred to as Ayers Rock, is a large ‘ + ‘sandstone rock formation in the southern part of the ‘+ ‘Northern Territory, central Australia. It lies 335 km (208 mi) ‘+ ‘south west of the nearest large town, Alice Springs; 450 km ‘+ ‘(280 mi) by road. Kata Tjuta and Uluru are the two major ‘+ ‘features of the Uluru – Kata Tjuta National Park. Uluru is ‘+ ‘sacred to the Pitjantjatjara and Yankunytjatjara, the ‘+ ‘Aboriginal people of the area. It has many springs, waterholes, ‘+ ‘rock caves and ancient paintings. Uluru is listed as a World ‘+ ‘Heritage Site.’+ ” + ‘Attribution: Uluru, ‘+ ‘https://en.wikipedia.org/w/index.php?title=Uluru ‘+ ‘(last visited June 22, 2021).’+ ”; TMSFNCGoogleMaps1.EndUpdate; 3. Positioned between preset Bounds The OverlayView is positioned between fixed Bounds coordinates on the map and the size changes depending on the map’s zoom level. When the map is zoomed out, the size of the OverlayView image automatically adapts to keep it inside the Bounds coordinates. In code, set the OverlayView Mode to omBounds to keep it positioned and sized between the Bounds coordinates.In this example an image is used to display a different style of map at that location. To make sure the image fills the entire available space,  it’s width and height must be set to 100%. Optionally the Padding, BackgroundColor, BorderColor and other configuration settings can be added. var ov: TTMSFNCGoogleMapsOverlayView; begin TMSFNCGoogleMaps1.BeginUpdate; ov := TMSFNCGoogleMaps1.AddOverlayView; ov.Mode := omBounds; ov.Text := ”; ov.Bounds.NorthEast.Latitude := 40.773941; ov.Bounds.NorthEast.Longitude := -74.12544; ov.Bounds.SouthWest.Latitude := 40.712216; ov.Bounds.SouthWest.Longitude := -74.22655; ov.Padding := 0; ov.BackgroundColor := gcNull; ov.BorderColor := gcNull; TMSFNCGoogleMaps1.EndUpdate; Available now The TMS FNC Maps v2.1 update is available now. You can download the latest version and start using the new OverlayViews feature right away!

Read More