Adam’s Nov 2020 Meeting Summary


  • Marvin – internal system for support, billing, server monitoring and scheduled upgrades – Patrick Hort
  • Oh **** we need an installer – Rob Lambden
  • Webpage route planner with Google API – Mark Jacob

Adam’s Summary

Last meeting of 2020, see you all on the other side in January 2021!

News/Problem Clinic

Jason discussed MS Lists, Microsoft’s new “to-do-list-on-steroids”, and Powertoys 0.25, a windows add-in from Microsoft with a few new cool features, that may be incorporated into future releases of Windows. Have a look at the relevant websites, as they are interesting. These are in the DevGroup Slack if you haven’t seen them already.

In the problem clinic, I complained about issues with differences in operation of my executables depending on whether they had been built with the 32 or 64bit compiler. Forms in the 64bit version show some strange behaviour such as not dragging off-screen, and randomly changing size when dragged between monitors. No solutions were provided, so please post comments if you have any ideas.

I also complained about the dearth of information about exactly what happens with .DCU files during the compilation process, as once you compile a project to more than one platform this becomes a real issue. Again, members didn’t have much to add, and I would be grateful to hear comments about any resources that actually explain how the compilation process works in terms of creation of DCUs. I say this because I am getting errors during compilation as I compile in 32bit and then 64bit (or vice versa).

Patrick Hort: Savoy Systems Application Framework & Marvin

The talk was slated to cover “Marvin” a Business Management Tool used by Savoy Systems, but over 90 minutes Patrick actually went into depth on many aspects of the operation of his multi-part development framework which includes server applications, web-ISAPI applications, a “service agent” and client-side executables, all working above a SQL Server database.

The whole package is a fantastic example of a “whole problem solution” built entirely in Delphi, with many moving parts and plenty of automation. Marvin allows Patrick to view the detailed operation of his customer’s server status and operations and to automate complex work such as upgrades that include substantial changes to the database structure.

Patrick has also created a Delphi project which contains all the elements of the whole framework so that consequences of change are immediately visible during development, he says this has helped him spot bugs on multiple occasions.

He has written a code-generation mechanism which allows him to write class definitions in XML which is then built into the classes of the application and generates the database-creation SQL. He keeps a sequence of XML files with every version of the system definition as objects in his source, and has a mechanism to do a diff-check between versions and generate change-scripts to update the database automatically, it is complex and impressive and 90 minutes wasn’t really long enough for an excellent talk.

Rob Lamden: The NSIS Installer and TMS TWebUpdate

Once you have your Delphi App, how do you install it onto customer machines? Once you have a program installed you may then need to update or upgrade it, how will you do this?

Strangely there is no tool built into Delphi to assist in this process. Many of us work on servers, or with fairly limited distributions of our code, so it is not much of a problem. But as soon as you need to install a program you have to decide how to do it.

Rob selected NSIS (Nullsoft Scriptable Install System) for the install process, and TMS WebUpdater for the upgrade-process, and his talk discussed using these two tools.

NSIS uses a relatively straight forward scripting language, with a default script created using the product’s wizard. Programmers write an installation script, compile it with NSIS, and standard Windows Install (and Uninstall) packages are created.

The TMS WebUpgrader is a Delphi component that actually sits on the MainForm of your App and provides functionality for upgrading / updating. The component allows a programmer to store a URL that connects to a web-server repository in which a version of the program can be stored and write commands which can be added to the program to identify when a new version should be downloaded.

Rob talked through this well, giving good insights into key problems including issues like code signing, for which he referenced DigiCert as a (paid for) provider of code-signing certificates. I will definitely look at TWebUpdate as I think it could be a useful tool. I already use InnoSetup in the role Rob uses NSIS, and it seems to have a similar feature-set.

Mark Jacobs: Route Planning with the Google API

Mark has built a demo website ( which contains clear, easy to understand javascript code using the Google-maps API to draw route-maps. Members are free to go to and look at the code and use it if they wish to.

Google allow developers with a registered developer account to access the Google API by issuing them with a standard OAUTH-type key. The exact license terms are complex, but basic use within a Google-map on-screen is free for sites making less than 10,000 requests per month, and after that point a figure of $2 per 1,000 requests was quoted.

The API allows declaration of objects such as “map”, “line”, “point” which can be requested, interograted and drawn with reasonably simple code such as map.calcRoute, map.setCenter and map.fitBounds([bounds object]).

The demo website is only a few lines of java script and enables quite complex functionality by surfacing Google’s very powerful API. Good and clear from Mark, and nice to have a bit of Javascript to look through for a change.

The meeting was well attended, and well chaired by Jason. Roll on January. Apologies in advance for Typos!