デスクトップ アプリケーションからモバイル アプリケーションへの Delphi コードの移行

提供: RAD Studio
移動先: 案内検索

Delphi におけるマルチデバイス アプリケーションについての考慮事項 への移動


このトピックでは、Delphi モバイル コンパイラを使用できるように既存の Delphi コードを移行する方法を説明します。


配列型を更新

すべての配列宣言を更新して動的配列にします。 以下のいずれかを使用します。

var x: array of Integer;
x: TArray<Integer>;

特定の長さで宣言された配列が含まれている構造体(レコード)を外部関数に渡さなければならない場合があります。これは、構造体の内部で "直接" 宣言された文字配列の場合に特に当てはまります。このような場合に限り、以下の宣言が可能です。

type
   rec = record
    Flags: Integer;
    Chars: array[MAX_PATH] of Char;
  end;

外部関数が配列を直接引数にする場合は、代わりに動的配列を使用します。 UTF8 文字配列の場合:

try-except ブロックで関数呼び出しを使用してハードウェア例外が必ず捕捉されるようにする

iOS デバイスのコンパイラでは、try ブロックにメソッドまたは関数の呼び出しが含まれている場合にのみ、except ブロックでハードウェア例外を捕捉できます。 これは、コンパイラの LLVM バックエンドに関係する相違点です。このバックエンドでは、try ブロックでメソッド/関数が呼び出されない場合は戻ることができません。

たとえば、ハードウェア例外を捕捉できる try-except ブロックの構成方法は以下のとおりです。

var
  P: ^Integer = nil;

procedure G1;
begin
  P^ := 42;
end;

begin
  try
    G1;
  except
    writeln('Catch:G1 - pass');
  end;
end.

インライン関数の場合は、たとえソース コード ブロックに関数呼び出しが含まれているように見えても、実際はそうではない可能性があります。LLVM でマシン命令が生成される時までにはインライン化処理が既に行われており、try ブロック内にはもう関数呼び出しは含まれていません。

アセンブリ言語ではなくアトミック組み込み関数を使用

Delphi モバイル コンパイラでは、組み込みアセンブラをサポートしていません。 メモリ値の交換、比較および交換、インクリメント、デクリメントをアトミックに行う必要がある場合は、新しいアトミック組み込み関数を使用できます。

アトミック操作は、マルチスレッド ロック プリミティブを実装するのに使用され、いわゆる "ロックフリー" 構造の実装に必要なプリミティブを提供します。必要な操作は、標準関数または "組み込み" 関数として実装されます。

マルチプラットフォーム アプリケーションでは、アトミック組み込み関数を AUTOREFCOUNT か NEXTGEN の条件シンボルのどちらかの {$IFDEF} 内で使用できます。

アトミック組み込み関数

Delphi モバイル コンパイラでサポートされているアトミック組み込み関数は以下のとおりです。

自動参照カウント

Delphi モバイル コンパイラ(DCCIOS32、DCCIOS32ARM、DCCAARM)では、クラスの自動参照カウント(ARC)を使用していますが、これは、Delphi デスクトップ コンパイラ(DCC32、DCC64、DCCOSX)で使用されている参照カウント方式とは異なります。 ただし、すべての Delphi コンパイラではインターフェイス、文字列、動的配列の ARC をサポートしているため、事実上、Delphi モバイル コンパイラでは ARC をクラスにまで拡張しているにすぎません。 ARC には、メモリの自動的な管理および破棄が組み込まれています。

メモ: ARC をサポートしている Delphi コンパイラの場合、互いに参照し合うオブジェクト インスタンスは、参照の一方に弱い参照の属性を付けなければ、メモリを事実上ロックするおそれがありま

ARC と弱い参照の詳細については、下記を参照してください。

関連項目