t2t-soft

01.09.2026

Delphi2C# 2.8.0


Überarbeitete Zeigersimulation

Mit dem aktuellen Update erhält Delphi2C# eine grundlegend überarbeitete Zeigersimulation. Sie unterstützt typische Delphi-Konstrukte wie Pointer, typisierte Zeiger, PChar, GetMem, FreeMem, Move, FillChar, Record-Zeiger und Zeigerarithmetik.

Die Zeigertypen sind als kleine C#-Structs umgesetzt. Dadurch verhalten sich Zeigerzuweisungen Delphi-näher: Kopierte Zeiger besitzen eine unabhängige Position, verweisen aber weiterhin auf denselben zugrunde liegenden Speicher.

Alle Zeigertypen verwenden ein gemeinsames Speichermodell. Der zugrunde liegende Speicher kann zum Beispiel ein verwaltetes Array, ein dynamisches Array, ein explizit angelegter Speicherbereich, eine von anderer Stelle verwaltete Adresse oder ein UTF-16-Zeichenpuffer sein. Konvertierungen zwischen Pointer, Pointer<T>, UntypedPointer und PChar erzeugen dabei normalerweise keine Kopie der Daten.

Für jede Zeigerart ist eindeutig festgelegt, wie weit sich der Zeiger bei arithmetischen Operationen bewegt:

  • Pointer und UntypedPointer bewegen sich byteweise.
  • Pointer<T> bewegt sich elementweise.
  • PChar und PWideChar bewegen sich zeichenweise.

Auch die Speicherverwaltung wurde vereinheitlicht. Speicherbereiche, die mit GetMem oder vergleichbaren Funktionen angelegt wurden, werden mit FreeMem freigegeben. Kopierte Zeiger werden dadurch nicht zu zusätzlichen Besitzern desselben Speichers.

Move und FillChar arbeiten konsequent mit Byteanzahlen, unterstützen sowohl Array-Speicher als auch explizit angelegte Speicherbereiche und führen Bereichsprüfungen durch, sofern die Größe des Speicherbereichs bekannt ist. Move berücksichtigt außerdem überlappende Speicherbereiche.

PChar unterstützt nicht kopierende Ansichten auf char[]-Puffer sowie schreibgeschützte Ansichten auf C#-Strings. Da C#-Strings unveränderlich sind, werden für schreibbare Stringoperationen explizite Zeichenpuffer verwendet.

Die aktualisierte Zeigersimulation ist ein fester Bestandteil der von Delphi2C# erzeugten Laufzeitunterstützung und bildet die Grundlage für die Übersetzung zeigerbasierter Delphi-Routinen nach C#.

Die Verwendung der Zeigersimulation ist nun obligatorisch, nicht mehr optional. (Auch weitere obsolete Optionen wurden entfernt.)


Verbesserte Unterstützung für TObject und TClass

Delphi2C# verwendet jetzt ein überarbeitetes Laufzeitmodell für 'TObject' und 'TClass'.

Delphi-Destruktoren werden nicht mehr nur als C#-Finalizer erzeugt, sondern als virtuelle 'Destroy()'-Methoden übersetzt. 'Free()' ruft diese Methode direkt auf und bildet damit das Delphi-Verhalten zuverlässiger nach. Zusätzlich gibt es eine null-sichere Hilfsfunktion 'TObject.Free(obj)', damit auch Delphi-Code wie 'Obj.Free' korrekt übersetzt werden kann, wenn 'Obj' den Wert 'nil' haben kann.

Auch 'TClass' wurde verbessert. Delphi-Klassenreferenzen werden nun als Laufzeit-Metaklassenwerte dargestellt. Dadurch funktionieren Operationen wie 'ClassType', 'ClassName', 'ClassParent', 'InheritsFrom' und das Erzeugen von Objekten über Klassenreferenzen einheitlicher und mit weniger zusätzlichem Code in den erzeugten Klassen.

Diese Änderungen verbessern die Kompatibilität bei Objektlebensdauer, Klassenreferenzen, Metaklassenvergleichen und Factory-Code.


Überarbeitete RTL-Units und verbesserte Zeigerkompatibilität

Die übersetzte System.SysUtils Unit wurde umfassend überarbeitet. Ein Schwerpunkt liegt auf der Kompatibilität mit der ebenfalls aktualisierten Zeigersimulation sowie auf der verbesserten Unterstützung für TObject und TClass.

Die Zeigersimulation dient dabei vor allem als Kompatibilitätsschicht für übersetzten Delphi-Code. Intern verwenden die überarbeiteten RTL-Klassen, soweit möglich, optimierten reinen C#-Code und verwaltete .NET-Datenstrukturen. Dadurch bleibt die Delphi-typische Schnittstelle erhalten, ohne unnötig zeigerbasierte Abläufe innerhalb der Runtime nachzubilden.

Neben System.SysUtils wurden auch die übersetzten Klassen aus System.Classes und System.Generics.Collections überarbeitet. Dazu gehören unter anderem Verbesserungen an Listen, generischen Collections, Enumeratoren, Dictionaries und objektbesitzenden Containern.


18.05.2026

Delphi2C# 2.7.0

Es gibt keine C#-spezifischen Verbesserungen. Lediglich Fehler im gemeinsamen Quellcode der verschiedenen Delphi-Konverter wurden hier ebenfalls behoben.


18.11.2025

Delphi2C# 2.6.0

Das neue Update 2.6.0 von Delphi2C# bringt zahlreiche Verbesserungen
bei der Übersetzung von Interface-bezogenem Delphi-Code nach C#.

Highlights:

1. Bessere Unterstützung für Delphi-Interfaces ohne GUID
  • Interfaces ohne explizit angegebene GUID werden nun als reguläre .NET-Interfaces behandelt.
  • Optional können Platzhalter-GUIDs erzeugt werden, um Supports(...) semantisch abzubilden.
2. Verbesserte Umsetzung von `as` und `is`
  • Der Delphi-Operator `as` wird nun nicht mehr durch den C#-Operator as` umgesetzt, sondern durch einen direkten Typ-Cast. Dies entspricht dem Verhalten in Delphi präziser.
  • Der 'is'-Operator wird 1:1 nach C# übersetzt.
  • Die Funktion `Supports(...)` wird weiterhin bei entsprechender Delphi-Verwendung übersetzt und verwendet.
3. Interface-Übersetzung
  • Neue Dummy-Klasse TInterfacedObject
  • Zur Kompatibilität mit Delphi-Klassenhierarchien wird standardmäßig eine .NET-zentrierte Version von TInterfacedObject generiert. Diese enthält optionale Methoden wie AddRef() und Release(), um Übersetzungsfehler zu vermeiden.

Wichtiger Hinweis:

COM-Kompatibilität bleibt in Delphi2C# intern und experimentell. Das Tool erzeugt reine .NET-kompatible C#-Übersetzungen. Eine vollwertige COM-Interop wird nicht angestrebt.




28.10.2024

Delphi2C# 2.5.0

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:

public void DisplayInfo(string name)
{
  Console.WriteLine("Parameter Name: " + name);
  Console.WriteLine("Property Name: " + this.name);
  Console.WriteLine("Constant Name: " + casesensitivity.casesensitivityInterface.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:

public void DisplayInfo(string NAME)
{
  Console.WriteLine("Parameter Name: " + NAME);
  Console.WriteLine("Property Name: " + this.Name);
  Console.WriteLine("Constant Name: " + casesensitivity.casesensitivityInterface.name);
}

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


19.10.2023
Delphi2C# 2.3
Konvertierung von DFM-Dateien nach C++

- Übernahme des Features von Delphi2Cpp zur Konvertierung des Codes von DFM-Dateien. Dieser 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. Delphi2C# 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 Delphi2C# so konfiguriert werden, dass es solche benutzerdefinierten Funktionen aufruft. Diese Konvertierung des DFM-Codes die unerlässliche Brücke zur Verwendung von C# GUI Bibliotheken.

mehr Details zur DFM-Konvertierung
31.01.2023
Delphi2C# 2.2
Erleichterte Ü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
  • Die Verwendung der Zeiger-Simulation ist nun optional
  • Eine Datei mit globalen usings Directiven kann nun erzeugt werden
  • Vereinheitlichung von String- und Zeichenkonstante (beide als Strings)
  • Destruktoren werden entfernt
  • Bezeichner können durch komplexe Ausdrücke ersetzt werden

04.02.2020 Dokumentation aktualisiert
16.10.2019 Delphi2C# beta Angebot


   English English


 
Letzte Neuigkeiten
01.09.26
Delphi2C# 2.8.0: Grundlegend überarbeitete Zeigersimulation [mehr...]

18.05.26
Delphi2C# 2.7.0: Übersetzungsheuristiken [mehr...]



"Allses in allem sind wir sehr zufrieden mit Delphi2C#."


Henk van der Meer
Innomeer 02.02.2023

 
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 C++Builder

  Borland