Migrieren von Delphi-Code zu mobilen Anwendungen vom Desktop aus
Nach oben zu Gesichtspunkte für geräteübergreifende Delphi-Anwendungen
Inhaltsverzeichnis
In diesem Thema wird beschrieben, wie Sie vorhandenen Delphi-Code für die Verwendung der mobilen Delphi-Compiler migrieren:
- DCCIOS32.EXE: Der Delphi-Compiler für den iOS-Simulator
- DCCIOSARM.EXE: Der Delphi-Compiler für 32-Bit-iOS-Geräte
- DCCIOSARM64.EXE: Der Delphi-Compiler für 64-Bit-iOS-Geräte
- DCCAARM.EXE: Der Delphi-Compiler für Android, DCCAARM64.EXE: Der Delphi-Compiler für Android 64 Bit
Aktualisieren der Array-Typen
Aktualisieren Sie alle Array-Deklarationen, damit sie dynamisch sind. Verwenden Sie eine der folgenden Formen:
var x: array of Integer;
x: TArray<Integer>;
Manchmal muss eine Struktur (Record) mit einer externen Funktion übergeben werden, und die Struktur enthält ein in einer bestimmten Länge deklariertes Array. Dies gilt insbesondere für Zeichen-Arrays, die in der Struktur selbst deklariert sind. In diesem Fall und nur in diesem Fall ist Folgendes zulässig:
type
rec = record
Flags: Integer;
Chars: array[MAX_PATH] of Char;
end;
Wenn eine externe Funktion ein Array direkt übernimmt, verwenden Sie stattdessen ein dynamisches Array. Für UTF8-Zeichen-Arrays:
- Um aus UTF8 zu konvertieren, verwenden Sie TBytes zusammen mit System.SysUtils.TEncoding.GetString(Bytes).
- Um nach UTF8 zu konvertieren, verwenden Sie TBytes zusammen mit System.SysUtils.TEncoding.GetBytes(S).
Verwenden eines Funktionsaufrufs in einem "try-except"-Block zur Vermeidung von nicht abgefangenen Hardware-Exceptions
Bei Compilern für iOS-Geräte können except
-Blöcke nur eine Hardware-Exception abfangen, wenn der try
-Block einen Methoden- oder Funktionsaufruf enthält. Dieser Unterschied steht im Zusammenhang mit dem LLVM-Backend des Compilers, das nicht zurückkehren kann, wenn keine Methode/Funktion im try
-Block aufgerufen wird.
Folgendes Beispiel zeigt, wie ein try-except
-Block aufgebaut sein muss, damit er eine Hardware-Exception abfangen kann:
var
P: ^Integer = nil;
procedure G1;
begin
P^ := 42;
end;
begin
try
G1;
except
writeln('Catch:G1 - pass');
end;
end.
Selbst wenn ein Quellcodeblock so aussieht, als ob er einen Funktionsaufruf enthält, könnte das nicht der Fall sein, wenn die Funktion inline ist. Zu der Zeit, zu der LLVM die Maschinenanweisungen erzeugt, ist der Inlining-Prozess bereits aufgetreten und in dem try-Block befindet sich kein Funktionsaufruf mehr.
Verwenden von intrinsischen unteilbaren (atomic) Funktionen anstelle der Assembly-Sprache
Der integrierte Assembler wird von den mobilen Delphi-Compilern nicht unterstützt. Wenn Sie Speichervariablen funktional unteilbar (atomic) austauschen, vergleichen und austauschen, inkrementieren und dekrementieren müssen, können Sie die neuen intrinsischen "Atomic"-Funktionen verwenden.
Mit unteilbaren (atomic) Operationen werden primitive, blockierende Multithreaded-Klassen implementiert, und diese Operationen stellen die primitiven Klassen bereit, die für die Implementierung von sogenannten "nicht-blockierenden" Strukturen erforderlich sind. Diese Art von Operationen werden als Standardfunktionen oder "intrinsische" Funktionen implementiert.
In plattformübergreifenden Anwendungen können intrinsische unteilbare (atomic) Funktionen innerhalb von {$IFDEF} für AUTOREFCOUNT oder NEXTGEN bedingt verwendet werden.
Intrinsische unteilbare (atomic) Funktionen
Die folgenden intrinsischen unteilbaren (atomic) Funktionen werden von den mobilen Delphi-Compilern unterstützt:
Automatische Referenzzählung
Die mobilen Delphi-Compiler (DCCIOS32, DCCIOS32ARM und DCCAARM) verwenden die automatische Referenzzählung (ARC, Automatic Reference Counting) für Klassen. Dies unterscheidet sich von dem Schema, das von den Delphi-Desktop-Compilern (DCC32, DCC64 und DCCOSX)verwendet wird. Alle Delphi-Compiler unterstützen jedoch ARC für Interfaces, Strings und dynamische Arrays, daher erweitern die mobilen Delphi-Compiler ARC eigentlich lediglich für Klassen. ARC umfasst die automatische Speicherverwaltung und -freigabe.
- Hinweis: Bei Delphi-Compilern, die ARC unterstützen, können Objektinstanzen, die aufeinander verweisen, Arbeitsspeicher sperren, ohne dass eine dieser Referenzen als schwache Referenz gekennzeichnet wird.
Weitere Informationen zu ARC und schwachen Referenzen finden Sie unter:
Siehe auch
- DCCIOSARM.EXE: Der Delphi-Compiler für 32-Bit-iOS-Geräte
- DCCIOSARM64.EXE: Der Delphi-Compiler für 64-Bit-iOS-Geräte
- DCCAARM.EXE: Der Delphi-Compiler für Android
- DCCAARM64.EXE: Der Delphi-Compiler für Android 64 Bit
- Mobile-Tutorials: Mobile Anwendungsentwicklung (iOS und Android)
- Codefragmente für die mobile Entwicklung
- System.SysUtils.TStringHelper
- System.SysUtils.TStringBuilder
- Nullbasierte Strings (Delphi-Compiler-Direktive)
- Migrieren von C++-Code von Desktop- zu mobilen Anwendungen