Blog

Code

Typableitung in generischen Methoden

Durch ein interessantes Code-Beispiel, hinter dem von Kim Madsen zunächst ein möglicher Bug im Delphi Compiler vermutet wurde, habe ich mir das Aufruf-Verhalten von überladenen Methoden, die auch generische Typ Parameter enthalten, genauer angesehen. Ich war von dem möglichen Fehler nämlich überrascht, da ich ziemlich sicher in aktuellen Projekten Overloads mit Kombinationen aus generischen und nicht-generischen Methoden verwende, ohne das offensichtliche Fehler auftreten.

Hier eine vereinfachte Darstellung von Kim’s Code:

TFoo = class(TObject)
  public
    function DoSomething(SomeObject: TValue): string; overload;
    function DoSomething<T>(SomeObject: T): string; overload;
  end;

TBar = class(TObject)
end;

//...

var Foo := TFoo.Create;
var Bar := TBar.Create;

Foo.DoSomething(Bar);

Welche der beiden möglichen Varianten von DoSomething sollte durch Foo.DoSomething(Bar) aufgerufen werden?

Im ersten Ansatz war ich geneigt zu sagen, dass die nicht-generische Variante, also function DoSomething(SomeObject: TValue): string; aufgrufen werden sollte, da ja schliesslich kein Typ-Parameter angegeben ist und daher die erste Variante die am ehesten passende ist.

Tatsächlich wird aber die generische, zweite Variante aufgerufen. Ich hatte zunächst „TValue“ im Verdacht, hier die Overload-Auflösung zu „blockieren“, da TValue ja quasi ein „künstlicher“ RTTI-.getriebener Typ ist.

Stefan Glienke hatte aber letztlich den passenden Hinweis:

Generische Parameter sind tatsächlich optional und der Typ wird durch den Typ der Variablen, die übergeben wird, automatisch abgeleitet. Diese „Type-Inferrence“ hat Vorrang vor dem Auflösen von Overloads und erzeugt damit einen besseren Match als die Methode mit „TValue“.

Die Typableitung bei generischen Methoden ist übrigens hier dokumentiert.

Der folgende Code ruft also tatsächlich eine generische Implementation auf, obwohl kein Typ-Parameter im Aufruf angegeben ist:

function DoSomething<T>(SomeObject: T): string;
//...
Foo.DoSomething(Bar); //<T> is inferred from "Bar"

Hier ein Gist mit komplettem Code zum Ausprobieren:

https://gist.github.com/omonien/24b9b4ba64d46bdfa478615e8e9b0ae6

Embarcadero sponsert Open Source Projekte

Mit dem in Kürze erscheinenden RAD Studio 10.4 Sydney, wird Embarcadero ein Sponosringprogramm für Open Source Bibliotheken auflegen.

Im wesentlichen gibt es zwei Grund-Voraussetzungen:

  • Das Projekt muss auf Github publiziert werden
  • Das Projekt muss in Delphi oder C++Builder Code vorliegen und mit 10.4 funktionieren

Das Sponsoring beschränkt sich ausdrücklich nicht nur auf „warme Worte“ sondern es wird auch eine finanzielle Förderung zugesagt. Ich gehe davon aus, dass man davon nicht reich werden wird, aber es wird ausdrücklich nach einem Entwicklungsplan und den damit verbundenen Kosten gefragt.

Im folgenden Google Dokuemtn finden sich alle Details:

https://docs.google.com/document/d/e/2PACX-1vRSZwkszUzgFeEFyZXS2Q6N88XDz6JpdiJxxLXktRGUTWzHcR6zyRRXprAH-dqSl91gW-HfeaxUWtGc/pub

MVP des Jahres 2019 – DACH Region – Das Ergebnis

Wir haben alle Stimmen der, in der vergangenen Woche durchgeführten, Abstimmung zum MVP des Jahres 2019 für die deutschsprachige Region ausgezählt und der Gewinner steht nun fest:

MVP Emblem

Uwe Raabe

Nach dem klar war, dass Uwe die Abstimmung gewonnen hatte, ist er sozusagen vom Wahl-Komitee zurückgetreten, so dass mir nun die Aufgabe bleibt, Uwe zu würdigen.

Zunächst einmal möchte ich erwähnen, dass Uwe mit 32% der Stimmen deutlich vor dem Zweitplatzierten lag, der 21% der Stimmen erzielen konnte.

Uwes Wahl ist sicherlich ein Resultat seines unermüdlichen Einsatzes, um der Delphi-Community seine beiden wichtigsten Tools, MMX Code Explorer und Project Magician kostenlos zur Verfügung stellen zu können. Beide Tools gehören sozusagen zum Standard-Werkzeugkasten eines jeden Delphi Entwicklers.

Daneben ist Uwe auch regelmäßig in Webinaren, insbesondere bei der Coderage anzutreffen.

Ich habe Jim McKeeth nun Uwe als unseren Kandidaten für den weltweiten MVP des Jahres 2019 vorgeschlagen.

Also: Daumen drücken 🙂

Embarcadero MVP des Jahres 2019 – DACH Region

Uwe Raabe und ich sind die MVP Koordinatoren der DACH Region und haben u.a. die Aufgabe, einen MVP des Jahres auszuwählen.

Da wir dies nicht irgendwie ausklüngeln wollen, haben wir uns entschlossen, der Delphi Community die demokratische Möglichkeit zu geben, den MVP des Jahres zu wählen.

Auf dieser Seite könnt ihr ab sofort, bis zum kommenden Freitag, den 13. Dezember 2019, eure Stimme für den MVP abgeben, der euch im – schon fast vergangenen – Jahre 2019 am meisten beeindruckt hat, dessen Blogs ihr am informativsten fandet oder von dem ihr einfach denkt, er soll Titel für dieses Jahr erhalten.

Was gewinnt der MVP des Jahres? Ganz viel Ruhm – mit „h“ 🙂

Jim McKeeth, sozusagen der MVP Oberaufseher, wird entsprechende Posts verfassen und den Gewinner damit entsprechend würdigen. Flugreisen, Fernseher oder Millionen von Dollar zu spendieren, davon konnten wir Jim leider nicht überzeugen …

Die Abstimmung erfolgt anonym. Jeder, der sich der Embarcadero Community zugehörig fühlt, hat eine Stimme. MVPs können selbstverständlich mit abstimmen und dürfen sich natürlich auch selbst wählen.

Uwe und ich sind auch wählbar – auch wenn wir uns hier eher als Organisatoren sehen.

Das Ergebnis werden wir nach Ablauf der Abstimmung hier veröffentlichen. Wir werden nur den Sieger benennen, also kein Ranking erstellen.

Update: die Abstimmung ist inzwischen beendet. Das Ergebnis findet sich hier.

Handling JSON NULL values in Delphi

There is a quite frequent question about how to correctly handle NULL values in Delphi using System.Json.TJSONObject.

Handling existing values, in this example, the array of „customers“ is fairly easy:

{"customers":[{"name":"Olaf"},{"name":"Big Bird"}]}

But what, if the array is „null“?

{"customers":null}

Workaround: TActionManager broken in Delphi 10.3.3

UPDATE 2019-12-16: Official patch available.

Unfortunately, the long-awaited Delphi 10.3.3 release also brought a few new issues. One of them is that TActionManager is broken in a way, that prevents projects, using it, from compiling.

Because of some scope issue, the IDE keeps adding a unit named „IDETheme.ActnCtrls.pas“ to any form unit, that contains a TActionManager, once you save that form unit. „IDETheme.ActnCtrls“ is invalid, does not exist, thus the whole project will not compile anymore.

Fortunately, until EMBT releases a hotfix, there is a relatively easy workaround:

  • Add „VCL.ActnCtrls“ to any affected form unit
  • Create and add a completely empty unit to your project and name that unit „IDETheme.ActnCtrls.pas“
  • Compile

From REST to Database

There are frequently questions about how to get the results of a REST query (JSON) into a database table. This can of course be done manually, by using the „while not EOF do“ approach, but there are actually components in Delphi that make this job relatively easy and flexible.

So I created a video, demonstrating how to take the JSON response of a REST request and insert it into a database table.

I am using TFDMemTable, TFDQuery, and TFDBatchmove to move the data from the original TRESTResponse into an SQLite table – just by using FireDAC components.

Source code is available on BitBucket.

Publishing Delphi Apps to the Microsoft Store

In this video, I will guide you through the steps to get your Delphi app published in Microsoft’s App Store. For this demonstration, I will use a Firemonkey app, but technically the same thing would work with VCL apps as well.

This is the appx that I published and got certified by Microsoft. It’s a simple Hash calculator. Nothing too fancy, but useful enough to successfully pass Microsoft’s verification procedures: Microsoft Store – HashExpert

4. Deutsche Coderage 26.06.2019 – TMessage vs. MessageDlg

Am 26.06.2019 fand eine weitere Ausgabe der Deutschen CodeRage als Online-Konferenz statt.

Mein Beitrag, der um 17:00 MESZ zu sehen war, behandelt das das Thema TMessage und TMessageDlg: Wie triggert man aus Businesslogik Benutzerabfragen ohne sich an die UI zu koppeln?

TMessage vs MessageDlg

Weiterhin gibt es noch zahlreiche interessante Beiträge meiner Kollegen Matthias Eißing, Dr. Holger Flick, Volker Hillmann, Frank Lauter, Olaf Monien, Uwe Raabe, Bernd Ua und Daniel Wolf.

Die Anmeldung, der Zeitplan und weitere Informationen finden sich auf der CodeRage Seite.

Hier der gezeigte Quelltext, erweitert noch um eine TMessage, die ein einfaches ShowMessage anfordern kann.
Das Video ist auf meinem Youtube-Kanal zu finden.

Wir benutzen Cookies um die Nutzerfreundlichkeit der Webseite zu verbessen. Durch Deinen Besuch stimmst Du dem zu.