Konvertieren von Delphi-Code

September 7, 2018 - Lesezeit: 13 Minuten
von Juha Manninen und Howard Page-Clark
Dieser Artikel stammt aus https://www.blaisepascalmagazine.eu/

Die Notwendigkeit der Konvertierung

Die Delphi-Kompatibilität war für Lazarus von Anfang an ein wichtiges Ziel. Viele Leute, die FPC / Lazarus verwenden, arbeiten auch mit Delphi oder sind Ex-Delphi-Benutzer.

Lazarus war jedoch von Anfang an plattformübergreifend, und Delphi war jahrzehntelang Windows-only (wenn man das schnell aufgegebene Kylix-Experiment außer Acht lässt); und obwohl Delphi jetzt auf mehrere Nicht-Windows-Plattformen kompiliert, bleibt es eine reine Windows-IDE.

Während FPC und Lazarus versuchen, so Delphi-kompatibel wie möglich zu sein, sind weder die entsprechenden Compiler noch die IDEs, die Object Pascal-Dialekte oder die Standard-Laufzeitbibliotheken der beiden Entwicklungs-Apps identisch. Folglich ist es nicht möglich, ein Delphi-Projekt in Lazarus einfach zu öffnen und zu erwarten, dass es kompiliert und ausgeführt wird ...

Auf der Ebene der Quellendatei entspricht die .lpr eines Projekts konzeptionell einer .dpr-Datei, und eine .lfm-Datei entspricht einer .dfm-Datei, und .pas-Dateien können identisch sein. Die Lazarus .lpi-Datei hat jedoch keine genaue Entsprechung in Delphi, und .lpk- und .dpk-Dateien sind vollständig inkompatibel. In Lazarus werden die Einstellungen eines Projekts in der .lpi und der Session-Datei (.lps) des Projekts gespeichert. während in Delphi verschiedene Projektdateien wie .dproj und .groupproj verwendet werden und die Anzahl und Namen der Projektunterstützungsdateien sehr abhängig von der Delphi-Version ist.

Wenn Delphi-Code jetzt unter Lazarus ausgeführt werden muss, gibt es drei typische Situationen:

  • Sie möchten in Delphi und Lazarus dieselbe Codebasis beibehalten. Dies ist mit gewissen Einschränkungen und mit vernünftiger Verwendung von {$ IFDEF ...} durchaus möglich. Die Lazarus Delphi-Konvertierungs-Engine kann hilfreich sein, wenn Sie mit Delphi-Code beginnen, den Sie mithilfe von FPC kompilieren möchten, anstatt von vorne anzufangen. Der IDE Converter wurde nicht hauptsächlich für dieses Szenario entwickelt, bietet jedoch die Option "Use the same DFM form file" und die Option "Support Delphi" im Abschnitt "Target" des Dialogfelds "Convert", die in Richtung dieses Ziels führt (siehe Abschnitt Konvertierungsoptionen) unten).
  • Sie möchten ein älteres Delphi Windows VCL-Projekt konvertieren, damit Sie es mit Lazarus verwalten können. Das Projekt wird weiterhin nur Windows sein.

  • Sie möchten ein zu wartendes Delphi-Projekt in eine vollständig plattformübergreifendes Lazarus-Projekt konvertieren.

Der Konverter, der von der Lazarus IDE bereitgestellt wird, wurde hauptsächlich entwickelt, um bei den letzten beiden Fällen bei der Konvertierung zu helfen. Das erleichtert den Konvertierungsprozess erheblich, weil viele immer wieder anfallende Schritte automatisch durchgeführt werden und oft dann nur noch kleinere Probleme übrig bleiben, die sich von Hand lösen lassen. Da der Konverter nur für die Delphi zu Lazarus-Richtung entworfen wurde, ist er im ersten Szenario, das oben beschrieben wurde, weniger hilfreich, weil es ein gewisses Maß an Lazarus und Delphi Know How erfordert.

Probleme und Einschränkungen bei der Konvertierung

Der Lazarus Delphi Converter ist nicht dafür ausgelegt, jeden möglichen Delphi-Code, den Sie damit öffnen, komplett umzusetzen. Es ist am hilfreichsten beim Konvertieren von Code, der Komponenten von Drittanbietern vermeidet und nur Standard-VCL-Komponenten verwendet, aber Ihnen bei allen Konvertierungsanforderungen hilft. Wie viel manuelle Konvertierungsarbeiten nach der automatischen Konvertierung noch ausgeführt werden müssen, hängt von folgenden Problemen ab, die weitere Codeanpassungen erfordern, bevor FPC / Lazarus die konvertierten Dateien erfolgreich kompilieren und ausführen kann. Einige der folgenden Probleme können eine erfolgreiche vollständig plattformübergreifende Konvertierung ausschließen:

  • das Vorhandensein von Windows-spezifischen Funktionen: Windows-API-Aufrufe, OLE- oder COM-Automatisierung
  • das Vorhandensein von i386 Assemblercode (oder anderer Low Level Code)

  • Abhängigkeit von Komponenten von Drittanbietern wie spezialisierte Raster- oder datensensitive Kontrollen

  • Verwendung von Delphi-Sprachfunktionen, die derzeit nicht von FPC unterstützt werden, z. B. anonyme Methoden oder Verwendung von Nicht-ASCII-Variablennamen

  • Abhängigkeit von Delphi-spezifischen Funktionen wie FireMonkey oder DataSnap

  • Benutzerdefiniertes Zeichnen, das außerhalb der Betriebssystemroutinen implementiert wurde

  • API-Unterschiede zwischen Bibliotheken, die sowohl in Delphi als auch in Lazarus verwendet werden, wie sie üblicherweise zum Lesen und Schreiben von XML- oder Bilddateien verwendet werden.

Der Lazarus Delphi Konverter

Der Lazarus Delphi-Konverter kann ein ganzes Projekt oder Paket oder nur eine einzelne Unit oder .dfm-Datei konvertieren. Sie greifen darauf über das Menü Tools - Delphi-Conversion zu, das vier Untermenüoptionen bietet:

  • Delphi-Unit in Lazarus-Unit umwandeln ...
  • Delphi-Projekt in Lazarus-Projekt konvertieren ...

  • Delphi-Paket in Lazarus-Paket konvertieren ...

  • Binäre DFM in Text LFM konvertieren + Syntax prüfen …

Sie wählen einfach die für Ihren Zweck geeignete Option aus. Die letzte Option wird selten benötigt, da beim Konvertieren einer Unit die .dfm-Formulardatei immer automatisch konvertiert wird. Der Delphi-Konverter hilft dabei, die spezifische Delphi-Unit / das Projekt / Paket / DFM zu findenund kann mit einem Einstellungsdialog, in dem Sie verschiedene Optionen angeben, die den automatisierten Konvertierungsprozess steuern (siehe Abbildung 1). Für einfache Delphi VCL-Projekte können Sie möglicherweise alle Standardeinstellungen übernehmen und einfach Start Conversion drücken, um ein FPC-kompilierbares Lazarus-Projekt zu erstellen.

 

Bildbeschreibung

 

Wenn Sie den Konvertierungsvorgang starten, werden Ihre aktuellen Dialogoptionen in der Datei delphiconverter.xml in Ihrem lokalen Lazarus-Konfigurationsverzeichnis gespeichert. Das Feld Pfad des Dialogfelds (schreibgeschützt) zeigt den Pfad der Unit / project / package / .dfm an, die Sie für die Konvertierung ausgewählt haben.

Konvertierungsoptionen

Der Konvertierungsdialog bietet zwei Optionen zum Anpassen der Details des Konvertierungsprozesses. Auf der linken Seite befinden sich sieben Checkboxen, die bestimmte Konvertierungsfunktionen aktivieren oder deaktivieren. Auf der rechten Seite befinden sich fünf Kombinationsfelder, die automatische Konvertierungsfunktionen aktivieren oder deaktivieren. In einigen Fällen können Sie mit dem Konvertierungsprozess interagieren, anstatt ihn vollständig automatisch ausführen zu lassen. Neben den Dropdown-Kombinationsfeldern befindet sich eine Edit-Schaltfläche, die einen weiteren Dialog öffnet, in dem Sie verschiedene Besonderheiten der jeweiligen Konvertierungsroutine konfigurieren können.

Checkbox Optionen

  • Ziel

    • Cross-Plattform : Plattformübergreifend (Checkbox Standard: aktiv)

      Bei
      Aktiv ersetzt diese Option Windows-spezifische Units (Windows, WinProcs, WinTypes) durch ihre plattformübergreifenden Entsprechungen (LCLIntf, LCLType, LMessages). Dies macht den LCL-Port von wesentlichen Teilen der WinAPI verfügbar.

    • Support Delphi : Delphi unterstützen (Checkbox Standard: inaktiv)

      Wenn diese Option
      inaktiv ist, werden die ursprünglichen .DFMs gelöscht und nur neu konvertierte .LFMs verwendet. Wenn diese Option aktiv ist, dann werden neue .LFMs generiert werden und die ursprünglichen .DFMs beibehalten werden. Um Units mit beiden Arten von Formulardateien kompatibel zu machen, werden entsprechende {$ IFDEF ...} Anweisungen in die PAS-Datei jedes Formulars eingefügt.

    • Use the Same DFM file : Verwenden Sie die gleiche DFM-Datei (Checkbox Standard: inaktiv)

      Mit der Standardeinstellung
      inaktiv werden alle Delphi-.DFMs in .LFMs konvertiert. Wenn Support Delphi inaktiv ist, werden alle DFMs gelöscht. Wenn die Option aktiv ist, generiert diese Einstellung keine neuen .LFMs, sondern ermöglicht die Verwendung aller ursprünglichen Delphi-.DFM-Formulardateien mit Lazarus (alle binären .DFMs werden in textbasierte .DFMs konvertiert). Diese Option wird jedoch nur für sehr einfache GUI-Formulare empfohlen. Dies ist problematisch, da VCL- und LCL-Komponenten leicht unterschiedliche veröffentlichte Eigenschaften haben. Zukünftige Wartung wird von jeder IDE geplagt, die sich über unbekannte Eigenschaften beschwert und Eigenschaften hinzufügt, die der anderen IDE unbekannt sind.

  • Andere

    • Add defines simulating Delphi 7 : Definiere Schalter für das Simulieren von Delphi7 (Checkbox Standard: aktiv)

      Wenn
      diese Option aktiv ist, dann wird der folgende FPC-Compiler Anweisungen definiert, was dazu führt, dass einige Projekte besser funktionieren: -dBorland -dVer150 -dDelphi7 -dCompiler6_Up -dPUREPASCAL.

    • Make backup of changed files : Backup der geänderten Dateien erstellen (Checkbox Standard: aktiv)

      Bei
      aktiv speichert der Konverter zuerst alle ursprünglichen Delphi-Dateien in einem automatisch generierten ConverterBackup-Verzeichnis unter dem ausgewählten Verzeichnis. Dies ist zusätzlich zum üblichen Lazarus Backup-Unterverzeichnis, das auch für Lazarus-Dateien erstellt wird.

      Beachten Sie, dass dies nicht gut funktioniert, wenn der Code in vielen Schritten konvertiert wird. Der Konverter kann an teilweise konvertierten Lazarus-
      Units, Projekten und Paketen arbeiten, aber in diesem Fall wird das frühere ConverterBackup überschrieben. Es ist sicherer, manuell eine Sicherungskopie der ursprünglichen Delphi-Quellen zu erstellen, wenn die Konvertierung wahrscheinlich in mehreren Phasen abläuft.

    • Keep converted files open in editor : Konvertierte Dateien im Editor geöffnet lassen (Checkbox Standard: inaktiv)

      Wenn
      aktiv, dann bleiben alle konvertierten Unit-Dateien nach der Konvertierung geöffnet. Wenn inaktiv, dann bleibt nur die Hauptdatei des konvertierten Projekts (oder des Pakets) im Editor geöffnet.

    • Scan files in parent directory : Dateien im übergeordneten Verzeichnis prüfen (Checkbox Standard: aktiv)

      Einige Delphi-Projekte haben eine Verzeichnisstruktur, in der das Projektverzeichnis nicht die Wurzel der Struktur ist. Unit-Dateien können dann in Verzeichnissen
      auf gleicher Ebene zum Projektverzeichnis gefunden werden. Wenn diese Option aktiv ist, dann werden solche Verzeichnisse nach Quelldateien durchsucht, was in einem Hintergrundthread geschieht, so dass der Einstellungsdialog reaktiv bleibt und die eigentliche Konvertierung ungehindert abläuft, wenn die Schaltfläche Konvertierung starten gedrückt wird. Manchmal hat das übergeordnete Verzeichnis viel nicht verwandten Code und diese Option kann deaktiviert werden. Die Deaktivierung wird erst beim nächsten Start des Konverters wirksam.

Dropdown-Optionen

    • Unit Replacements : Units ersetzen (Dropdown-Optionen: Deaktiviert, Interaktiv, Automatisch)

      Sie können die
      Unit-Ersetzungen konfigurieren, die der Konverter ausführen soll, indem Sie auf die Schaltfläche „Edit“ klicken. Dies öffnet den Dialog "Units to replace", einen zweispaltigen Editor, der häufig auftretende Delphi-Units in der linken Spalte "Delphi-Name" auflistet und deren zugewiesene Ersatz-Unit rechts in der Spalte "New Name" aufgeführt ist. Wenn der Converter die uses-Klausel jeder Delphi-Unit analysiert, werden alle in diesem Dialog zu ersetzenden Units durch die jeweils aufgelistete Unit entweder entfernt oder ersetzt, wenn sie gefunden werden.

      Ein leerer neuer Name bedeutet, dass die verwendete
      Unit entfernt wird. Ein nicht leerer Eintrag bedeutet, dass Unit wird durch den / die neuen Unit-Namen ersetzt.

      Beispielsweise wird MMSystem standardmäßig entfernt, da der Eintrag Ne
      w Name leer ist, während Windows durch den Eintrag New Name ersetzt wird: LCLIntf, LCLType, Lmessages.

      Reguläre Ausdruckssyntax für Ersetzungen mit nummerierten Parametern ($ 1, $ 2 ...) wird unterstützt. Beispielsweise: * ^ Q (. +) In der Delphi-Namensspalte mit $ 1 in der Spalte "Ne
      w Name" bedeutet "entferne ein führendes Q vom Unit-Namen", wodurch "Q" von alten Kylix-Unit-Namen entfernt wird.

      In der Dropdown-Liste können Sie angeben, ob die
      Unit-Ersetzung deaktiviert, interaktiv oder automatisch ist. Wenn er interaktiv ist, kann der Benutzer die Ersetzungen bearbeiten, bevor sie angewendet werden. Wenn nach dem Austausch immer noch Units fehlen, fragt der Konverter, was Sie mit den fehlenden Units machen sollen. Sie haben die Wahl, den oder die problematischen Namen zu kommentieren, selbst nach ihnen zu suchen oder die Konvertierung in dem bisher erreichten Stadium aufzugeben und möglicherweise fehlende Units herunterzuladen, bevor Sie es erneut versuchen (siehe Abbildung 2).

Bildbeschreibung

    • Unknown properties : Unbekannte Eigenschaften (Dropdown-Optionen: Deaktiviert, Interaktiv, Automatisch)

      Einige veröffentlichte Delphi-Komponenten haben keine entsprechenden Eigenschaften in ihren LCL-
      Versionen. Obwohl Lazarus mit nicht vorhandenen Eigenschaften zurechtkommt, indem er sie als solche registriert und den Form-Loader so veranlasst, sie zu ignorieren, ist es besser, die nicht vorhandenen Eigenschaften zu entfernen. Sie können hier auswählen, ob der Konverter sie automatisch entfernt (Automatisch) oder ob der Benutzer interaktiv mit dem Entfernen oder Ersetzen umgehen wird. Der interaktive Dialog bietet die Möglichkeit, die fehlende Eigenschaft zu ersetzen, aber das ist selten möglich oder notwendig (siehe Abbildung 3).

Bildbeschreibung

    • Type replacements : Typen ersetzen (Dropdown-Optionen: Interaktiv, Automatisch)

      Einige Delphi-Komponenten und viele Komponenten von Drittanbietern verfügen über keine entsprechende LCL-Komponente mit demselben Namen. Der Konverter wird viele dieser fehlenden Klassen durch Fallback-LCL-Klassen ersetzen. Zum Beispiel: Delphis TTabbedNotebook kann durch das LCL TPageControl und Delphis TADOQuery mit FCLs TSQLQuery ersetzt werden.

      Um die Details zu konfigurieren, welche LCL / FCL-Klasse welche Delphi-Klasse ersetzt, klicken Sie auf die Schaltfläche
      Edit, um den zu ersetzenden Typ zu öffnen, der genau wie der zu ersetzende Dialog arbeitet. Jede aufgelistete Komponente wird sowohl in der Pascal-Quelldatei als auch in der Formulardatei (.lfm) ersetzt. Ersetzung funktioniert sogar für verschachtelte Komponentenstrukturen, bei denen eine zu ersetzende Komponente untergeordnete Komponenten hat, die ebenfalls ersetzt werden müssen. Wenn die Ersatzkomponente andere Eigenschaften als die ursprüngliche Delphi-Komponente hat, werden Sie nach der Konvertierung auf Probleme stoßen, für die es keine einfache, automatisierte Lösung gibt.

    • Function Replacements : Funktionen ersetzen: (Dropdown-Optionen: Deaktiviert, Aktiviert)

      Verschiedene Windows-Funktionsaufrufe i
      m Delphi-Quelltext müssen durch funktional ähnliche RTL- oder LCL-Bibliotheksfunktionsaufrufe ersetzt werden. In der Regel sind die im Dialog zu ersetzenden Funktionen / Prozeduren aufgeführten Standardersetzungen ausreichend. Wenn Sie auf die Schaltfläche Edit klicken, wird dieser Dialog geöffnet, wenn Sie die bereits aufgelisteten Ersetzungen ändern oder hinzufügen müssen.

      Die Funktionen sind kategorisiert, sodass Sie ganze Kategorien mit einem einzigen Klick aktivieren oder deaktivieren können.

      Die Syntax verwendet $ 1, $ 2 usw. für aufeinanderfolgende Parameter im Delphi-Funktionsaufruf, der gerade ersetzt wird. Daher wird die Delphi-Funktion SameStr durch (CompareStr ($ 1, $ 2) = 0) ersetzt.

      Eine einfache Bedingung


       if
      paramNo match regularExpression then option1; option2

      kann benutzt werden, um Varianten festzulegen

      ShellExecuteif $3 match ":/" then OpenURL($3); OpenDocument($3)

      Dadurch kann ShellExecute zwei verschiedenen LCL-Funktionen zuordnen. Die Zeichenfolge nach Übereinstimmung ist ein regulärer Ausdruck. Wenn es übereinstimmt, wird die erste Ersetzung verwendet, andernfalls wird die zweite Ersetzungsoption nach dem Semikolon verwendet. Da ": /" normalerweise in URLs gefunden wird, öffnet die erste Übereinstimmung eine URL, andernfalls wird ein lokales Dokument geöffnet.

      Add comment after replacement : Kommentar nach dem Ersetzen hinzufügen (Checkbox)

      Ein Kommentar wird nach jeder Ersetzung automatisch vom Konverter eingefügt, wenn dieses Checkbox aktiviert ist. Normalerweise ist es hilfreich, die in Ihren Quellen dokumentierten Ersetzungen zu sehen. Sie können dann schnell erkennen, wo der Code optimiert werden muss.

    • Coordinate offsets : Offsets koordinieren (Dropdown-Optionen: Deaktiviert, Aktiviert)

      Diese Option gilt insbesondere für TPanel, TGroupBox, TRadioGroup und TCheckGroup. In Delphi sind die Koordinaten der enthaltenen Steuerelemente relativ zu den Gruppenober- und -links. In Lazarus sind die Koordinaten der enthaltenen Steuerelemente relativ zum Client-Bereich ihrer Groupbox - was die Grenze ignoriert. Dies führt zu einem Problem für eine konvertierte TGroupBox, da am oberen Rand ein Titeltext vorhanden ist. Die meisten TPanel-Instanzen haben auch einen doppelten Schrägkantenrand. Die Koordinaten der enthaltenen Steuerelemente müssen daher durch einen Offset angepasst werden, um das gleiche Formularlayout wie in Delphi zu erhalten. Sollten Sie die Standardeinstellung ändern müssen,
      dann drücken Sie die Schaltfläche Edit, um einen Einstellungsdialog zu öffnen, in dem die erforderlichen Anpassungen definiert sind.

Globale Konvertierungsänderungen

Abhängig von den Optionen, die Sie im Hauptdialogfeld ausgewählt haben, werden die folgenden Änderungen auf konvertierte Pascal-Quell- und -Formdateien angewendet:

  • In jede Quelldatei wird eine Anweisung {$ Mode Delphi} eingefügt, so dass der Compiler in Delphi's Object Pascal-Dialekt eine Sprachsyntax erwartet. Wenn Sie die Funktionen des Dialekts {$ Mode objfpc} (oder eines anderen Modus) verwenden möchten, müssen Sie später die automatisch eingefügte Anweisung {$ Mode Delphi} ändern.

  • Dateinamen von Units in den uses-Klauseln und alle Include-Dateinamen (.inc) werden so geändert, dass sie den tatsächlichen Dateinamen entsprechen, wie sie in Groß- und Kleinschreibung verwendet werden.

  • Verschiedene Unit-Namen in uses-Klauseln werden ersetzt oder entfernt, und einige Delphi-Funktionsnamen und Komponentenklassennamen werden abhängig von den Einstellungen im Dialogfeld geändert.

  • Alle binären .DFM-Dateien werden zuerst in das ASCII-Textformat konvertiert. .DFM-Dateien werden durch .LFM-Dateien ersetzt oder entfernt, oder bedingte Kompilierungsdefinitionen werden entsprechend der ausgewählten Delphi-Einstellung im Dialogfeld "Konvertieren" hinzugefügt. Eigenschaften, die in Lazarus nicht bekannt sind, werden normalerweise entfernt, und die Top- und Left-Eigenschaften der enthaltenen Steuerelemente werden geändert (abhängig von den Einstellungen für Unbekannte Eigenschaften und Koordinatenoffsets im Dialogfeld Konvertieren).

Online-Informationen (möglicherweise aktueller als diese Dokumentation) finden Sie hier:

http://wiki.lazarus.freepascal.org/Delphi_Converter_in_Lazarus

Kategorien

    Schlagwörter