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:
- 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
Beim Compiler 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 inlined ist. Das liegt daran, dass zu dem Zeitpunkt, an dem LLVM Maschinenanweisungen erzeugt, der Inlining-Prozess bereits stattgefunden hat und sich im try-Block kein Funktionsaufruf mehr befindet.
Verwenden von intrinsischen unteilbaren (atomic) Funktionen anstelle der Assembly-Sprache
Der integrierte Assembler wird von den mobilen Delphi-Compilern nicht unterstützt. Sie können die neuen intrinsischen "Atomic"-Funktionen verwenden, wenn Sie Speicherwerte unteilbar austauschen, vergleichen und austauschen, inkrementieren und dekrementieren müssen.
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 wird als Standardfunktionen oder "intrinsische" Funktionen implementiert.
In plattformübergreifenden Anwendungen können je nach Zielplattform intrinsische "Atomic"-Funktionen innerhalb von {$IFDEF} verwendet werden.
Intrinsische unteilbare (atomic) Funktionen
Die folgenden intrinsischen unteilbaren (atomic) Funktionen werden von den mobilen Delphi-Compilern unterstützt:
Siehe auch
- 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