texttransformer.jpg

28.10.2004

Delphi2Cpp 2.5

Symbolnamen, die mit der Groß- und Kleinschreibung der Deklaration übereinstimmen

Bei der Konvertierung von Delphi nach C++ ist darauf zu achten, dass alle Bezeichner in eine einheitliche Groß- und Kleinschreibung überführt werden. Bisher wurde dies erreicht, indem alle Bezeichner, die sich nur in der Groß- und Kleinschreibung unterschieden, radikal auf eine einheitliche Schreibweise reduziert wurden. Mit Version 2.5.0 gibt es jedoch die Option, für alle Symbole die Schreibweise zu übernehmen, in der sie ursprünglich deklariert wurden. Diese Option ist nun standardmäßig aktiviert, während die alte Methode als veraltet gilt.

In der folgenden Unit werden z.B. eine Konstante, eine Eigenschaft und ein Parameter mit den Namen "name", "Name" und "NAME" verwendet.

unit casesensitivity;

interface

const
  name: string = 'DefaultName';

type
  TPerson = class
  private
    FName: string;
  public
    property Name: string read FName write FName;
    procedure DisplayInfo(NAME: string);
  end;

implementation

procedure TPerson.DisplayInfo(Name: string);
begin
  WriteLn('Parameter Name: ' + Name);
  WriteLn('Property Name: ' + Self.Name);
  WriteLn('Constant Name: ' + casesensitivity.Name);
end;

end.

Mit der veralteten "unify all cases" Option bekamen alle Symbole gleichgeschriebene Namen, wurde die DisplayInfo Prozedur zu:

void __fastcall TPerson::DisplayInfo(String name)
{
  WriteLn(String(L"Parameter Name: ") + name);
  WriteLn(String(L"Property Name: ") + this->name);
  WriteLn(String(L"Constant Name: ") + casesensitivity::name);
}

Mit der neuen Option werden in der Prozedur alle drei Symbolnamen innerhalb von DisplayInfo verwendet. Dies ist möglich, weil sie in verschiedenen Bereichen deklariert sind. Delphi2Cpp konvertiert die prozedur für den C++Builder in:

void __fastcall TPerson::DisplayInfo(String NAME)
{
  WriteLn(String(L"Parameter Name: ") + NAME);
  WriteLn(String(L"Property Name: ") + this->Name);
  WriteLn(String(L"Constant Name: ") + casesensitivity::name);
}

Für andere Kompiler wird die Prozedur zu:


void TPerson::DisplayInfo(String NAME)
{
  WriteLn(String(L"Parameter Name: ") + NAME);
  WriteLn(String(L"Property Name: ") + this->ReadPropertyName());
  WriteLn(String(L"Constant Name: ") + casesensitivity::name);
}

Mit der Option zum Abgleichen mit den Deklarationsnamen werden Probleme vermieden, die auftreten, wenn verschiedene Teile des Codes mit unterschiedlichen Bezeichnerlisten übersetzt werden.


Die C++Builder Version der Synedit-Komponenten:

https://github.com/dm-e/SynEditCb

wurden mit der Option der an die Deklaration angepassten Symbolnamen neu übersetzt.


26.08.2024

Delphi2Cpp 2.4

Das aktuelle Update Delphi2Cpp 2.4.0 ist vor allem den Neuerungen in dem kürzlich erschienenen RAD Studio 12.1 gewidmet, es enthält aber auch viele andere, teils fundamentale, Verbesserungen. Im RAD Studio 12.1 gibt es wieder einen brauchbaren C++Builder mit einem neuen modernen Clang Compiler. Neu in Delphi 12.1 ist auch die Unterstützung von mehrzeiligen Strings: Wie Delphi2Cpp 2.4. sie nach C++ konvertiert, zeigt das Multiline-Beispiel.

Mit Delphi2Cpp 2.4. wurden die bereits zuvor übersetzten Dateien der RTL auf den aktuellen Stand gebracht. Außerdem wurden weitere Verbesserungen an dem übersetzten Code vorgenommen

1. Code in dem der plattformübergreifende Botschafts-Manager "TMessageManager" verwendet wird, wird nun fehlerfrei übersetzt.

2. Code der die atomaren Funktionenenverwendet, bedarf nun keiner manuellen Nachbearbeitung mehr. Das betrifft:

AtomicDecrement
AtomicIncrement
AtomicExchange
AtomicCmpExchange

3. Die Übersetzung von System.System.SyncObjs.pas wurde überarbeitet und für Windows unter Verwendung von CRITICAL_SECTION vervollständigt.

4. es gibt jetzt die zusätzliche Option, den übersetzten Code für den modernen C++Builder-Compiler zu optimieren.

5. Es gibt nun eine zusätzliche Version der für den C++Builder übersetzten Synedit-Komponenten für den modernen Compiler mit 64 bit. Auch die bisherigen Versionen wurden teilweise aktualisisert.

https://github.com/dm-e/SynEditCb

Verbesserte Algoritmen

die Methode nach der die zuvor gefundenen Typen, Variablen etc. bei der Erzeugung der Ausgabe nachgeschlagen werden, wurde grundlegend verbessert. Bisher wurde eine Art "brute force" Methode verwendet, die bisweilen in falschen Alternativen endete. Der neue Algorithmus ist wesentlich intelligenter. Dadurch ist diese Methode nicht nur exakter geworden, sie arbeitet nun auch ca. 25 % schneller (SynEdit example vorher 4:00 min, nun 2:55 min). Auch Redeklarationen von Bezeichnern werden nun anders behandelt als zuvor. Für andere Compiler als den C++Builder werden jetzt Redeklarationen wie z.B. die folgende unterdrückt (bzw. als Kommentar ausgegeben):

dupIgnore = System.Types.TDuplicates.dupIgnore;

Wenn nötig wird nun durch entsprechende Qualifizierung jeweils auf den originalen Typ verwiesen. Im Unterschied zu Delphi ist dies in C++ immer möglich.

Beide Verbesserungen zusammengenommen führen zu einer exakteren Qualifizierung der Bezeichner und führt so letztlich auch zu einer verbeserten Desambiguierung.


Kopierkommentare

wenn das Feature zu automatischen Einfügug von vorbereitetem C++-Code verwendet wird, so wird der entsprechendeAusgabe Code nun durch zwei Kommentarzeichen gekennzeichnet:

//# copied begin
... prepared code
// copied end

Z.B.:

(*#_#include "math.h"_#*)
->
//# copied begin
#include "math.h"
//# copied end


out-Parameter

bisher hat Delphi2Cpp var-Parameter und out-Parameter uterschiedslos behandelt, da es in C++ kein echtes Equivalent zur out-Parametern gibt. Nun wird durch Initialisierung der übergebene out-Parameter zumindest dem Umstand Rechnung getragen, das out-Parameter ihre möglicherweise enthaltenen Werte bei der Übergabe an die Funktion verlieren. Damit wird im übersetzten Code zugleich sichtbar, dass es sich hier nicht um einfache Referenz.Parameter handelt.

Beispiel:

function TryParse(const S: string; out Value: Cardinal): Boolean;
var
  E: Integer;
...
->
bool __fastcall TryParse(const String S, unsigned int& Value)
{
  Value = 0; //# clear out parameter
  bool result = false;
  int E = 0;
...

Zusätzliche Tools

1. ExtractIdentifiers ist ei Werkzeug mit dem man Bezeichnerlisten nun auch außerhlb der Delphi2Cpp IDE erstellen und korrigieren kann.

Amerkung: auch beim Erstellen dieser Listen innerhalb der IDE gibt es nun die Änderug, dass Zahlen in diese Liste nicht mehr eingefügt werden.

2. ExtractReworked ist ein Werkzeug mit dem man die Übernahme von geänderten Übersetzungsergebnissen vereinfachen kann.




19.10.2023
Delphi2Cpp 2.3
Konvertierung von DFM-Dateien nach C++

- Der Code von DFM-Dateien kann nun optional in C++-Code konvertiert werden, der zur Laufzeit beim Erstellen des Formulars oder eines Frames ausgeführt wird. Im Wesentlichen besteht der DFM-Code aus einer Reihe einfacher Zuweisungen von Werten zu Komponenteneigenschaften. Delphi2Cpp gelingt es auch, andere, teilweise komplexe Serialisierungsaktionen auf intuitive und einfache Weise abzubilden. Hierzu werden spezielle Routinen aufgerufen, die den Eigenschaften die Werte nicht direkt zuweisen, sondern diese als Argumente an die Routinen übergeben, in denen dann weitere Aktionen ausgeführt werden können. Speziell für Komponenten von Drittanbietern kann Delphi2Cpp so konfiguriert werden, dass es solche benutzerdefinierten Funktionen aufruft.
Durch die Übersetzung des DFM Codes lassen sich im C++Builder GUI-Anwendungen bauen, die gänzlich ohne DFM Dateien auskommen. Bei anderen Compilern bildet die Konvertierung des DFM-Codes die unerlässliche Brücke zur Verwendung von C++ GUI Bibliotheken.

Mehr Details zur Konvertierung von DFM-Dateien
31.01.2023
Delphi2Cpp 2.2

Übernahme von Änderungen an Delphi2C# zur erleichterten Übersetzung unvollständigen Codes

  • Rekursive Suche benötitgter Units bei der Übersetzung
  • Optionale Erzeugung von Dummy-Code
  • Ausschluß bestimmer Dateien von der Übersetzung
  • Verwendung einer "Cover"-Datei für unbekannte Typen
  • Bezeichner können durch komplexe Ausdrücke ersetzt werden

02.07.2022
Delphi2Cpp 2.1
  • Inline-Variablen und -Konstanten von Delphi werden zu lokalen C++-Variablen und -Konstanten
  • Große Bereiche in case-Anweisungen werden jetzt in den default-Abschnitt einer switch-Anweisung verschoben
  • Überprüfung der Loop-Variablentypen, um Endlosschleifen zu verhindern
  • Es gibt eine neue Option zum Normalisieren der Namensbereichsnamen, wie es C++Builder tut
  • Vereinfachte Manipulation der Initialisierungs-/Finalisierungsreihenfolge von Units
  • Für C++Builder gibt es die neue Hilfsfunktion DynamicArrayPointer um dynamische Arrays zu übergeben
  • Initialisierungs, Finalisierungs und Assign-Operatoren in Records werden geparst und ausgegeben, aber nicht automatisch in C++ aufgerufen
  • Der Typ "Comp", der nur aus Gründen der Abwärtskompatibilität existiert, wurde entfernt, um Verwechslungen mit häufig verwendeten Variablen dieses Namens zu vermeiden
  • Der mit Delphi2Cpp nach C++ übersetzt Code steht ist jetzt aktualisiert auf GitHub gehosted
  • Das Video des deutschen Vortrags der CodeRage 2021 wurde jetzt in drei leicht erweiterten Teilen auf Englisch nach YouTube hochgeladen

06.08.2021
DelphiXE2Cpp11 ist jetzt Delphi2Cpp 2.0

Für C++98 werden nun die inneren Funktionen aus verschachtelte Funktionen herausextrahiert, so dass sie zu Klassenfunktionen oder normalen freien Funktionen werden. Parameter und Variablen der äußeren Funktion werden an die extrahierten Funktionen übergeben. Über dieses Feature hatte bereits Delphi2Cpp 1 verfügt, es fehlte bisher aber in Delphi2Cpp 2.x. Mit diesem Feature kann Delphi2Cpp 2.x als legitimer Nachfolger von Delphi2Cpp 1 angesehen werden und wird damit zu Delphi2Cpp 2.0.


31.03.2021

Für rekursiv aufgerufene verschachtelte Funktionen generiert Delphi2Cpp 2.x nun in C++ explizite Vorwärtsdeklarationen anstelle der fehlerverursachenden auto-Routinen. Z.B.:


  function nested : boolean;

    function nested_reflexive(depth :Integer) : boolean;
    begin
      if depth = 2 then
        result := true
       else
        result := nested_reflexive(depth + 1);
    end;

  begin
    result := nested_reflexive(0);
  end;

->

function<bool (int)> nested_reflexive;

bool __fastcall nested()
{
  bool result = false;

  nested_reflexive = [&](int depth) -> bool 
  {
    bool result = false;
    if(depth == 2)
      result = true;
    else
      result = nested_reflexive(depth + 1);
    return result;
  };
  result = nested_reflexive(0);
  return result;
}

Zusätzliche RTL-Dateien wurden übersetzt:

System.ZLib
System.ZLibConst
System.Win.Registry


05.08.2020
Verbesserte Löung für die C++ Nachbildung der modulweiten Sichtbarkeit von Klassenmembern in Delphi.

Die aktualisierte Dokumentation enthält bereits Informationen zum geplanten Programm Delphi2CB. Delphi2CB wird ein kostengünstiges Extrakt aus Delphi2Cpp 2.x für Benutzer des C++Builders sein.


23.06.2020
Angebot des Delphi2Cpp 2.x Übersetzungsservice: kostenlose Übersetzung von 1000 Zeilen ihres Codes


02.04.2020
Dokumentation aktualisiert, beta-Angebot beendet


15.11.2019
Klassenreferenzen

Für andere Compiler als den C++Builder unterstützt Delphi2Cpp 2.x nu ein neues Muster zur Erzeugung von Klassenreferenzen, dass sehr viel eleganter ist als das des alten Delphi2Cpp. Es gibt nun eine Funktion:

template <class Class> TClass class_id()

die Instanzen von Klassenreferenzen in ähnlicher Weise liefert, wie die __classid Funktion des C++Builders. Klasseninnstanzen können durch Aufruf virtueller Konstruktorfunktionen aus solchen Klassenreferenzen erzeugt werden.


16.10.2019
Delphi2Cpp 2.x beta-Angebot



30.01.2012 Version 1.6.3

Klassenelemente werden nun automatisch in den Initialisierungslisten der Konstruktoren mit Default-Werten inititialisiert, wenn es keine expliziten Initialisierungen im Körper des Konstruktors gibt. Gibt es solche expliziten Initialisierungen, so werden sie in die Initialisierungsliste verschoben. Diese Verschiebung geschieht nicht, wenn die Initialisierung von einer Bedingung abhängt. Beispiel:

constructor Base.Create(arg : Integer);    __fastcall Base::Base( int arg )
begin                                       : FI(arg),                     
  FList := TList.Create;                      FList(new TList),            
  FI := arg;                                  FTimeOut(0)                  
  if arg <> $00 then                       {                               
    FTimeOut := arg                          if ( arg != 0x00 )            
  else                                         FTimeOut = arg;             
   FTimeOut := DefaultTimeout;               else                          
end;                                           FTimeOut = DefaultTimeout;
                                           }                  
  • Die Namen von ursprünglich verwendeten Konstruktoren werden jetzt als Kommentare in den übersetzten Code eingeführt, wenn die "Verbose" Option aktiviert ist und der Name nicht "Create" lautet. Dies macht es leicht, manuell Korrekturen vorzunehmen, wenn es unterschiedlich benannte Delphi Konstruktoren mit gleichen Signaturen gibt.
  • Die Berechnung der Liste der Konstruktoren der Basisklassen, auf die auch in der abgeleiteten Klasse zugegriffen werden kann, wurde verbessert. Zuvor wurden fälschlich auch namensgleich überschriebene Konstruktoren der Liste hinzugefügt. Dies geschieht nur noch in dem Fall, dass die zusätzliche Erzeugung eines Standardkonstruktors notwendig ist, um die erweiterten RTTI-Fähigkeiten bei Verwendung des TD2CObjects oder des DECLARE_DYNAMIC and IMPLEMENT_DYNAMIC Makros zu nutzen.
  • Die Makros "DECLARE_DYNAMIC" und "IMPLEMENT_DYNAMIC" können nun über die Ersetzungstabelle des Übersetzers umbenannt werde. Eine naheliegende Alternative wäre z.B. die ebenfalls in den Microsoft Foundation Classes (MFC) definierten Makros "DECLARE_DYNCREATE" und "IMPLEMENT_DYNCREATE" zu verwenden.
  • Die Anpassung der Variablenübergabe an Windows API-Funktionen wurde verbessert. Falls eine Funktion als EXTERNALSYM deklariert ist, verwendet der Übersetzer sie nur dann, wenn es keine alternative Deklaration gibt. Ein Beispiel für den ersten Fall wäre "PeekMessage" und ein Beispiel für den zweiten Fall wäre "PtInRect". Alle Dateien aus dem Verzeichnis "CodeGear\RAD Studio\6.0\source\Win32\rtl\win" werden jetzt als C-ähnlich interpretiert.


05.01.2012 Version 1.6.2
  • Es gibt nun eine vereinfachte Behandlung von Resource-Strings in Delphi2Cpp. In C++ ist die Verwendung von Resource-Strings nicht so einfach wie in Delphi. In C++ müssen zunächst Resource-Dateien mit Stringlisten angelegt werden, aus denen die Strings dann zur Laufzeit geladen werden können. Delphi2Cpp bietet nun eine Notlösung, die übersetzte Programme meist auch ohne Resource-Datei zum Laufen bringt und die auf einfache Weise zur echten Verwendung von Resource-Dateien erweitert werden kann.
  • Parameterlisten werden für verschachtelte Funktionen nun auch korrekt ermittelt, wenn dort forward-Deklarationen benötigt werden.
  • Die Unterstützung für UnicodeStrings wurde verbessert. UnicodeStrings werden im Quellcode nun korrekt behandelt, obwohl Delphi2Cpp im wesentlichen auf den Sprachstandard von Delphi 7 beschränkt ist. Ausßerdem hat die bisher in den Optionen nur formale Unterscheidung zwischen WideString und UnicodeString nun reale Auswirkungen auf das Übersetzungsergebnis. Z.B wird für UnicodeStrings nun nicht mehr die c_bstr-Methode aufgerufen.
  • Referenz-Variablen für Strukturen, die temporär als Ergebnis von with-Ausdrücken eingefügt werden, werden nun durch "const" modifiziert, wenn auf sie nur lesend zugegriffen wird. Dadurch werden gelegentliche Fehlermeldungen des Compilers vermieden, dass ein L-Wert desentsprechenden Typs erforderlich sei.
  • Da im C++Builder Typen von Basisklassen, Eigenschaften, und Felder mit "published" Sichtbarkeit nicht durch Namensräume qualifiziert sein dürfen, werden in entsprechenden Fällen nun using-Klauseln am Anfang der Headerdateien geschrieben.
  • Für dieses Update wurden große Mengen an Delphi Quellcode probeweise übersetzt. Viele weitere Detailverbesserungen wurden aus diesen Experimenten abgeleitet.


31.10.2011 Version 1.6.0
  • Die Bedienungsoberfläche basiert nun auf Unicode, so dass auch Sonderzeichen fremdsprachiger Kommentare UTF8 codierter Delphi-Dateien korrekt angezeigt werden. Zugleich wurden weitere Unschönheiten der Bedienungsobefläche beseitigt. So kann jetzt z.B. auch auf der Log-Seite nach Ausdrücken im Log-Baum gesucht werden. Bei der Übersetzung von Dateien drängt sich Delphi2Cpp nicht mehr in den Vordergrund, so dass nebenher auf dem gleichen Computer andere Arbeiten erledigt werden können.
  • Es gibt noch einige andere kleine Verbesserungen : beim Kopieren von Kommentaren können nun keine gemischten Zeilenenden aus einfachen "line feed"-Zeichen und aus Kombination mit dem "carriage return"-Zeichen entstehen. Kommentare nach Variablendeklarationen werden nicht mehr vor deren Initialisierung eingefügt und einiges mehr.

10.10.2011 Version 1.5.2

  • Das Ergebnis der Entflechtung verschachtelter Funktionen wurde optimiert. Bisher wurden sämtliche Parameter, Variablen und Konstanten der übergeordneten Funktion an die untergeordneten Funktionen weitergereicht. Nun geschieht diese nur noch für die tatsächlich benötigten Größen. Dabei wird berücksichtigt, dass bei mehrfacher Verschachtelung eventuelle Parameter durch ein Funktion hindurchgereicht werden, die zwar nicht in ihr selbst, aber in einer ihr untergeordneten Funktion benötigt werden. Die "result"-Variable für den Rückgabewert der obersten Funktion, wird unter dem Namen "xResult" an untergeordnete Funktionen übergeben, und ist somit von den dortigen "result"-Variablen unterschieden.
  • Dateien die mit einer UTF8 "Byte Order Mark" (BOM) beginnen, werden jetzt in ANSI umgewandelt, bevor sie verarbeitet werden. (Alle Dateien werden als ANSI Dateien gespeichert.)


26.09.2011 Version 1.5.1

  • System Unit und Sysutils Unit sind nun auch für Linux vorübersetzt.
  • Bei der Übersetzung von for-Schleifen wird nun die Anzahl der Durchläufe nur einmal vor Beginn des ersten Durchlaufs berechnet.
  • Der Fehler im Kommandozeilenmodus wurde behoben, dass die überschrieben System.pas nicht gefunden wurde.
  • Für WideString gibt es keinen Plus-Operator für wchar_t. Solche Additionen werden nun mit Hilfe eines Strings ausgeführt, der temporär aus dem Zeichen gebildet wird.
  • Mit dem Schlüsselwort "absolute" kann in Delphi eine Variable deklariert werden, die sich an der gleichen Adresse befindet wie eine andere bereits existierende Variable. Dieses Verhalten wird nun in C++ reproduziert, indem die neue Variable als Referenz auf die exitierende Variable definiert wird. Nötigenfalls werden entsprechende Typkonvertierungen eingefügt.
  • Das "ATBinHex"-Beispiel wurde nun mit Delphi2Cpp 1.5.1 übersetzt. Die Anzahl der erforderlichen manuellen Korrekturen ist weiter reduziert.


22.08.2011 Version 1.5.0

  • Delphi2Cpp enthält jetzt eine nahezu vollständige Übersetzung der System Unit und der Sysutils Unit von Delphi nach C++. Besonders die System Units ist grundlegend in Delphi, weil sie implizit in allen anderen Units eingeschlossen wird. Sie sperrt sich gegen eine automatische Übersetzung, weil zu ihr viele intrinsische Funktionen gehören, die direkt in den Delphi Compiler eingebaut sind und in der Datei "System.pas" gar nicht oder nur kryptisch definiert sind. Auch die Unit Sysutils ist grundlegend, da sie von den meisten anderen Delphi Units eingeschlossen wird. Während der C++ Builder die Funktionalität dieser beiden Units zumindest teilweise in einer C++ Adaption der Delphi RTL/VCL bereitstellt, erleichtern die vorgefertigten C++ Übersetzungen für andere Compiler die Übersetzung des eigenen Delphi Codes enorm. Auch für den C++Builder sind nun die Teile der System Unit ergänzt, die in der Delphi RTL/VCL Adaption des Herstellers des C++Builders fehlen.
  • Im Zuge der mit der Übersetzung der gesamten System Uni einhergehenden Systematisierung wurde die zuvor schon vorhandene Datei "d2c_file.h/.cpp" in "d2c_sysfile.h/.cpp" umbenannt.
  • Für "array of const" Parameter gibt es jetzt ein C++ Pendant auch für andere Compiler als den C++Builder. Im C++Builder wird in diesem Fall ein Makro ausgeführt, das eine OpenArray Klasse mit den Elementen des "array of const" initialisiert und das zugleich einen zweiten Parameter für die Anzahl der Elemente konstruiert. Für andere Compiler gibt es nun eine OpenArray-Klasse, die auf einem std::vector basiert. Da diese Klasse über die size-Methode verfügt, ist ein zusätzlicher Parameter nicht nötig.
  • In Visual C++ kann ein Zeichen c nicht direkt in einen Standard-String konvertiert werden, was z.B. bei der Zuweisung einer Verkettung zum String S:S= c + S, erforderlich ist. Deshalb erfolgt die Konversion nun durch den Konstruktor "basic_string(size_type n, charT c, ...)", also als: S = String(1, c) + S. Dies funktioniert für die Standard-Strings aller Compiler.
  • In Vergleichen von Standard-Strings mit einem Zeichen wird letzterer nun automatisch auf die eben genannte Weise in einen String konvertiert. Z.B. "if S == c then" wird zu: "if( S == String( 1,c) )".
  • Für andere Compiler als den C++Builder werden Set's nun automatisch als Daniel Flower's TSet übersetzt und nicht mehr als "System::Set". TSet is in der datei DelphiSets.h definiert.
  • Die Behandlung von Namensräumen wurde etwas geändert: wenn eine erweiterte "System.pas" gesetzt ist, ist der Namensraum hierfür standardmäßig "d2c_system", ungeachtet des aktuellen Dateinamens. Dieser Ausdruck kann nun in einem zusätzlichen Feld im Optionendialog geändert werden. Wenn keine erweiterte "System.pas" gesetzt ist, wird standardmäßig "System" als Namensraum verwendet, was auf die gleiche Weise geändert werden kann.
  • Auch die Übersetzungstabelle des Übersetzers kann nun verwendet werden, um den Namensraum für eine Datei zu ändern. So ist es möglich den gleichen Namensraum für die Inhalte verschiedener dateien zu wählen.
  • Die Namespace-Option bei Verwendung einer überschriebenen "System.pas" für den C++Builder ist nicht mehr zwingend erforderlich. Ungeachtet dessen, ob diese Option aktiviert ist oder nicht, wird für den Typ "file" nun immer zur Unterscheidung von System::file die Namensraumbezeichnung - gewöhnlich d2c_system - vorangestellt.
  • Bei der Ausführung von Delphi2Cpp im Kommandozeilenmodus werden nun auch die Fehlermeldungen und Warnungen ausgegeben, die bei der Verarbeitung von Dateien in der Benutzeroberfläche produziert werden.
  • Der Fehler wurde behoben, dass der Adressoperator nochmals ausgeführt wurde, wenn in Delphi die Adresse einer Variablen an eine Funktion übergeben wird, die Variable in C++ als var-Parameter aber bereits eine Adresse ist.
  • Dieses Update wurde in Kooperation mit einem Kunden vorgenommen, der eine Fallstudie über sein Projekt geschrieben hat. Vielen Dank an Tony.


21.06.2011 Version 1.4.9

  • Die Typbezeichnungen "Char" und "PChar" werden nicht mehr entsprechend den Einstellungen für die Stringübersetzung in "char" und "char*" bzw. in "wchar_t" und "wchar_t*" übersetzt, sondern "Char" wird unübersetzt gelassen und "PChar" wird zu "Char*" übersetzt. Die Bezeichnung "String" wird ebenfalls bei der Übersetzung nicht geändert. So kann der generierte C++Code mit Hilfe entsprechender Definitionen von "Char" als "typedef char Char;" oder "typedef wchar_t Char" und entsprechender Definition von "String leichter von Ansi-Strings auf Wide-Strings umgestellt werden.
  • High( X ) und Low( X ) werden nun durch template-Funktionen High< X >() bzw. Low< X >() übersetzt, wenn X einen Typ bezeichnet. Diese Funktionen werden bereits zur Compilierzeit ausgewertet und sind portabel. Registrierte Benutzer finden die Definitionen für "High" und "Low" in "d2c_system.pas".
  • Die Funktion "Pos" wird für Standard-Strings nicht mehr mit "find" übersetzt. Stattdessen muß auch in C++ eine Pos-Funktion aufgerufen werden. Mit "find" ließen sich zwar nach Addition des Wertes 1 zumeist die gleichen Ergebnisse erzielen wie mit "Pos". Im dem Fall, dass kein Sub-String gefunden wird, wird jedoch mit string::npos ein Typ zurückgegeben, der nicht auf allen Systemen im Integervergleich den Wert -1 ergibt.
  • Die SmallString Klasse wurde erweitert und basiert nun auf einem nullterminierten Zeichen-Array.
  • Die Übergabe eines Standard-String Werts an eine Funktion wird nicht mehr in die Übergabe einer konstanten Referenz umgewandelt. Das ist zwar in C++ effizienter, da es das Kopieren des String-Array's vermeidet, erfordert aber eine manuelle Nachbearbeitung des Codes, wenn der String innerhalb des Funktionskörpers verändert wird.
  • Der Fehler bei der Übersetzung von Anwendungen für die Console wurde behoben, dass die erzeugte C++Builder Projektdatei die Erweiterung "bpk" statt "bpr" erhielt.
  • Ausblick: das nächste Update wird eine C++ Übersetzung der Dateien "System.pas" und "Sysutils.pas" liefern. Der Preis für Delphi2Cpp wird mit der Version 1.5.0 wieder deutlich angehoben werden.


31.05.2011 Version 1.4.8

  • Delphi Methodenzeiger, die die Ereignisbehandlung durch Delegation ermöglichen, werden nun auch für andere Compiler als den C++Builder reproduziert. Im C++Builder gibt es dafür die Spracherweiterung mit dem "__closure" Schlüsselwort.
  • Es gibt jetzt eine SmallString-Klasse für Visual C++ und andere Compiler.
  • Die Delphi Direktiven $HPPEMIT, $EXTERNALVAR, $NODEFINE und $NOINCLUDE werden jetzt vollständig unterstützt. Dies ermöglicht die Übersetzung der VCL.
  • Die Vereinheitlichung von Groß-/Kleinschreibung wurde nun auch auf den Inhalt von Kommentaren ausgeweitet. Dadurch werden die Symbole in den oben genannten Direktiven richtig zugeordnet. Diese Erweiterung kann Auswirkungen auf vorübersetzten C++ Code haben. Die dort verwendeten Bezeichner müssen in die Ersetzungsliste mit aufgenommen werden.
  • Konstanten werden nicht mehr als extern zu deklarierende Variablen behandelt.
  • Der Fehler wurde behoben, dass die Bezeichner von Namensräumen für die ersten Parameter in verschachtelten Funktionen und für Basisklassen von Objekten fehlten.


08.05.2011 Version 1.4.7

  • Mit Delphi2Cpp können jetzt nach Auswahl einer Delphi dpr-Dateien ganze Delphi-Projekte in C++-Builder Projekte konvertiert werden, vorausgesetzt, dass die dpr-Datei im Wurzelverzeichnis eindeutig benannter Delphi-Units liegt. Im einzelnen werden bei diesem Prozeß werden: 1. die zum Projekt gehörigen Dateien rekursiv in den Unterverzeichnissen gesucht, 2. die zugehörigen Pfade in die Projektoptionen übernommen, 3. die Dateien übersetzt, 4. ein Delphi2Cpp-Management erzeugt, 5. eine C++-Builder Projektdatei erzeugt (2.,3. und 4. Punkt nur in der professional Edition).
  • Dieses neue Feature können Sie in einem Video sehen, in dem der ein Delphi-Projekt für das Tetris-Spiel nach C++ konvertiert wird: http://www.texttransformer.de/D2C_Videos_ge.html
  • In den Projekt-Optionen sind nun die Pfade für die nicht zu übersetzenden (VCL) Dateien und die Pfade für die zu übersetzenden Dateien getrennt einzutragen.
  • Ausgewählte Projektoptionen können nun als Standard-Optionen markiert werden, die beim Neustart automatisch geladen werden.
  • Die Routinen Read(Ln)/Write(Ln), die in Delphi beliebige Anzahl von Parametern akzeptieren, werden jetzt von Delphi2Cpp in Folgen von Aufrufen dieser Funktionen mit jeweils nur einem Ein- bzw. Ausgabeparameter zerlegt.
  • Die speziellen durch Doppelpunkte markierten Formatierungsanweisungen für Write(Ln) und Str-Prozeduren, werden in den separierten Aufrufen nun mit den üblichen durch Kommata getrennten Parametern reproduziert.
  • Zur Reproduktion der Delphi Ein- und Ausgaberoutinen, die nicht analog nach C++ zu übertragen sind, gibt es jetzt vorgefertigten C++-Code. Darin definiert sind: TTextRec, typisierter und nicht typiserter TFileRec und die Funktionen: IOResult, FileSize, Flush, AssignFile, Seek, SeekEof, SeekEoLn, Erase, Rename, Eof, EoLn, SetTextBuf, Truncate, Close, CloseFile, Rewrite, Reset, BlockWrite, BlockRead, Write, WriteLn, Read und ReadLn.
  • Fehlende Rückgabewerte und Parameter von Routinen im Implementationsteil werden nun automatisch durch die Werte aus den entsprechenden Deklarationen ergänzt.
  • Records mit Methoden werden jetzt von Delphi2Cpp akzeptiert und übersetzt. Dies ist ein erster Schritt über Delphi 7 hinaus.



11.04.2011 Version 1.4.5

  • Die Meta-Fähigkeiten von Delphi, die durch die C++-Erweiterungen des C++ Builders dort teilweise reproduziert werden, jedoch für andere Compiler nicht zur Verfügung stehen, können jetzt mit einer eigens für Delphi2Cpp entwickelten TObject-Klasse simuliert werden. class Methoden wie z.B. "ClassName" und "InheritsFrom" stehen damit zur Verfügung. Damit besteht sogar die Möglichkeit über eine virtuelle Create-Methode Objekte des jeweils erforderlichen Typs zu erzeugen. Auch für den C++Builder besteht nun diese Möglichkeit: Delphi2Cpp kann dafür sorgen, dass eine Klassen die von TObject der C++Builder VCL abgeleitet ist, stattdessen von einer Klasse TD2CObjekt abgeleitet wird, die die Create-Methode bereitstellt. (Die TObject/TD2CObject Klassen werden nur mit der professional Version von Delphi2Cpp ausgeliefert.)
  • class-Methoden wurden bisher als einfache statische Methoden übersetzt. In C++ steht damit kein Pendant zu Delphi's "Self" zur Verfügung. Nun wird class-Methoden ein zusätzlicher Parameter übergeben, der ein Zeiger auf den Typ des aufrufenden Objekts ist und damit als "Self" fungiert.
  • Virtuelle class-Methoden können nun ebenfalls übersetzt werden. Zwar können die statischen Methoden von C++ nicht virtuell sein, die zusätzliche Parameter erlaubt aber eine Weiterleitung des Aufrufs an eine entsprechend von Delphi2Cpp eingefügte zusätzliche virtuelle Methode.
  • Der "is"-Operator wird nun bei der Prüfung einer VCL-Klasse auf dIe Metaklasse übersetz als: Obj->ClassNameIs( targetClass->ClassName() )
  • Die Integration der überschriebenen "System.pas" wurde verbessert: bei einer Definition wie "THandle = System.THandle" wird nun der Type zunächst in der eignen System-Datei gesucht.
  • Vergleiche von String mit dem Leerstring werden in der Übersetzung durch die Methodenaufrufe "IsEmpty" bzw. "empty" ersetzt. Bei VCL-Strings werden dadurch Mehrdeutigkeiten vermieden und für std::string's wird die Effizienz gesteigert.
  • Die Übersetzung von abstrakten Methoden wurde geändert: weil in Delphi Objekte auch dann erzeugt werden können, wenn ihre Definition abstrakte Methoden enthält, dies aber in C++ nicht möglich ist, werden die Methoden in C++ nicht mehr als abstrakt definiert. Stattdessen so, dass bei ihrem Aufruf eine Ausnahmebehandlung erfolgt.
  • Dieses Update ist so substantiell, dass es einen Versionssprung von 1.4.3 auf 1.4.5 gerechtfertigt ist.


14.03.2011 Version 1.4.3

  • Inline assembler wird in der professional Version verarbeitet: Delphi Kommentare werden zu C++ Kommentaren konvertiert, Delphi Ausdrücke, die innerhalb des Assembler Codes verwendet werden, werden analysiert und konvertiert und Bezeichner können durch andere Bezeichner ersetzt werden. Für andere Compiler als den C++Builder werden lokale Label in globlale Label konvertiert. Häufig reichen diese Aktionen aus, um funktionierenden Code zu erhalten. Im Einzelfall ist jedoch Assembler-Expertenwissen gefragt.
  • In verschachtelten Funktionen wird der "result"-Wert der übergeordneten Funktion durch untergeordnete Funktionen an untergeordnete Prozeduren durchgereicht. Lokale Typedefinitionen innerhalb der übergeordneten Funktion werden im C++-Code an Positionen verschoben, die die Verwendung der Parameter dieser Typen auch in den aufgelösten Unterfunktionen erlaubt.
  • Die Übersetzungstabelle des Übersetzers wird nun auch auf die Namen von Hilfsvariablen angewandt, die zur Definition implizit definierter Typen benötigt werden. Dadurch ist ein Abgleich mit den entsprechenden Namen der C++Builder VCL möglich, die dort von Version zu Version verschieden sein können. Auch der Set-Typ "System::Set" kann auf diesem Wege umbenannt werden, z.B. zur bequemen Einbindung von Daniel Flower's TSet.
  • Falsch innerhalb einer Anweisung plazierte Kommentare werden jetzt korrekt hinter der Anweisung geschrieben.
  • Fehler bei implizit innerhalb einer Variablendefinition definierten Strukturen wurden behoben. Der Type der Elemente wurde nicht erkannt.

21.02.2011 Version 1.4.2

  • Bei der Zuweisung von void-Zeigern an andere Typen wird der Zeiger nun automatisch in den anderen Typ umgewandelt.
  • Eine entsprechendee Umwandlung findet auch statt, wenn der andere Type als Parameter in einem Funktionsaufruf erwartet wird.
  • Beim Schließen des Datei-Managers wird nun automatisch eine Datei namens "pch.inc" erzeugt. Sie enthält die Liste aller gefundenen eingeschlossenen Header-Dateien. Diese Liste kann für den vorkompilierten Header oder die "stdafx.h" Datei von Visual C++ verwendet werden.
  • In der professional Version gibt es jetzt die Option include Direktiven in des erzeugten C++ Dateien zu unterdrücken. Das kann sinnvoll sein, wenn stattdessen die oben genannte "pch.inc" verwendet wird.
  • Es gibt nun eine einfache Möglichkeit Delphi2Cpp für individuelle Benutzer zu konfigurieren. Dazu gibt es in dem Dialog für Benutzereinstellungen eine zusätzliche Seite.
  • Eine Menge von Fehlern wurden beseitigt, die vor allem mehrdimensionale array's und die Verwendung des Codes für Visual C++ betreffen.

Ein Benutzer von Delphi2Cpp hat eine leistungsfähige Template-Klasse beigesteuert, die Delphi- Sets emuliert. Features:

  • Binäre Kompatibilität mit Delphi's Set's.
  • Alle Delphi und die meisten CBuilder Operatoren und Features.
  • Unterstützt eine unbegrenzte Anzahl von Elementen (vs Delphi's Begrenzung auf 256).
  • Hoch optimiert (unterstützt enhanced CPU instruction sets).
  • Konfigurierbarer Datentyp der Elemente, daher 8/16/32/64bit Portabilität.

Vielen Dank an Daniel Flower.


04.02.2011 Version 1.4.1

- Für die Rückgabe statischer Array's aus Funktionen gibt es nun einen Behelf. Da dies in C++ nicht ebenso möglich ist wie in Delphi, wird ein Zeiger auf das erste Element des Array's zurückgegeben und als Argument für "memcpy" verwendet. In Fällen, wo das statische Array lokal innerhalb der Funktion erzeugt wurde, wird vor dessen Zerstörung eine Kopie des Array's in einem Hilfs-Array in der Datei angelegt.

- with-Anweisungen werden nun anders übersetzt als bisher. Anstatt den Ausdruck an allen entsprechenden Stellen einzusetzen, wird nun eine temporäre Variable des resultierenden Typs angelegt. So werden auch Konstruktionen wie die folgende korrekt übersetzt:


  with TmyObject.Create do
    try
      // do something with the object
    finally
      Free;
    end;
->

{
  /*# with TmyObject.Create do */
  TmyObject* tmp2 = new TmyObject;
  try
  {
    // do something with the object
  }
  __finally
  {
    tmp2->Free();
  }
}    

- Die kaum verständliche Fehlermeldung "unit expected" erschien bisher, wenn eine eingeschlossene Datei mit einer UTF8-Kennung (BOM) begann. Diese Kennung wird von neueren Delphi-Versionen erzeugt und wird nun auch von Delphi2Cpp akzeptiert.

- Es gibt nun ein vereinfachendes Makro für "dynamic_cast<>", das für den "is"-Operator steht:

#define ObjectIs(xObj, xIs) dynamic_cast< xIs >( xObj )

Dieses Makro muss in der überschriebenen System.pas enthalten sein. Wenn diese Datei nicht verwendet wird, wird auch das Makro nicht benutzt und diue Übersetzung bleibt die gleiche wie in den bisherigen Versionen von Delphi2Cpp.


- Statt der nicht existierenden Datei "BDE.pas" wird nun die Datei "bde.int" analysiert, wenn der Pfad zu dieser Datei in der Liste der Include-Pfade vorhanden ist. Wenn die Dateien "WinTypes.pas" und "WinProc.pas" nicht vorhanden sind, ersetzt der Präprozessor ihre Verweise durch den auf "Windows.pas".

- Mehr Korrekturen spezieller Fehler.


16.01.2011 Version 1.4.0

- Die professional Version von Delphi2Cpp.exe kann nun auch als Kommandozeilen-Programm ausgeführt werden.

- Die für Delphi besonders wichtige Quellcode-Datei "System.pas" kann nun individuell überschrieben und/oder erweitert werden (nur in der professional Version von Delphi2Cpp).

- Das Skelett einer solchen individuellen "System.pas" wird in das "Source"-Verzeichnis von Delphi2Cpp installiert. In dieser Datei "d2c_system.pas" sind u.a. die wichtigsten Funktionen zum Speichermanagement definiert. Die Übersetzung der Datei mit Delphi2Cpp ergibt funktionierenden C++-Code und kann zusammen mit eigenen übersetzten Dateien kompiliert und gelinkt werden.

- "d2c_system.pas" enthält u.a. auch spezielle Funktionen für "Inc" und "Dec", die auch für enumerierte Typen funktionieren. Für solche Typen werden bei der Übersetzung diese Funktionen nun nicht mehr durch den Inkremtierungs- bzw. Dekrementierungsoperator ersetzt.

- Die Funktion "Fillchar" wird nicht mehr automatisch durch die "memset" Funktion ersetzt. Stattdessen wurde die Definition systematischer Weise in "d2c_system.pas" eingefügt.

- Temporäre Parameter in Funktionsaufrufen werden nun explizit als Variablen diesen Aufrufen vorangestellt. Diese werden zusammen mir dem Funktionsaufruf in einen {...}-Block eingeschlossen,So wird die Lebensdauer der Variablen für den Zeitraum des Funktionsaufrufs sicherstellt. Zugleich wird gewährleistet, dass die beiden Anweisungen auch dann innerhalb eines gemeinsamen Blocks stehen, wenn die ursprüngliche Anweisung innerhalb einer Kontrollstruktur ohne solchen Block auskam. Z.B.:

 if Greet(PChar('hello ' + Name + '!')) then
   Exit;

->

  {
    AnsiString Str__0( "hello " ) + Name + "!";
    if ( Greet( Str__0.c_str( ) ) ) 
      return;;
  }

Neu ist auch die Übersetzung von temporären set's als Werten vom "open array"-Parametern, die ebenfalls auf die eben geschilderte Art erfolgt.

procedure Log(strings : array of String);

Log(['one', 'two', 'three']);

->

void __fastcall Log( const String* strings, int strings_maxidx )

{
  String tmp__0[ 3 ];
  tmp__0[ 0 ] = "one";
  tmp__0[ 1 ] = "two";
  tmp__0[ 2 ] = "three";
  Log( tmp__0, 3 );
}

- Verbesserungen bei der Berechnung von Compilierzeit-Konstanten.

- Die mit dem letzten Update eingeschlagenen Strategie, Typbezeichner weitgehendst unverändert zu lassen wurde ausgebaut/komplettiert. Z.B. "String" wird nicht mehr durch "AnsiString" oder "WideString" ersetzt.

- Bisher wurde "String"-Parameter stets wie Delphi-Strings behandelt, auch bei aktivierter Option zur Übersetzung als Standard-Strings. Ab diesem Update werden die "String"-Parameter konform mit "AnsiString" und "WideString" behandelt.

- Fehlende Namensraumbezeichner bei Konstanten und in den redeklarierten Konstruktoren der Vorgängerklassen, werden nun augegeben.

- Code für den "Cpp" definiert ist wird nicht mehr bezüglich Groß-/Kleinschreibung korrigiert. Zuvor konnte es z.B. passieren dass dabei "#include <io.h>" zu "#Include <io.h>" umgewandelt wurde.

- Ersetzungen werden nun bereits ausgeführt, bevor eine eingeschlossene Unit geöffnet wird, so dass statt der ursprünglich genannten Unit eine andere eingeschlossen werden kann. Eine derartige Ersetzung, nämlich die von "WinProc" durch "Windows", geschah bisher schon automatisch, wenn "WinProc" nicht gefunden wurde. Dies geschieht nun auch für "WinTypes" automatisch.

- Standardmäßig ist nun "MSWINDOWS" definiert. Diese Definition kann selbstverständlich entfernt oder ersetzt werden.

- Die Hilfe zu Delphi2Cpp kann nun zusätzlich auch als PDF-Datei installiert werden.

- Die Qualität der Übersetzung wurde erneut überprüft: das "ATBinHex"-Beispiel dass im Mai letzten Jahres erstmal mit Delphi2Cpp 1.3.0 übersetzt wurde, wurde nun mit Delphi2Cpp 1.4.0 nochmals übersetzt. Die Anzahl der erforderlichen manuellen Korrekturen ist auf weniger als die Hälfte reduziert.

- Es gibt nun einen Übersetzungs-Service für Delphi2Cpp.

- u.v.m.


06.12.2010 Version 1.3.9

- "ShortString" und "String[n]" werden jetzt soweit möglich adäquat übersetzt. D.h. Aufrufe von "Length", "SetLength", "Low" und "High" werden für diese Stringtypen speziell behandelt. Für andere String-Methoden werden "ShortString" und "String[n]" temporär in einen String konvertiert. Bisher wurden ShortString wie normale Strings behandelt.

- Die Methoden zur Ermittlung von Zeigertypen wurden komplett überarbeitet. Dies führt oft zu präziseren Übersetzungsergebnissen als bisher. Dies betrifft insbesondere dynamische Arrays. Bisher wurden häufig Parametertype durch Basistypen ersetzt. Das geschieht jetzt nur noch in wenigen erwünschten Fällen, wie z.B. die Ersetzung von "PChar" durch "char*".

- Die Definition von Konstanten durch andere Konstanten erfolgt in C++ jetzt vollständig durch Einsetzung der Werte der bereits definierten Konstanten, so dass es zu keinen Compilerfehlern mehr kommt.

- Die Umsetzung der Option zur Erzeugung von Namensräumen wurde vervollständigt: die Namensräume von Basisklassen werden eingefügt und forward-Deklarationen werden in den Namensraum geschrieben.

- Fehler mit globalen Variablen im Interface-Teil wurden behoben.

- u.v.m.



09.11.2010 Version 1.3.8

- In der professional Version gibt es jetzt die Option, für jede Unit einen gleichnamigen namespace zu erzeugen. In den C++ Headern werden dann Typen aus anderen Units deren namespace vorangestellt und in den C++ Implementationsdateien werden die entsprechenden using-Klauseln eingefügt. Durch namespace's qualifizierte Bezeichner werden entsprechend aufgelöst.

- Die Delphi Direktiven $HPPEMIT, $EXTERNALVAR, &NODEFINE und $NOINCLUDE werden jetzt von Delphi2Cpp unterstützt.

- Mit dem Update 1.3.6. wurde ein Fehler in den Dialog für die Liste der Include-Verzeichnisse eingebaut. Bei mehrfacher Benutzung des Dialogs wurde die Liste mehrfach kopiert. Dieser Fehler wurde behoben.

- Im File-Manager werden nun schon während der Verarbeitung der Dateien mehr Fehler-Informationen angezeigt.

- Wenn in einer Case-Anweisung für einen "case" eine Menge von mehr als 1000 Elementen definiert ist, werden diese Fälle bei der Übersetzung nicht mehr vollständig aufgelistet. Stattdessen wird ein Hinweistext ausgegeben: "There are too much cases! This section of code has to be converted by hand!". Bisher brauchte Delphi2Cpp viel Zeit, um dieses Listen schreiben, so dass es schien, als stünde das Programm still.

- Fehlerbeseitigung im Päprozessor: "UNDEF" funktionierte nicht für Bezeichner, die nicht bereits in den Delphi2Cpp Optionen als definiert gesetzt sind. Die Direktiven "$I+" und $I-" werden nun ignoriert.




25.10.2010 Version 1.3.7

Viele Detailverbesserungen im Implementationsteil von Units, die im einzelnen oft schwer zu beschreiben sind. Besonder zu nennen sind:

- Bisher war nur der Vorrang der "and" und "or" Operatoren vor den Gleichheitsoperatoren berücksichtigt worden. Nun wird auch die Reihenfolge in der andere Operatoren in Delphi innerhalb von Ausdrücken ausgeführt werden im übersetzten C++ Code reproduziert.

- "not" wird nun zu '~' konvertiert, wenn der folgende Ausdruck nicht vom Typ boolean ist.

- Der Fehler wurde beseitigt, dass Funktionen zur Initialisierung von arrays nicht aufgerufen wurden, wenn die Unit keinen Initialisationsteil enthält.

- Viele weitere Verbesserungen bei Typecasts, Zeigern, verschachtelten Funktionen etc.



03.10.2010 Version 1.3.6

  • Es gibt nun einen zusätzlichen Dialog für Benutzereinstellungen. Dort kann nun eingestellt werden, ob Bildschirmpositionen beim Neustart wiederhergestellt werden sollen.
  • "System.pas" wird jetzt immer zusätzlich zu den anderen eingeschlossenen Dateien geparst. Dieses Verfahlen liefert wesentlich mehr Signaturen von Funktionen und Klassen- und Struktur-Definitionen als bisher, wo lediglich Teile dieser Datei simuliert wurden. Wird "system.pas" nicht gefunden arbeitet das Programm wie bisher.
  • Wenn in einer "program"-Datei ein Instanzbezeichner für die Form spezifiziert ist, die mit einer Unit verbunden ist, wie in "Demo in 'Demo.pas' {DemoForm}", so wird dies jetzt in Übereinstimmung mit dem Verfahen des CBuilders übersetzt als "USEFORM("Demo.cpp", DemoForm);".
  • In Abhängigkeit von der "$APPTYPE" Direktive, wird die "main" Funktion eines "program"-Datei als "WinMain" für GUI-Anwendungen übersetzt oder als "main" Funktion für Konsole-Anwendungen.
  • Klassenelemente am Beginn einer Klassendeklaration, für die keine Sichtbarkeit spezifiziert ist, werden jetzt standardmäßig als "__published" für den CBuilder und "public" für andere Compiler gesetzt, wenn die Klasse von "TPersistent" abgeleitet ist.
  • Variablen mit einfachen Typen werden nun initialisiert.
  • Die höhere Priorität der "and" und "or" Operatoren vor den Gleichheitsoperatoren in Delphi wird in C++ jetzt durch entsprechende Klammerung sichergestellt.
  • An Parameter des Typs "var x" und "x : pointer" wird ein Strings S nun nicht mehr als "S.c_str()" übergeben, sondern als "&S".
  • Bei einer Division mit '/' wird der Zähler zu einem double Typ gecastet, wenn er es nicht schon ist.
  • Der Fehler wurde behoben, dass für Konstanten mit negativen Werten Zufallswerte eingesetzt wurden.
  • Der Fehler wurde behoben, dass bei der Übersetzung von "try/except on E do handle_exeption" auch der die Behandlung "catch (...) {}" hinzugefügt wurde.
  • Weitere kleine Fehler wurden behoben.

13.09.2010 Version 1.3.5

Wegen dem Umfang der Erweiterungen und Verbesserungen wird die Versionsnummer in diesem Update gleich um zwei Stellen erhöht.

  • Mit diesem Update ist es bei der professional Version des Programms möglich zunächst alle Quelldateien durch den Präprozessor vorverarbeiten zu lassen und dann die vorverarbeiteten Quellen zu benutzen, um die Übersetzungsergebnisse zu optimieren, ohne den Code jedesmal erneut vorverarbeiten zu müssen.
  • Die Einstellmöglichkeit für andere Compiler wurden erweitert, so dass künftig auch spezielle Codevarianten für Visual C++ und gcc erzeugt werden können.
  • Ein Fehler bei der Übersetzung von "program"- "library"- and "package"-Dateien wurden behoben.
  • Interface-Typen werden nun als Zeiger behandelt.
  • Der "file"-Type und der "text"-Type werden nun als "void*" übersetzt.
  • Die Reihenfolge der Deklarationen wurde überarbeitet.
  • Fehler bei den Variablennamen in verschachtelten Funktionen wurden behoben.
  • Viele weitere kleine Fehler wurden behoben.


15.08.2010 Version 1.3.3

  • Wenn ein Quellcode zum zweiten mal übersetzt wurde, konnte es passieren, dass Typen nicht mehr richtig erkannt wurden. Stattdessen wurde die Meldung erzeugt: "/*# waiting for definiens ...". Nun bleiben Typen aus anderen "interfaces" als dem der aktuellen Quelldatei als definiert markiert, so dass der Fehler nicht mehr auftritt.
  • PChar, PAnsiChar und PWideChar werden nun in die Zeiger auf die entsprechenden Zeichentypen konvertiert.
  • Wenn der Typ y ein array ist, wird der Typ von x in "var x : ^y;" nun als ein Zeiger auf ein Element des arrays übersetzt. Ansernfalls wird der Code übersetzt als: "y* x;"
  • Die Unterstützung für std::string, std::wstring und std::vector wurde verbessert für den Fall, dass die spezielle Behandlung der VCL Funktionen aktiviert ist. Außerdem wird nun beim Zugriff aus einzelne Zeichen der 0-basierten Standard-Strings der Index korrigiert.
  • Für andere Compiler als den CBuilder erfolgt im C++ Code der Zugriff auf default-properties nun ebenso über die generierten Zugriffsmethoden, wie bei anderen properties auch.
  • Kommentare nach dem abschließenden Punkt am Ende einer Unit werden nicht mehr ignoriert.
  • Ein bisher fehlender Zeilenumbruch wird nun eingefügt in Fällen wie: TFormXXX* FormXXX;#pragma resource "*.dfm"
  • Es gibt nun ein Video, das demonstriert, wie Delphi2Cpp intern mit Typinformationen umgeht.
http://www.texttransformer.de/Videos_ge.html


25.07.2010 Version 1.3.2

  • Eingeschlossene Dateien konnten einen Benutzerabbruch auslösen, wenn sie sehr klein waren. Dieser Fehler wurde behoben.
  • Ein Zeilenkommentar ohne nachfolgenden Zeilenumbruch am Ende einer Datei löste einen Fehler aus. Dieser Fehler wurde behoben.
  • Die Auswahl keine vorkompilierte Header zu verwenden wird nun auch in der Projektdatei abgespeichert.
  • Der resultierende Typ der "assigned"-Funktion wird nun auch bei ausgeschalteter Option zur Spezialübersetzung von VCL-Funktionen als bool erhalten und somit "and" bzw. "or" zwischen den Aufrufen von "assigned" durch die logischen Operatoren "&&" bzw. "||" übersetzt.
  • Bei eingeschalteter C-Option wird "TRec = record ... end;" nun übersetzt als "typedef struct {...} TRec;" statt "struct TRec {...};" für C++.
  • Für andere Compiler als den CBuilder wird "finally" nun übersetzt zu:

      catch(...) 
      { 
        ... // Anweisungen
        throw; 
      }


05.07.2010 Version 1.3.1
  • Read-Properties werden für andere Compiler als den CBuilder nur noch dann als const-Funktionen übersetzt, wenn Klassenelemente zurückgegeben werden und nicht mehr, wenn Funktionen aufgerufen werden.
  • Delphi2Cpp interpretiert @Me.Parameter nun als @(Me.Parameter) und nicht mehr wie bisher als (@Me).Parameter.
  • Ein Fehler im Präprozessor wurde behoben, der bei mehrfacher Verwendung von {$IFDEF Cpp} in einer Datei auftrat.
  • Der resultierende Typ von Ausdrücke wie "not expr" wird jetzt immer als "bool" ermittelt, so dass der logische binäre Operator für die Übersetzung gewählt wird, wenn solche Ausdrücke in "or" oder "and" Verknüpfungen stehen.
  • In Fällen wie "if(...) FreeAndNil(p)" werden nun zusätzliche Klammern eingefügt, so dass man folgendes Ergebnis erhält:

      if(...)
      {
        delete p;
        p = NULL;
      }


14.06.2010 Version 1.3.0.1

Nachkommastellen wurden wie Vorkommastellen behandelt. So wurde z.B. 1.2 aus 1.002. Dieser Fehler wurde behoben.

25.05.2010 Version 1.3.0

In Delphi entwickeln, C++ kompilieren:

Der übersetzte C++ Code kann nun mit dem Code synchronisiert werden, der in Delphi weiter entwickelt wird. Zu diesem Zweck können die Teile des Codes, die in C++ einer Nachbearbeitung bedurften, bereits in Delphi so vorformuliert werden, dass sie bei erneuter Übersetzung nicht erneut nachbearbeitet werden müssen. Bei der Präparation des Delphi-Codes kann auf eine vordefinierten Konstante zurückgegriffen werden, so dass mittels bedingter Kompilierung bestimmte Codeabschnitte nur für die Übersetzung nach C++ relevant sind, während andere Abschnitte nur für den Delphi-Compiler sichtbar sind. Darüber hinaus können komplette C++-Codeabschnitte bereits so in den Delphi-Code eingefügt werden, dass sie bei der Übersetzung in die Ausgabe übernommen werden, den Delphi-Compiler aber nicht stören.

Weitere Neuerungen in Delphi2Cpp 1.3.0 sind:

  • Die Windowskonformität der Installation und Benutzeroberfläche wurden verbessert.
  • Die Zugriffe auf Arrays über einen Index bleiben nun korrekt, trotz der Umwandlung von Delphi-Arrays in 0-basierte C++-Arrays. Vom Wert des Indexes wird nun der Wert der unteren Grenze (Low) abgezogen, die das Array in Delphi hatte. Die Funktionen "Low" und "High" ergeben nun in C++ die gleichen Werte, die man auch in Delphi erhält. Das Makro "HIGH" wurde umbenannt zu "MAXIDX".
  • In der professionellen Version von Delphi2Cpp gibt es nun die Option zur Ermittlung von Laufzeitinformationen für Klassen die MAKROS "DECLARE_DYNAMIC" und "IMPLEMENT_DYNAMIC" automatisch einfügen zu lassen, die von den Microsoft Foundation Classes (MFC) her bekannt sind, aber auch individuell definiert werden können.
  • Als reales Beispiel für eine Übersetzung von Delphi-Quellcode nach C++ wurde die exzellente ATBinHex-Komponente von Alexey Torgashin übersetzt.
  • Der Preis für Delphi2Cpp wurde entsprechend den erweiterten Fähigkeiten des Programms erneut leicht angehoben.

13.05.2010 Version 1.2.9

-In einem Log-Fenster werden nun einzelne Schritte der Übersetzung dokumentiert und Warnungen und Fehlermeldungen ausgegeben.

-Durch exaktere Behandlung von Namensräumen wurde die Qualität der Übersetzung weiter verbessert.


02.05.2010 Version 1.2.8

-Die Reihenfolge von Typdefinitionen wird nun korrigiert. Die Definitionen werden erst dann geschrieben, wenn der definierende Type bekannt ist. Zugleich wird damit die Erkennung der Typen an späteren Stellen im Code verbessert. Siehe in der Hilfe den Abschnitt: "Order of type definitions".

-Botschaftsbehandlungsmethoden werden jetzt unter Verwendung des VCL_MESSAGE_HANDLER-Makros übersetzt.

-goto-Anweisungen werden nun übersetzt und das Update enthält viele weitere kleine Verbesserungen.

-Es gibt mehr und mehr Feedback von Benutzern, was stark zu der Verbesserung von Delphi2Cpp beiträgt. Vielen Dank an sie alle!


25.04.2010 Version 1.2.7

Eine Reihe zusätzlicher Übersetzungsoptionen ist hinzugekommen:

  1. Die spezielle Behandlung von VCL-Funktionen kann nun abgeschaltet werden, so dass für sie eigene Funktionen geschrieben werden können.
  2. Die Erzeugung von Kommentaren zu den Übersetzungen kann abgeschaltet werden. Diese Kommentare beginnen nun außerdem mit "/*#", so dass sie leicht von anderen Kommentaren unterschieden werden können.
  3. Delphi Strings können nun wahlweise auch in Standard Strings übersetzt werden.
  4. Es kann gewählt werden ob "String" als "AnsiString" oder "WideString" interpretiert wird.
  5. Die Präfixe für die Funktionen zur Ersetzung der properties können frei definiert werden.
  6. In der professionellen Version gibt es nun auch die Möglichkeit die Ausgabe von C-ähnlichem Code zu erzwingen.

Außerdem gibt es wieder einige Verbesserungen der Übersetzungsqualität und Fehlerbehebungen:

  1. Die fehlerhafte Spezialbehandlung der Insert-Prozedur wurde korrigiert.
  2. Initialisierungen von lokalen Arrays, die teilweise fehlten, werden nun erzeugt.
  3. "FreeAndNil" wird nun durch "delete" ersetzt.
  4. Fehler beim Parsen neuerer Versionen der VCL wurden behoben. "SyncObjs.pas" wird vom Parsen ausgeschlossen.
  5. Weitere Verbesserungen.


18.04.2010 Version 1.2.6

Stark verbesserte Übersetzungsergebnisse, weil
-die Übergabe von Strukturen an Funktionen in WinProcs jetzt in Übereinstimmung mit der CBuilder VCL als Übergabe von Adressen interpretiert wird
-zwischen boolschen und bitweisen "and" und "or" Operator unterschieden wird
-Default-Parameter in verschachtelten Funktionen berücksichtigt werden
-und es viele weitere Detailverbesserungen gibt.
-Außerdem wird jetzt für den Zugriff auf Elemente die übliche Schreibweise mit dem Zeiger-Operator "a->" ausgegeben statt der bisherigen "(*a).".
-Überflüssige Set-Definitionen werden vermieden.


07.04.2010 Version 1.2.5

-Die Liste der Bezeichner, die vom Präprozessor zur Vereinheitlichung der Schreibweisen erzeugt wird, kann nun gespeichert werden. In einer nachfolgenden Sitzung kann die Liste wieder geladen werden, um in weiteren Übersetzungen die gleichen Schreibweisen beizubehalten.
-In der professional Version von Delphi2Cpp gibt es nun eine zusätzliche Ersetzungstabelle für den Übersetzer ähnlich der schon vorhandenen Tabelle für den Präprozessor.
-Die Behandlung von Arrays wurde überarbeitet. Dabei wurde die Strategie der Indexierung geändert. (Mehr Informationen zu diesem Punkt finden Sie in den Abschnitten der Hilfe: Statische Arrays und Offene Arrays.)


24.03.2010 Version 1.2.4
-Initialisierung und Finalisierung von Units.
-Initialisierungsroutinen für array's.
-Diverse weitere kleine Verbesserungen.


18.03.2010 Version 1.2.3
-Viele kleine spezielle Verbesserungen der Übersetzungsqualität


07.03.2010 Version 1.2.2
-Verschachtelte Delphi Funktionen werden nun in normale Klassenfunktionen entflochten. Alle nötigen Parameter werden an diese Funktionen übergeben.
-Überschriebene "properties" werden nun auch in C++ entsprechend überschrieben.


28.02.2010 Version 1.2.1
-Delphi2CppInstall.exe installiert nun eine dauerhaft nutzbare Demoversion von Delphi2Cpp. Das Demoprogramm liefert Übersetzungen in gleicher Qualität wie das lizensierte Programm. Jedoch ist die Menge des ausgegebenen Codes für den Implementationsteil auf 10000 Zeichen begrenzt und das Laden und Speichern von Code und Optionen ist nicht möglich. Beim Kauf einer Lizenz von Delphi2Cpp wird ein Link auf eine Version von Delphi2Cpp geliefert, in der sich die vollständige Funktionalität des Programms mittels der Lizenz freischalten lässt. Wie bisher gehört der Dateimananger nicht zur Funktionalität der Standardversion sondern ist nur in eder professional Version nutzbar.
-Zusätzliche Option für vorkompilierte Header.
-Verbesserung der Überzetzung von Zeigern auf Zeiger
-Kosmetische Verbesserungen:
a) statt der unüblichen Schreibweise

(*fo).bar , jetzt: fo->bar

b) statt der unüblichen Einrückung der Klammern:

if(...)
  {
    ...
  }

jetzt:  

if(...)
{
  ...
}


17.02.2010 Version 1.2.0
- Optional kann nun C++-Code auch für andere Compiler als den CBuilder generiert werde. Für die anderen Compiler werden Delphi-properties eliminiert, indem ihre Vorkommen durch entsprechenden Read- bzw. Write-Methoden ersetzt werden.

- Schreibweisen und Übersetzungen von Bezeichnern können nun durch eine individuelle Übersetzungstabelle gesteuert werden.

- Die Qualität des Übersetzungsergebnisses wurde weiter gesteigert, insbesondere bezüglich der Behandlung von Arrayzeigern, Typecasts, __classid u.v.m

- Der Preis für Delphi2Cpp wurde entsprechend den erweiterten Fähigkeiten des Programms erneut leicht angehoben.



04.02.2010 Version 1.1.9
- An Stellen, wo C++ konstante Ausdrücke erwartet, werden in der Übersetzung nun die Werte von Konstanten ausgegeben, statt der Konstanten selbst.

- Für globale Funktionen wird nun registriert, ob der Rückgabetyp ein Zeiger ist. Bisher wurde das vergessen.

- Die Änderung im letzten Update String-Parameter "(s : string)" als "(const string& s)" zu übersetzen wurden rückgängig gemacht, weil dies zu Konflikten mit der CBuilder VCL führte.

- Ein Fehler wurde beseitigt, der dafür verantwortlich war, dass häufig falsche Übersetzungsalternativen für spezielle VCL-Funktionen ausgewählt wurden.


01.02.2010 Version 1.1.8
- Die Übersetzung des Implementationsteils der pas-Dateien erfolgt nun um ein mehrfaches schneller als bisher.

- Unterfunktionen verschachtelter Funktionen werden nun korrekt behandelt. Die Verschachtelung bleibt allerdings weiterhin bestehen.

- Verbesserungen bei der Behandlung von Stringadditionen und Stringparametern.



25.01.2010 Version 1.1.7
- Viele with-Anweisungen, die bisher nicht korrekt übersetzt wurden, werden nun korrekt analysiert und übersetzt

- Viele weitere kleine Verbesserungen.



17.01.2010 Version 1.1.6
- Deklarationen von Klassen werden nur noch in den tatsächlich eingeschlossenen Units gesucht.

- Unit-Namensräume werden in qualifizierten Bezeichnern nun korrekt mit zwei Doppelpunkten markiert. Z.B.: Graphics::...

- Die Ermittlung der Liste der Konstruktoren der Vorgängerklassen wurde verbessert.


06.01.2010 Version 1.1.5
- Fehlerpositionen im Fenster des Delphi-Quellcodes wurden bisweilen verschoben angezeigt, weil sie sich auf den vorverarbeiteten Code bezogen. Nun wird nach der Übersetzung in diesem Fenster der vorverarbeitete Code angezeigt.

- Kommentare aus dem Interfaceteil wurden nur lückenhaft reproduziert. Dies wurde verbessert.

- Konstanten des Interfaceteils wurden bisher als statische Konstanten in den C++-Headern übersetzt. Das konnte zu vielen Warnmeldungen des Compilers führen, wenn der Header in mehreren Dateien eingeschlossen wurde. Nun werden die Konstanten als extern deklariert und in der zugehörigen Implementationsdatei mit ihrem Wert instantiiert. Das kann in selteneren Fällen Fehler nach sich ziehen, wenn die Werte der Konstanten bereits im Header benötigt werden.

- Bisher wurden Arraydimensionen in C++ als Differenzen der oberen und unteren Begrenzung von Bereichen angegeben. Nun wird die obere Grenze als Dimension angegeben, damit sicher gestellt ist, dass Index-Zugriffe auf das Array dessen Begrenzung nicht übersteigen.

- Viele andere Verbesserungen an verschiedenen Übersetzungsdetails.





21.12.2009 Version 1.1.0
- Im übersetzten Code werden nun Instanzen von Strukturen als automatische Variablen angelegt und als Referenzen an Funktionen übergeben. Im Gegensatz dazu werden Klassen-Instanzen weiterhin über Zeiger manipuliert.

- "array of type"-Parameter werden nun standardmäßig als Referenzen auf dynamische Arrays interpretiert.

- Die Schreibweisen der TObject-Elemente sind jetzt im Präprozessor vorgegeben. So werden die Element auf jeden Fall erkannt.

- Globale Funktionen Und prozeduren werden jetzt erkannt.

- "String" wird nun korrekt als "String" übersetzt, nicht als "AnsiString".

- In Anbetracht eines weiteren Monats Arbeit zur Verbesserung der Übersetzungsqualität wurde der Preis für Delphi2Cpp angehoben. In der Testversion wird die Übersetzung nun nach 10000 Zeichen abgeschnitten.




14.12.2009 Version 1.0.9
- Die überschriebenen Konstruktoren einer Klasse werden nun automatisch um die vollständige Liste der nicht überschriebenen Konstruktoren ergänzt.

- Eine Funktion wird nun auch korrekt übersetzt, wenn der Funktionsname selbst anstelle der vordefinierten Variable "Result" benutzt wird.

- In Aufrufen wie "foo(['hello', 'world'])" unterscheidet Delphi2Cpp nun anhand des erwarteten Parametertyps zwischen der Übergabe eines Sets und eines array of const.

- Eine Menge anderer kleiner Ergänzungen und Verbesserungen.



08.12.2009 Version 1.0.8
- Die Typerkennung von Variablen in with-Anweisungen wurde verbessert.

- Deklarationen von friend-Klassen wurden nur in Klassen mit Vorgängern eingefügt. Nun werden sie für alle Klassen innerhalb einer Unit deklariert.



06.12.2009 Version 1.0.7
- Der Fehler wurde behoben, dass der Parser die Namen der speziell behandelten VCL Funktionen nicht erkennen konnte, wenn diese auf "inherited" folgen, z.B. "inherited delete".

- Zahlen, die mit '0' beginnen, wie z.B. '0943' wurden unverändert in der C++ Code geschrieben. C++ interpretiert solche Zahlen aber oktal. Jetzt werden die führenden '0'-Zeichen entfernt.

- Der Fehler wurde behoben, dass in Exponentialzahlen Exponenten durch ein Leerzeichen getrennt wurden.

- Spezielle Parameterdeklarationen wurden verbessert:
const Args: array of const -> const TVarRec * Args, const int Args_Size
const Value -> const int Value


03.12.2009 Version 1.0.6
- Wenn bei der Deklarierung einer neuen Klasse kein Vorgängertyp angegeben wird, verwendet Delphi automatisch TObject als Vorgänger. Dies wurde nun in C++ explizit gemacht.

- An den Stellen, wo Resource-strings verwendet werden, werden sie nun durch das entsprechende Makro zum Laden der Resource ersetzt.

- Ein Fehler wurde behoben, der manchmal die Erkennung des Typs von Variablen im aktuellen Bereich verhinderte.


02.12.2009 Version 1.0.5
- Konstruktoren ohne Parameter werden nicht mehr eingefügt.
- Aufrufe von Konstruktoren der Basisklasse ohne Parameter werden im Konstruktor des abgeleiteten Klasse auskommentiert, z.B.

// inherited::Create;

- Typinformationen von überschriebenen properties werden nun ausgewertet.

- Wird die Größe eines Arrays durch einen enumerierten Typ spezifiziert, so wird sie in C++ aus dem kleinsten und dem größten der enumerierten Werte berechnet.



01.12.2009 Version 1.0.4
- Verbesserung: forward-Deklarationen von VCL-Klassen in eingeschlossenen Units wurden nicht zur Ermittlung von Zeigertypen herangezogen
- Fehlende Konstruktoren in abgeleiteten Klassen werden automatisch eingefügt, z.B.

inline __fastcall virtual TDerivedComponent(TComponent* Owner) : inherited(Owner) { }



29.11.2009 Version 1.0.3
- Behandlung von Sets weiter verbessert.
Z.B. type TIntSet = set of 1..250; -> typedef System::Set < int/* range 1..250*/, 1, 250 > TIntSet;
- Variablen werden nun in den C++-Headern als extern qualifiziert und ihre Instanzen werden in den Implementations cpp-Dateien eingefügt.



26.11.2009 Version 1.0.2
- verdoppelte pseudo forward Deklaration der Art "class classname{}" wird nicht mehr generiert
- Zuweisungen von Sets wurden verbessert.

var 
  MySet: set of 'a'..'z';  
begin 
  MySet := ['a','b','c'];
->   

typedef System::Set < char, 97, 122 > test__0;
#define test__1 ( test__0 ()
<< char ( 97 ) << char ( 98 ) << char ( 99 ) )
System::Set < char, 97, 122 > MySet;
MySet = test__1;



25.11.2009 Version 1.0.1
- Der Präprozessor führt nun Include-Directiven aus
- Un/Defines in nicht definierten Bereichen werden nicht mehr ausgeführt



17.11.2009 Version 1.0.0 veröffentlicht, Frühkäufer-Preis 58,- €






   english english

 

 
Letzte Neuigkeiten
28.10.24
Delphi2Cpp 2.5: in Groß- und Kleinschreibung mit Deklarationen übereinstimmende Symbolnamen [more...]
08/26/24
Delphi2Cpp 2.4: Aktualisiert auf RAD Studio 12.1 Athen [more...]



[aus Fallstudie...]

"Eine Meisterleistung -- Delphi2Cpp hat alle meine Erwartungen weit übertroffen."


Tony Hürlimann
virtual-optima 29.08.2011



"Ich muss mich nochmal für deinen Einsatz und die Qualität deiner Arbeit bedanken, das ist absolut überdurchschnittlich ..."


Gerald Ebner


 
Diese Homepage ist aus einfachen Texten mit [Minimal Website ]generiert.

Minimal Website
Minimal Website ist mit Hilfe des TextTransformers hergestellt.

TextTransformer
Der TextTransformer ist gemacht mit dem Borland CBuilder

  borland