3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

はじめに

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

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

フォーム(FMXファイル)の修正

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

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

  • 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パラメータが削除されています。ですので

XE5 (FMX.TBitmap.LoadFromFile)
Bitmap.LoadFromFile(AFileName, ARotate);

は,以下のように書き直しました。

12.3 (FMX.TBitmap.LoadFromFile)
Bitmap.LoadFromFile(AFileName);
if ARotate<>0 then begin
  Bitmap.Rotate(ARotate);
end;

イベント処理の修正

OnDragOverイベントの引数が以下のように変わっています。当するイベントを持つソースファイルを編集すると警告が出ますが,編集しないとコンパイルはできてしまいます。

XE5
procedure XXXDragOver(Sender: TObject; const Data: TDragObject;
  const Point: TPointF; var Accept: Boolean);
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にまとめられています。

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

謝辞

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

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

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?