5 Minute Snack: TMSWebGMaps: How to zoom in on all markers — reliably

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 MapDownloadFinish  (granted, 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.

Posted in Delphi, Snacks Tagged with: , , , ,

5 Minute Snack: Creating columns with calculated field values on demand with TTMSFNCGrid

As mentioned, I am in the process of preparing a video tutorial about FNC controls. The next video will be about TTMSFNCGrid, a bindable and datasource capable datagrid that will behave the same way in any framework and any platform.

The amount of properties, methods and events is immense and thus you can only get to know the control by using it in your projects. One of these projects involved dislaying additional information for the user that is based on the columns displayed in the grid.

I will simplify my actual example as such:

In the grid we allow the user to enter a start date and an end date for a project in the first two columns of each row. The third column will display the number of days between these dates. Pretty simple task, but no grid in this would has predefined calculations like this.

We have several approaches in Delphi. One approach would be to create an TFDMemTable with two fields and an additional calculated field for the number of days. This dataset can then be bound to the grid.

However, this is a simple example and for a real-life project we might not want to change our datasets for a visual finesse. 

Thus, we simply want to use the grid control to display that info for us, but we are not interested in persisting this information or use it anywhere else. 

After having created a VCL Forms Application I dropped a TTMSFNCGrid on the form and defined the number of Columns ( ColumnCount ) and Rows ( RowCount ) using their respective properties. I also set FixedColumns  and FixedRows  to 1 . Set DefaultColumnWidth  to 120  and DefaultRowHeight  to 24 . 

In order to add rows, I add a button of type TTMSFNCButton .

The form should look something like this:

You might add anchors and other eye candy as you please.

Next, we have to allow for the user to add rows to the grid. For this, we need to implement the GridCanAppendRow-event:

Pretty simple, as we want to allow a row to be added without any restrictions. Of course, you could limit the number of total rows by stating:

This will allow for 20 user-rows to be added. In case you ever add a footer you need to consider that row as well.

The button does the actual adding of the row:

Unlike the VCL a change of rows does not delete the content of the grid. The FNC grid is pretty smart and notices that you simply want to add a row and keeps the data in place.

If you ran the example right now, you would already be able to enter data and add rows. However, there is absolutely no user comfort entering the data. Also the difference in days is not being calculated.

Double-click the grid and amend some properties for the columns:

We select the etDatePicker  for the columns the user enters the dates into. Furthermore, we can set  ReadOnly to true  for the calculated column.

In order for the user to be able to navigate the grid nicely we set some additional keyboard options. We want to the user be able to press enter to go to the next column and add a row in case the last column of the row has been reached. Furthermore, we want the user to be able to use Tab to navigate between the columns:

For this we have the properties Grid.Keyboard.EnterKeyHandling  and Grid.Keyboard.TabKeyHandling  as seen in the screenshot above.

The only thing missing is the calculation. The grid offers the event OnGetCellData :

The implementation is pretty straight forward. If there is no valid data, the column stays empty. Otherwise, we return the number of days in the provided variable named CellString .

Running the example yields a very comfortable user experience with the desired result:

 

Posted in Delphi, Snacks Tagged with: , , ,

[German] Neue Video Tutorials über TMS FNC

Sie alle wissen, dass ich von Delphi weiterhin begeistert bin und den darin enthaltenen Technologien, die unser Leben als Programmierer erleichtern. Allerdings war ich schon lange nicht mehr so begeistert, wie nach meiner letzten “Entdeckung”. Sie haben vielleicht mitbekommen, dass ich FNC in einigen meiner letzten Beiträge erwähnt habe und ich FNC auch in meinen Votrag in Frankfurt während des letzten Delphi Code Camps einbezogen habe.

Seitdem ich mich mehr und mehr mit FNC auseinandersetze, ist mir erst klar geworden wie viel Zeit und letztendlich auch Geld man durch den Einsatz von  FNC einsparen kann, wenn man es im Kern von kommenden Delphi Anwendungen verwendet. Selbstverständlich kann es auch sehr einfach in bestehende Anwendungen eingebunden werden und arbeitet mit anderen Frameworks problemlos zusammen.

Um es zu wiederholen: Bei FNC handelt es sich um eine Sammlung von Framework Neutralen Komponenten, die in Delphi, C++ und Lazarus mit jedem der angebotenen Frameworks für jede der angebotenen Zielplattformen benutzt werden kann. Die Komponenten funktionieren dabei in jeder Sprache und jedem Framework vollständig identisch.

Das klingt umöglich, aber FNC zeigt, dass es geht.

Wenn Sie somit wissen, wie Sie eine Balkengrafik mit FNC in einer Delphi VCL Formularanwendung erstellen, dann können Sie den selben Quelltext in eine FireMonkey Anwendung übernehmen und das Ergebnis auf einer mobilen Plattform bereitstellen. Für Sie bleiben die Eigenschaften, die Methoden und die Ereignisse in jedem Framework identisch und die Einarbeitungszeit wird dadurch deutlich reduziert im Vergleich zu anderen Komponentensammlungen, sobald Sie mehrere Plattformen bedenken müssen!

Sollten Sie Video Tutorials bevorzugen, habe ich ein Angebot für Sie! Ich habe vor einer Weile eine Serie zu FNC begonnen. Bis jetzt wurden zwei Videos veröffentlicht, die eine Einführung in FNC und einen tieferen Blick in die Architektur des Frameworks werfen. Alle bisherigen Videos – und zukünftige – sind sowohl in Englisch als auch in Deutsch verfügbar. 

Ich möchte dabei hervorheben, dass ich für jede Sprache ein individuelles Video erstelle. Es ist einfach nicht möglich die eine oder andere Sprache als erstes aufzunehmen und dann eine weitere Tonspur hinzuzufügen.

Hier sind die Links zu den ersten beiden Videos:

English
1: Introduction
2: Components
German
1: Einführung
2: Komponenten
Posted in Delphi

[German] 5-Minuten-Snack: VCL, FMX und eine Alternative von TMS

Es gibt zahlreiche Komponentenbibliotheken für die Visual Component Library (VCL) und FireMonkey (FMX). 

Zahlreiche der Komponenten, die es für die VCL gibt, gibt es mittlerweile auch für FMX. Schaut man sich zum Beispiel das Angebot von TMS Software an, so gibt es eine Kartenkomponente für die VCL, die den komfortablen Zugriff auf Google Maps ermöglicht mit dem Namen “TMS VCL WebGMaps”. Für FireMonkey heißt die Komponente “TMX FMX WebGMaps”.

Somit erhalten wir für diese Komponente die folgende Matrix im Bezug auf die verfügbaren Zielplattformen:

 
VCL WebGMaps +      
FMX WebGMaps + + + +

Daraus folgt, wenn Sie sich auf Windows 32 und Windows 64 beschränken, so werden Sie sich höchstwahrscheinlich für die VCL Variante entscheiden. Benötigen Sie allerdings auch eine andere Plattform, so werden Sie auf die FireMonkey Lösung zurückgreifen müssen.

Obwohl Embarcadero sich wirklich bemüht, die Unterschiede zwischen der VCL und FMX so gering wie möglich zu halten, gibt es einschlägige Unterschiede zwischen den Frameworks. Komponenten für beide dieser Frameworks zu entwickeln, stellt den Entwickler vor schwierige Entscheidungen wie man die Entwicklung mit seinen Komponenten so leicht wie möglich gestalten kann. Die Benutzer der Komponenten wollen so wenig wie möglich mit diesen Unterschieden kämpfen.

Ich werde an dieser Stelle auf eine der Fallen hinweisen, in die ich vor einigen Tagen getappt bin. Ich habe damit begonnen, eine Kartenanwendung zu entwickeln, die “TMS FMX WebGMaps” benutzt. Die Kartenfunktionalität zu einer Anwendung hinzuzufügen wird dadurch wirklich auf das “Fallenlassen” der Komponente reduziert. Kern der rapiden Anwendungsentwicklung mit Delphi… Es ist kein Quelltext zu schreiben. Für die grundlegende Funktionalität muss man sich nicht einmal darum kümmern, eine Zugangsberechtigung von Google in Form eines API Schlüssels zu bekommen.

Es stellte sich dann doch heraus, dass keine Notwendigkeit für mehrere Plattformen bestand und ich fühle mich weiterhin in der “guten alten” VCL sehr wohl, wodurch FireMonkey nicht benutzt werden musste. Somit wechselte ich frühzeitig zu einer VCL Formularanwendung und nutze die VCL Variante der Komponente. Ich startete die Anwendung und musste feststellen, dass die Karte nicht dargestellt wurde. Hätte ich die Dokumentation gelesen, wäre mir klar gewesen warum. Lassen Sie uns an dieser Stelle eine grundlegende Sache festhalten:

Gehen Sie niemals davon aus, dass eine Komponente, die für VCL und FMX verfügbar ist, auch in beiden Frameworks identisch zu benutzen ist. Die Architektur des jeweiligen Frameworks wird sicherlich einige Unterschiede erforderlich machen.

In diesem Fall, ist die Kartenkomponente manuell zu “starten”. Kein Problem, eine Zeile Quelltext. Nach der Anpassung funktionieren beide Komponenten dann wieder gleich aus der Sicht des Entwicklers. Die selben Eigenschaften, Methoden — alles.

Trotzdem, ich fragte mich, warum ich den Denkfehler gemacht habe. Der Grund ist recht simpel.

TMS bietet Komponenten, die wirklich als Cross-Plattform und zusätzlich auch noch als “Cross-Framework” bezeichnet werden können. Jede Komponente der FNC (Framework Neutrale Komponente) kann eingesetzt werden mit:

  • Visual Component Library (VCL)
  • FireMonkey (FMX)
  • Lazarus Component Library (LCL)

Durch diese Wahlfreiheit eröffnen sich uns als Entwickler die folgenden Plattformen durch den Einsatz von FNC:

  • Windows 
  • MacOS
  • iOS
  • Android
  • Linux
  • Raspberry Pi

Aus dieser Liste geht hervor, dass jede Komponente in jedem Framework das gleiche Verhalten hat. Es gibt keinen Unterschied, ob man die Komponente in der VCL, FMX oder LCL verwendet – es ist immerzu die selbe Komponente und nicht eine Implementierung in dem jeweiligen Framework. Verdeutlichen wir uns diesen Sachverhalt anhand der Kartenkomponente, so wird uns klar, dass wir mit zwei Komponenten in zwei Frameworks arbeiten.

Genau das macht FNC so mächtig und auch so verdammt schwierig für den Hersteller zu entwickeln. Es sind 3 verschiedene Klassenbibliotheken mit 6 Zielplattformen zu berücksichtigen — mal ganz davon abgesehen, dass sowohl die VCL als auch FMX zahlreiche verschiedene Versionen haben! Die VCL in Delphi XE2 ist nicht identisch mit der in Delphi Berlin 10.1.

Daher hat das Team von Bruno Fierens meinen großer Respekt für diese Leistung! Ich möchte nicht in ihren Schuhen stecken, wenn Anpassungen an den Komponenten vorzunehmen sind…

Dadurch, dass ich FNC kenne und bereits einsetze, habe ich den Fehler gemacht zu erwarten, dass jede FMX Komponente den Luxus bietet genau wie ihre VCL Variante zu funktionieren — sofern es überhaupt eine entsprechende Variante im anderen Framework gibt, wie es bei WebGMaps von TMS der Fall ist.

Nebenbei, in FNC gibt es bereits:

  • Grids zur tabellarischen Darstellung und Bearbeitung von Daten,
  • einen Terminkalender,
  • einen Rich-Text Editor,
  • Tree View zur hierarchischen Darstellung von Informationen,
  • eine PDF Bibliothek,
  • Page Controls,
  • Page Container,
  • zahlreiche TEdit-Derivate,
  • zahlreiche Listen,
  • zahlreiche Komponenten zur Auswahl aus Listen (Pickers),
  • Diagramme
  • und einiges mehr…

Beachten Sie, dass es zur Zeit eine Videoserie zu FNC gibt, um sich mit FNC vertraut zu machen. Die Serie wird in englischer und deutscher Sprache produziert.

Posted in Delphi, Snacks Tagged with: , , , , , ,