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

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