Delphi XE5のFMXアプリを12.3に移行する

## はじめに
2013年にDelphiのFMXで書いたソースコードを久々に12.3で開こうとしたら，エラーで落ちてしまいました。
2013年というと使ったのはXE5ではないかと思います。
その間全く触らず，移行の用意をしてこなかったことを反省しました。
そのことをぼやいていたら，細川様に，「まず，FMXファイルを見直すといい。」と教えていただいたので，やってみました。
この記事は，その記録です。

なお，今回開こうとしたソースコードは，データベース機能を使っておりません。
BDEを使っていたらもっと大変なのではないかと思います。

## フォーム(FMXファイル)の修正
IDEで，プロジェクトファイルを開き，表示されるエラーを見ていると，フォームに張り付けられたコンポーネントのプロパティの値が正しくないようなので，DockWikiを見ながら，修正しました。

https://docwiki.embarcadero.com/RADStudio/Athens/ja/Main_Page

私のプロジェクトで見つかった修正点は以下の通りです。
最初に表示されるフォームの修正をするのにはいったんキャンセルしてプロジェクトファイルを読み直す必要がありました。編集には外部のテキストエディタを使いました。
それ以外のフォームはプロジェクトを読み込んでから，対象のフォームを開こうとするとエラーが表示されますので，ソースコードを自動で書き換えず，外部のテキストエディタを使いました。

- Position(FMX.Forms.TForm.Position) = poScreenCenter → ScreenCenter
- FormFactor.Devices(FMX.Forms.TFormFactor.Devices) = [dkDesktop] → [Desktop]
- Align(FMX.Controls.TControl.Align) = alLeft → Left
- Align(FMX.Controls.TControl.Align) = alTop → Top
- Align(FMX.Controls.TControl.Align) = alClient → Client
- LightType(FMX.Types3D.TLightType) = ltDirectional → Directional
- ValueType(FMX.Text.TNumValueType) = vtFloat → Float 
- KeyboardType(FMX.Edit.TCustomEdit.KeyboardType) = vktDefault → Default
- StyledSettings(FMX.Controls.TTextControl.StyledSettings) = [ssFamily, ssSize] → [Family, Size]
- TextAlign(FMX.Controls.TTextControl.TextAlign) = taCenter → Center
- Orientation(FMX.StdCtrls.TScrollBar.Orientation) = orHorizontal → Horizontal
- BorderStyle(FMX.Forms.TCommonCustomForm.BorderStyle) = bsSingle → Single

エラーが出ているところがわかれば，定数の先頭の小文字の部分を削除すればいいことがわかります。
でも，定数で先頭の小文字が残っているものもあるのでむやみに取らないようにします。

## ユニットの追加
フォームの修正で読み込めたのですが，ソースコードにはエラーがいっぱい出ていました。
コントロールが書かれたユニットが変更されているので，それから直すことにしました。
interface または imprementation のどちらかのuse節に追加します。

|クラス名  |追加するユニット名|
|---------|--------------|
|TBitmap  | FMX.Graphics |
|TCanvas  | FMX.Graphics |
|PAlphaColorRecArray| FMX.Utils |
|TPoint3D | System.Math.Vectors |
|TPolygon | System.Math.Vectors |
|TSpinBox | FNX.SpinBox |

## コード内定数の修正
コードでも，プロパティの定数を触っていましたので，以下のものを修正しました。
フォームで指定しているケースもあると思います。
- TMapAccess.maWrite → TMapAccess.Write
- TMapAccess.maRead → TMapAccess.Read
- TMapAccess.maReadWrite → TMapAccess.ReadWrite

## プロパティ名の修正
利用しているコントロールのプロパティ名が変わっているものもありました。
- StrokeThickness → Stroke.Thickness
- StrokeDash → Stroke.Dash
- TBrushKind.bkSolid → TBrushKind.Solid
- TTextAlign.taCenter → TTextAlign.taCenter
- TFillTextFlag.ftRightToLeft → TFillTextFlag.ftRightToLeft
- TStrokeDash.sdDot → TStrokeDash.Dot

## メソッドの引数の変更
DocWikiも修正されていないのですが，TBitmap.LoadFromFileのRotateパラメータが削除されています。ですので
```delphi:XE5 (FMX.TBitmap.LoadFromFile)
Bitmap.LoadFromFile(AFileName, ARotate);
```
は，以下のように書き直しました。
```delphi:12.3 (FMX.TBitmap.LoadFromFile)
Bitmap.LoadFromFile(AFileName);
if ARotate<>0 then begin
  Bitmap.Rotate(ARotate);
end;
```

https://docwiki.embarcadero.com/Libraries/Athens/ja/FMX.Graphics.TBitmap.LoadFromFile

## イベント処理の修正

OnDragOverイベントの引数が以下のように変わっています。当するイベントを持つソースファイルを編集すると警告が出ますが，編集しないとコンパイルはできてしまいます。
```delphi:XE5
procedure XXXDragOver(Sender: TObject; const Data: TDragObject;
  const Point: TPointF; var Accept: Boolean);
```  
```delphi:12.3
procedure XXXDragOver(Sender: TObject; const Data: TDragObject;
  const Point: TPointF; var Operation: TDragOperation);
```
XE5で，AcceptがFalseならOperationをNoneにし，Trueなら状況に応じてMove, Copy, Linkを設定します。

※ 他にもイベントの引数が変わっているものがあるかもしれません。その時には該当のイベントを一旦コメントアウトして，フォーム編集で新たに作成すると移行が簡単かもしれません。

これで移行ができました。

## おわりに

私の場合はこれで済みましたが，以下の情報も有益でした。

FMX のすべての廃止予定の項目(既に廃止されたものも含む)がDocWikiにまとめられています。

https://docwiki.embarcadero.com/Libraries/Athens/ja/%E5%BB%83%E6%AD%A2%E4%BA%88%E5%AE%9A%E3%81%AE%E6%A9%9F%E8%83%BD

また，DocWikiにあるヘルプの新機能から使えなくなった機能を調べる手もあるかもしれません。

https://docwiki.embarcadero.com/RADStudio/Athens/ja/Help_of_Previous_Versions

## 謝辞
移行のアドバイスをしていただいた細川様ありがとうございます。
アドバイスをいただかなかったらあきらめて一から書き直していたと思います。感謝です。

FMXだから，以降にそんなに手間取るとは思っていませんでしたが，長い月日の間に進化しているんですね。勉強になりました。(この程度で済んだといえるのかもしれませんが，，)
今後はDelphiをバージョンアップしたら古いコードに変更が必要かをチェックする時間を取ろうと思います。