Migrieren von Delphi-Code zu mobilen Anwendungen vom Desktop aus

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Gesichtspunkte für geräteübergreifende Delphi-Anwendungen


In diesem Thema wird beschrieben, wie Sie vorhandenen Delphi-Code für die Verwendung der mobilen Delphi-Compiler migrieren:

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:

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