Newest book about TMS FNC Maps is ready

In April this year, we were pleased to release our new product TMS FNC Maps and announce it. TMS FNC Maps bundles all our expertise with using mapping services, with writing cross-platform and cross-framework Delphi code as well as building components for TMS WEB Core web client applications. From the beginning, we made the radical decision to base this work on the new operating system browser Edge Chromium from Microsoft for the Windows platform (where we already use Safari for iOS and macOS and Chrome for Android). From the very beginning of this development, our chief evangelist Dr. Holger Flick was involved and could play with internal versions and give feedback and steer the development.

This week all pieces of the puzzle fall together. After months of intensive work and collaboration with our development team, the new book from Holger, “Hands-on with Delphi: FNC Maps”, is ready for sale. A coincidence or not, but also from this week, the Edge Chromium version Microsoft automatically deploys to Windows 10 operating systems also reached the version needed to use TMS FNC Maps on Windows. So, this means, on Windows it is no longer necessary to download and install a developer specific version of Edge Chromium. But my colleague Pieter Scheldeman will reveal more details shortly. Today is about the brand new book!

If you want to integrate mapping services’ functionality such as from Google Maps, Bing Maps, Openstreet Maps, Here maps, TomTom maps, Azure maps in a Windows VCL application, a cross platform FireMonkey application or a TMS WEB Core web client application, TMS FNC Maps addresses it all and the new book covers developing with TMS FNC Maps in great detail over close to 400 pages.

Content

  • Get to know the FNC framework, FNC Core, and FNC Maps in a nutshell.
  • Learn about FNC Maps in detail: You will find dozens of hands-on examples from installation to modern multi-tier applications with large databases, web services, web, and desktop clients.
  • Annotate maps and visualize data using markers with clustering, lines, shapes, pop-up windows and routes.
  • Build applications that can handle any geographical data and interact with other Geographic Information Services (GIS). Load GPX tracks from GPS devices, GeoJSON shapes, and Google Earth-specific KML layers.
  • Include other mapping services to get directions with turn-by-turn instructions, to geocode addresses, and to determine your geolocation.
  • Create reports with a customizable template based on data from maps and databases.
  • Allow users to freely customize maps using events or interactive markers and shapes.

The examples in the book make use of:

Embarcadero Delphi Sydney 10.4 or newer suggested. Trial versions and free developer accounts of service providers suffice to run the examples. SQLite database examples are ready for use without server setup. Basics for reporting, web, and XData explained in “TMS WEB Core: Web Application Development with Delphi” and previous Hands-On titles are not included again but referenced.

How to order

Read More

Read More

What’s the piece of Delphi knowledge you find yourself looking up over and over again…

From an interesting thread at [WayBack] What’s the piece of Delphi knowledge you find yourself looking up over and over again? For me format strings is probably the thing that most stubbornly… – Lachlan Gemmell – Google+ [WayBack] format strings Generics, as not much has changed in the docs since [WayBack] Overview of Generics or the linked articles: [WayBack] Terminology for Generics [WayBack] Declaring Generics [WayBack] Overloads and Type Compatibility in Generics [WayBack] Constraints in Generics [WayBack] Class Variable in Generics [WayBack] Changes in Standard Functions and Grammar [WayBack] Declared Constants: Typed Constants File extenions with or without dot? The prefix period is included [WayBack] Delphi Basics : extractfilename command, but the file NAME does not include a prefix backslash: [WayBack] AnsiStrings.ExtractFileExt Function [WayBack] AnsiStrings.ChangeFileExt Function [WayBack] irregular syntax, for instance record constants [WayBack] variant parts in records On the generics side, I have wrote a few bits in my blog before, often pointing to information by others (many by Stefan Glienke as his skills on this topic are beyond excellent): Delphi Constraints in Generics – RAD Studio XE documentation wiki Impossible: Property using Generics in Delphi. Interfaces/classes/methods/fields/constraints/type inferencing are How do I test an interface? Should I even do that? | Software on a String As Delphi generics are not supported for free functions, wrap them in a record container Workaround for Delphi 2010 compiler error “E2076 This form of method call only allowed for class methods” when it infers a generic parameter type The Default magic function in Delphi Reminder: rebuild my Nullable Types based on Class Operators in Delphi Implementing Memoize in Delphi 2009 – Community Blogs – Embarcadero Community Delphi XE8 things I learned from the first week of G+ reading Delphi/Fortran memory allocation difference: row/column major order makes a big difference. StackOverflow answer Spring4D: How is the GlobalContainer intended to be used? Are there important don’ts? Delphi: do not mix interfaces and classes part X If you use Delphi or RAD Studio 10.2.2, ensure you have the latest one installed (build 2004) as it fixes some binary DCU incompatibility bugs Reminder to self – proposals for Delphi Language Enhancements, a year later Delphi and the joy of Compiler Intrinsics – I cant use “Length” as a TFunc… Delphi sorcery: Generics, modules and typeinfo Interesting discussion about generic Dictionaries in Delphi (via: Steve Maughan – Google+ – TObjectDictionary Advice Needed) Stefan Glienke on Delphi generics: Implementing List Enumerator OfType in Delphi – Stack Overflow Implementing Memoize in Delphi 2009 – Community Blogs – Embarcadero Community Delphi history: No, dynamic arrays do not support a non-zero lower bound, but what if you want them? – via Stack Overflow Looking for more examples of Unicode/Ansi oddities in Delphi 2009+ Delphi analog to C# ?? null-coalescing operator and Light Table like debugger evaluation Some interesting Delphi posts by Stefan Glienke – Spring4D maintainer Delphi XE8 things I learned from the second week of G+ reading Some links to Delphi Unit Testing history Default comparers in Delphi used by TArray.Sort (via: Stack Overflow) Call for help: Spring4D and Delphi MultiCast events: working for Win32, Win64 and Mac OS X x64, but Android/iOS ARM help needed More Delphi PDF manuals (via: Cape Cod Gunny Does Delphi: The One Manual Every Delphi Programmer Should Have!) Some Delphi libraries and ideas you should take a look at (link clearance) Some words on Unicode in Windows (Delphi, .NET, APIs, etc) Another case against FreeAndNil On List growth strategies and memory managers RAD Studio 2015 Roadmap – Blogs CodeRage 9 Q&A: Advanced RTTI in Object Pascal (Ray Konopka) co-worker question: what is better, extension methods or helper classes? And on records: Delphi “Variant Records”, a few notes Undocumented Delphi record alignment directive – Chee Wee’s blog: IT solutions for Singapore and companies worldwide Record helpers can do wonders for code clarity Delphi: ^TNodeData incompatible with PNodeData – {$T+} versus {$T-} There are some very good books on Delphi though that dig deeper than the documentation: Delphi books you should have or have read –jeroen
Read More

Request payments with QR codes in a TMS WEB Core application

After releasing our free TWebQRCode component for TMS WEB Core, we wanted to see if there is a way to make payments with QR codes. While most solutions rely on different services and API keys, there’s one European standard that many banks adopted already in some European countries. If you are curious about the full list of supported countries and banks, please head over to scan2pay.info

This standard is called EPC QR code and it is actually nothing more than a structured content that can be used to initiate a SEPA credit transfer.
Structuring the content manually is OK for some people, but we went a step further and updated our TWebQRCode component so you can take advantage of EPC QR codes to request payments with as little effort as possible:

  • TWebQRCode.GenerateEPCCode is a new method with parameters based on the EPC QR guidelines. The mandatory fields are the BIC code, beneficiary name and beneficiary IBAN number.
    //Generate EPC QR code with mandatory fields
    WebQRCode1.GenerateEPCCode('BIC', 'Beneficiary name', 'Beneficiary IBAN number');
    //Generate EPC QR code to request 5.5 EUR payment
    WebQRCode1.GenerateEPCCode('BIC', 'Beneficiary name', 'Beneficiary IBAN number', 5.5);
  • TWebQRCode.CorrectionLevel is a new property where you can set the error level of the QR code. The error level determines how much of the QR code can be missing while keeping it readable. An EPC QR code must be generated with M error level. The GenerateEPCCode method takes care of the correct error level setting under the hood.
  • We also updated the JavaScript file that we use in the TWebQRCode component, so if you experience any issues after downloading the component again, please try to clear your browser cache first.

You can download the updated TWebQRCode component from our TMS WEB Core Partner page. We also created a small application to demonstrate how easy it is to use TWebQRCode to generate payment requests. You can check it out by clicking the button below!

There are some countries that adopted a different format. For example the Czech Republic and the Slovak Republic uses Short Payment Descriptor. While we are unable to test this, one of you might find the idea interesting enough to test it with our TWebQRCode component or to create your own component for it. 😉 And don’t forget, if you have a component that’s worth sharing with others then contact us, become a TMS WEB Core Partner and enjoy the benefits!

Read More

Read More

Create calendar events with TMS WEB Core

The world is busier than ever and unless you are gifted with an incredible memory you need your own agenda to keep track of all the appointments and events. Luckily there are media types that allow you to store and share calendaring and scheduling information: vCalendar and iCalendar. But what is the difference between the two? To put it simply, vCalendar is an older format while iCalendar a newer format that is based on vCalendar. Both formats are widely supported.

vCalendar and TMS WEB Core

In many cases if you download a VCS/ICS file your device will either automatically try to add it to your calendar or you first need to open the file and then it will prompt you to add it to your calendar – as long as you have an application installed that supports VCS/ICS.
So we asked ourselves: Can we create and download a VCS/ICS file directly from a TMS WEB Core client application? A few hours of research work resulted in a new non-visual component: TWebvCalendar.

TWebvCalendar is a component that implements the RFC2445 specification. It encapsulates the functionality of vCalendar and iCalendar in a Delphi-friendly way.

To change between the two formats, use the TWebvCalendar.vCalendarVersion property, where the vv1 value indicates vCalendar and vv2 refers to iCalendar. The default version is set to vv2 as most modern calendaring/scheduling applications support it anyway.
You can add the events either at design-time or programmatically via the TWebvCalendar.vEvents property, which is a collection of TvEvent items.

procedure TForm1.WebButton1Click(Sender: TObject);
var
  vevent: TvEvent;
begin
  vevent := WebvCalendar1.vEvents.Add;
  vevent.DTStart := EncodeDate(2020,8,1)+EncodeTime(10,0,0,0);
  vevent.DTEnd := EncodeDate(2020,8,1)+EncodeTime(12,0,0,0);
  vevent.Summary := 'My first appointment';
  vevent.Location := 'My location';
  WebvCalendar1.SaveToFile('mycalendar.ics'); //default is vv2
end;

The various TvEvent properties are all based on the specification linked above.

Example

We have some events coming up in the following weeks starting this Thursday (13th August) with a Webinar hosted by Embarcadero Germany. If you haven’t already, you can still register here!
To keep track of all these events, we decided to create a Progressive Web Application (PWA). A PWA behaves just like a regular website when you visit it from your browser:

But as you can already see in the image, it’s also possible to install it as an application on your device! After that, it can be accessed from the home screen:

From left to right the images are as follows: Application on the home screen, running the installed application and clicking the “Add” button.

The code itself is rather simple. First we need to make an HTTP request and process the incoming JSON response that contains all the events. It’s important to mention that we store and retrieve the time for each event in UTC with no offset. This way when we convert a time to a JavaScript Date object and after that to a TDateTime object, the correct time zone is automatically handled. If you are currently not in the CEST time zone, then you are going to see a different time than what’s seen in the picture above.

The next thing to do is to show the event items in a TWebResponsiveGrid. While we process the incoming data we can use the TWebResponsiveGridItem.ItemObject property to save everything we want to access later. Then to add these event to our calendar, we add a button to each of these grid items by implementing the TWebResponsiveGrid.OnItemCreated event:

procedure TForm3.WebResponsiveGrid1ItemCreated(Sender: TObject; Index: Integer);
var
  cont: TControl;
  btn: TWebButton;
  itm: TWebResponsiveGridItem;
begin
  itm := WebResponsiveGrid1.Items[Index]; //get the grid item

  cont := TControl.Create(WebResponsiveGrid1); //create a dummy TControl
  cont.Container := itm.ElementHandle; //assign the TJSHTMLElement of the item to the dummy control
  
  btn := TWebButton.Create(cont);
  btn.Parent := cont;
  btn.Caption := 'event Add';
  btn.Tag := Index; //set the Tag to the Index value
  btn.Cursor := crHandPoint;
  btn.ElementClassName := 'add-button'; //this CSS class contains the button positions
  btn.ElementPosition := epIgnore;
  btn.OnClick := DoEventClick;
  //Add the ElementHandle of the button to the ElementHandle of the grid item.
  //It depends on your specific item structure, but usually it looks something like:
  //itm.ElementHandle.appendChild(btn.ElementHandle);
end;

The DoEventClick method gets assigned to all of the buttons, so we are going to use the Tag property to differentiate between the different buttons. All that left to do is to create a TWebvCalendar instance and save the event to our device:

procedure TForm3.DoEventClick(Sender: TObject);
var
  ev: TEventItem; //this is a custom TObject class
  vcal: TWebvCalendar;
  vevent: TvEvent;
begin
  ev := TEventItem(WebResponsiveGrid1.Items[(Sender as TWebButton).Tag].ItemObject); //get the ItemObject 
  vcal := TWebvCalendar.Create(self);
  vcal.vCalendarVersion := vv2; //use iCalendar
  vevent := vcal.vEvents.Add;
  vevent.DTStart := ev.StartTime; 
  vevent.DTEnd := ev.EndTime;
  vevent.Summary := ev.Subject;
  if ev.Location  '' then 
    vevent.Location := ev.Location;
  vcal.SaveToFile('myevent.ics');
  vcal.Free;
end;

We believe that this example once again proves how powerful TMS WEB Core is. Our demo can be accessed online by clicking the button below and don’t forget that this is a PWA, so you can add it to the home screen of your mobile device!

We also decided to make this TWebvCalendar component available through our TMS WEB Core Partner program just like we did with TWebQRCode and TWebZip components. You can download it for free from here. The full source code of the demo is also available in the download, so you already have a starting point if you want to create something similar for your web application!

To install, open, compile & install the package from the “Component Library Source” folder. This will install the design-time TWebvCalendar component.
For use at runtime, make sure that the “Core Source” folder is in your TMS WEB Core specific library path that you can set via IDE Tools, Options, TMS Web, Library path.

Read More

Read More

Delphi What’s new history and a docwiki URL trick

One of the great things about the Delphi docwiki structure is that the naming system is very consistent. The consistency helps you quickly finding the What’s new for any version, just by getting the latest first. Getting the latest one is based based on a docwiki redirection trick that always redirects from an “unversioned” URL to the latest one. So these two “unversioned” URLs always get you there: http://docwiki.embarcadero.com/RADStudio/en/What%27s_New just the “What’s new” for the current release http://docwiki.embarcadero.com/RADStudio/en/What_Was_New_in_Past_Releases a list of “What’s new” links from the prior release all the way back to 2007 When writing this, the above links got me the below list. For consistency (as you cannot save URLs for prior versions in the WayBack machine because a brain-dead robots.txt setting which archive.is luckily ignores): [Archive.is] http://docwiki.embarcadero.com/RADStudio/Tokyo/en/What’s_New [Archive.is] http://docwiki.embarcadero.com/RADStudio/Tokyo/en/What_Was_New_in_Past_Releases [Archive.is] http://docwiki.embarcadero.com/RADStudio/Berlin/en/What’s_New [Archive.is] http://docwiki.embarcadero.com/RADStudio/Tokyo/en/What_Was_New_in_Berlin [Archive.is] http://docwiki.embarcadero.com/RADStudio/Seattle/en/What’s_New [Archive.is] http://docwiki.embarcadero.com/RADStudio/Tokyo/en/What%27s_New_in_Seattle [Archive.is] http://docwiki.embarcadero.com/RADStudio/XE8/en/What’s_New [Archive.is] http://docwiki.embarcadero.com/RADStudio/XE8/en/What’s_New_in_Delphi_and_C++BBuilder_XE8 [Archive.is] http://docwiki.embarcadero.com/RADStudio/XE7/en/What’s_New [Archive.is] http://docwiki.embarcadero.com/RADStudio/XE7/en/What’s_New_in_Delphi_and_C++Builder_XE7 [Archive.is] http://docwiki.embarcadero.com/RADStudio/XE6/en/What’s_New [Archive.is] http://docwiki.embarcadero.com/RADStudio/XE6/en/What’s_New_in_Delphi_and_C++Builder_XE6 [Archive.is] http://docwiki.embarcadero.com/RADStudio/XE5/en/What’s_New [Archive.is] http://docwiki.embarcadero.com/RADStudio/XE5/en/What’s_New_in_Delphi_and_C++Builder_XE5 [Archive.is] http://docwiki.embarcadero.com/RADStudio/XE4/en/What’s_New [Archive.is] http://docwiki.embarcadero.com/RADStudio/XE4/en/What’s_New_in_Delphi_and_C++Builder_XE4 [Archive.is] http://docwiki.embarcadero.com/RADStudio/XE3/en/What’s_New [Archive.is] http://docwiki.embarcadero.com/RADStudio/XE3/en/What’s_New_in_Delphi_and_C++Builder_XE3 [Archive.is] http://docwiki.embarcadero.com/RADStudio/XE2/en/What’s_New [Archive.is] http://docwiki.embarcadero.com/RADStudio/XE2/en/What’s_New_in_Delphi_and_C++Builder_XE2 [Archive.is] http://docwiki.embarcadero.com/RADStudio/XE/en/What’s_New [Archive.is] http://docwiki.embarcadero.com/RADStudio/2010/en/What’s_New [Archive.is] http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/whatsnewtiburon_xml.html [Archive.is] http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/EN/html/devcommon/whatsnewspacely_xml.html [Archive.is] http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/EN/html/devcommon/whatsnewcogswell_xml.html By now, there will hopefully be a few more Delphi versions released. Reminder to self: update the list (: –jeroen .gist table { margin-bottom: 0; } User-agent: * Disallow: /DevWiki/ Disallow: /Internal/ Disallow: /*/cache/ Disallow: /shared/ Disallow: /appmethod/sites/ Disallow: /sites/ Disallow: /menu/ Disallow: /Search/ Disallow: /VCL/ Disallow: /Libraries/XE/ Disallow: /Libraries/XE2/ Disallow: /Libraries/XE3/ Disallow: /Libraries/XE4/ Disallow: /Libraries/XE5/ Disallow: /Libraries/XE6/ Disallow: /Libraries/XE7/ Disallow: /Libraries/XE8/ Disallow: /Libraries/Seattle/ Disallow: /RADStudio/2010/ Disallow: /RADStudio/XE/ Disallow: /RADStudio/XE2/ Disallow: /RADStudio/XE3/ Disallow: /RADStudio/XE4/ Disallow: /RADStudio/XE5/ Disallow: /RADStudio/XE6/ Disallow: /RADStudio/XE7/ Disallow: /RADStudio/XE8/ Disallow: /RADStudio/Seattle/ Disallow: /CodeExamples/XE/ Disallow: /CodeExamples/XE2/ Disallow: /CodeExamples/XE3/ Disallow: /CodeExamples/XE4/ Disallow: /CodeExamples/XE5/ Disallow: /CodeExamples/XE6/ Disallow: /CodeExamples/XE7/ Disallow: /CodeExamples/XE8/ Disallow: /CodeExamples/Seattle/ Disallow: /CodeSamples/ Disallow: /AllAccess/e/ Disallow: /AppWave/e/ Disallow: /DBOptimizer/e/ Disallow: /RadPHP Disallow: /*/Special: Disallow: /*/index.php? Disallow: /*/index.php/ view raw docwiki.embarcadero.com-robots.txt hosted with ❤ by GitHub
Read More

Embarcadero Germany webinar about TMS WEB Core

With TMS WEB Core v1.5 Rimini just released, enthusiast German speaking Delphi web developers can learn about TMS WEB Core and in particular about the new features in the latest release v1.5 Rimini in the upcoming webinar organized by Embarcadero Germany.

Our chief evangelist Holger Flick will take a tour around TMS WEB Core and the exciting new capabilities v1.5 brings to increase your productivity for creating classic web applications, installable mobile applications (PWA or progressive web applications) and cross-platform Electron desktop applications. And this all from your familiar powerful Delphi 10.4 Sydney IDE. Bruno Fierens will also attend the webinar and will assist to handle all your questions. Register now for the webinar to ensure your seat.

Here is the original announcement text for the webinar in German:

TMS WEB Core ist für viele Delphi-Entwickler zu einem beliebten Entwicklungstool für Webanwendungen geworden. TMS Software hat in den letzten zwei Jahren regelmäßige Updates bereitgestellt, wodurch die Anzahl der Steuerelemente und Technologien zur Erstellung beeindruckender Webanwendungen ständig zunahm.

Dieses Webinar konzentriert sich auf die neue Version 1.5 Rimini, in der zwei Werkzeuge vorgestellt werden, die die visuelle Anwendungsentwicklung erheblich verbessern. Die Interaktion mit Webdesignern, die nicht an der Programmierung der Anwendung beteiligt sein müssen, wird viel einfacher werden. Außerdem werden neue Steuerelemente für handschriftliche Unterschriften, Styling, Benachrichtigungsfenster und Web Sharing eingeführt. Schließlich wird es mit der neuen Version möglich sein, datenbankgestützte Electron Desktop-Anwendungen zu erstellen, die direkt mit MySQL- und PostgreSQL-Datenbanken verbunden sind.

Jetz hier anmelden für das Webinar!

Read More

Read More

RAD Studio 10.4 Patch 3 is out: VCL Grids, C++ Win64 Debugging, and C++ Android Exception Handling and Resources

We've just released patch (or hotfix) 3 for Delphi, C++Builder and RAD Studio 10.4. If you use VCL grids or C++Builder, we recommend you install Patch #3, which we released today. This patch addresses a number of issues in RAD Studio 10.4 for the VCL...(read more)
Read More

TMS WEB Core v1.5 is around the corner

Our team has continued to work around the clock to move TMS WEB Core to the next level. And after version v1.4 Ravenna, the next level will be v1.5 Rimini (RIM-in-ee).

For those who have followed TMS WEB Core from the beginning at v1.0 Brescia know by now that each new version is named after a city along the famous Mille Miglia race, more precisely, the race of 1955. For those interested in the history, you can read about it here. But I assume that most of you are just interested in what TMS WEB Core v1.5 will bring.

Well, our team has worked on all fronts. That is:

  • Delphi IDE integration
  • UI controls
  • PWA support
  • Electron support

In a nutshell, the development experience improves for creating regular web client applications, PWA installable mobile device applications and Electron cross platform desktop applications.
Let’s go over each of the major improvements one by one:

1. Live preview

As you might know, the form designer in the Delphi IDE (and also the Lazarus IDE) is based on the VCL (LCL) framework. This means that at design-time, the controls on the form designer are rendered as VCL/LCL controls. While the designer is fast, familiar, and flexible, it is still a different way of rendering it than a real web browser-based rendering. Our team came up with an ingenious technique to show a live preview of a form in a web browser while working in the IDE:

  • 1. Make a change to a control’s property,
  • 2. add a new control on the form or change something in the layout and
  • 3. press Ctrl-S.

This triggers the live preview browser window to automatically update. The trick here is that live, a single form project consisting of this form in the designer is compiled live and shown in the web browser. Evidently, also when you use HTML templates, the live preview takes this into account and gives you a real preview of this form.

2. HTML template import

Over the last couple of versions, we have already made it significantly easier to work with forms using an HTML template. This means, a form where the layout is controlled by HTML/CSS and where you can use existing website templates for the design of your forms. Previously, you needed to know what HTML elements to bind in order to link HTML elements to UI controls in the designer. Then you had to drop these UI controls on the form designer and perform the binding manually using the ElementID property. Reflecting over this, it is clear that the majority of this work can be automated, and this is exactly what we have done in version v1.5 Rimini. Now, all you need to do is add the HTML for your form to the form’s HTML file and choose “HTML Sync” from the form’s context menu. This will parse the HTML, and it will create an appropriate UI control on the form designer and bind it to the HTML element. When you change the template later, for example, add more HTML elements, you can do the “HTML Sync” again and the added corresponding UI controls will be added to the form designer. We have a fixed mapping for specific HTML elements to UI controls as well as steered sync by specifying the UI control’s class name as the attribute for the HTML element.

3. Automatic operating system theme adoption

Meanwhile, all major desktop and mobile operating systems have introduced the concept of a light and dark themes to accommodate the typical preference of dark themes for young computer users and light themes for older computer users. Naturally, there is a tendency that young computer users will come to expect that a web application adopts a dark theme and vice versa for older users. Meanwhile, browsers offer capabilities of detecting whether the operating system where the browser runs is configured for a dark theme or light theme. And so, a TMS WEB Core application can automatically run using a dark theme or a light theme depending on these settings. Of course, this feature is optional, and it can be used in an automatic way or you can add application level code for switching to your desired theme in a customized way.

4. Access to the share sheet of mobile devices

Mobile device users have become used to sharing information with other applications. We put pictures of one app into another or share a URL from one app using another social media app: All with the help of the share sheet concept on mobile devices. With the introduction of the TWebShare component, it is now possible on iOS and Android devices to share a text, link, or file with another app of choice via a share sheet.

5. Unobtrusive notifications using Bootstrap toast messages

Just like Windows 10 has the concept of notifications, it is possible to add unobtrusive notifications to web applications. Bootstrap 4 offers nice rendering techniques for these notifications, also named toasts in Bootstrap terminology. With the TWebToast component, it is made easier than ever to add such a notification system to your web applications. Basically, you determine the position where notifications will appear and just add the toast body text and title to a collection of toasts that the component then manages to display on the screen. In a nutshell, toast notifications in web applications are only a RAD component away.

6. Direct local database access for Electron desktop applications

Till now, database access in an Electron desktop application had to be done in pretty much the same way as a regular web application, i.e. via a backend REST server (e.g. TMS XData). Although there is a nice advantage to this that the backend can be shared between a web client and an Electron desktop client, in many cases this is an undesirable overhead. With the introduction of two TDataset components, it is now possible to directly connect to a MySQL and a PostgreSQL database. So, in pretty much the same way as a VCL or FireMonkey desktop application, you can now connect to a MySQL or PostgreSQL database from a TMS WEB Core Electron cross platform desktop application.

7. Sentry service-based application JavaScript error and Object Pascal exception logging

Sentry is a cloud service for logging information for JavaScript errors in web applications. This is interesting for developers as it offers detailed information, a call stack, and browser/machine info when an error happens in a web application. This way, you can get insight into unexpected behavior for your applications that typically end-users could not have given. We have extended this concept to Object Pascal exception logging. So, think of Sentry as the Eurekalog or madExcept for TMS WEB Core Web Applications.

8. TWebComboBox with csDropDown style

Formerly, the TWebComboBox featured only csDropDownList style due to the obvious limitations of the underlying HTML elements. Now, we have overcome this limitation and the csDropDown style is now also available.

9. New grid.SaveToCSV() method

It is possible to call grid.SaveToCSV(AFileName: string) and the content of the grid will be offered as a download in CSV file format. This is of course also the case for a TWebDBGrid. This means, exporting database information to CSV is now a piece of cake.

10. Tons of smaller component improvements

Again, we have learned a lot from user feedback and our own experience building web client apps that have led to improvements throughout the framework. These improvements can be seen on many levels: layouting, HTML element binding, database binding, VCL compatibility, … and much more.

It is clear our team is very enthusiast about the upcoming TMS WEB Core v1.5 Rimini release. With every new release, we have enjoyed producing web client applications with TMS WEB Core even more and we are excited when we hear users share the same enthusiasm.

TMS WEB Core v1.5 Rimini will be in your hands early August. If you are a TMS ALL-ACCESS user and interested in a beta, please contact us with the information about what Delphi version you use. As a side note, this v1.5 feature set for web application development (excluding PWA or Electron applications) is also what will be available in the upcoming TMS WEB Core for Visual Studio Code.

Read More

Read More

DevExpress now Supporting FMX

I was so excited when I read Frank’s post today about DevExpress offering a FMX grid control.  So I went to download it, only to discover that in order to get the CTP release, an * “Active VCL Subscription or Express GridPack is required”. Sadly I don’t personally have an active subscription so looks like I will have to wait until the release to give it a spin.  For those of you lucky enough to meet the requirements, who haven’t already purchased a TMS or Infpower grid for FMX, let me know what you think.  For the VCL, the Quantum Grid has practically been the defacto standard in most applications I’ve worked on, so I’m very interested to see what DexExpress is offering for FMX. DevExpress took a wait and see position with FMX, so it’s very encouraging for the Delphi ecosystem to see them throw their hat into the ring.
Read More