Delphi
RadStudio
C++builder
FireMonkey

Delphi 10.3 Rio リリース

Delphi 10.3 Rio

2018/11/22 AM 01:00 (JST) に最新の Delphi 10.3 Rio(でるふぁい じゅってんさん りお)がリリースされました。

この記事では大きな変更があった IDE と言語機能の変更について述べていきます。

全ての新機能については、下記をご覧下さい。

Delphi 10.3 新機能

インストール~起動まで

今回は IDE の大規模な改修が入ったので、インストールから起動までの画面を見てみます。

インストーラー(オフラインインストーラー)

image.png

インストーラーは下記の2種類あります。

  • GetIt インストーラー
  • Offline インストーラー

GetIt インストーラーはクラウドベースのインストーラーで必要なファイルをダウンロードしてインストールします。
オフラインインストーラーは ISO ファイルで提供され、必要なファイルを ISO イメージから読み出してインストールします。
ネットにアクセスしないのでオフラインインストーラーの方が早そう、という予想に反し、GetIt インストーラーの方が高速です1

にも関わらず、僕が好んでオフラインインストーラーを使うのは、過去バージョンを保存しておけるためです。

スプラッシュ

image.png

スプラッシュの画像はあまり変わり有りませんね。

テーマ選択

image.png

ライトテーマとダークテーマは修正が入り、ライトテーマは薄い青(#E7EFF5)がベースになり、ダークテーマも青みがかった黒(#36414A)がベースになりました。

パーソナライズ

image.png

こちらも以前と変わり有りませんね。

起動直後の IDE

image.png

Tokyo のダークテーマより見やすくなったと思います。
色以外だと「デスクトップの配置」がタイトルバーに表示されるようになっているのが大きな変更箇所でしょうか。

image.png

一番左のウィンドウに三日月が付いているアイコンには、デスクトップの配置を保存したり、テーマを切り替えたりといった機能が纏められています。

タブ

タブの見た目もフラットな見た目に変更されています。
例えば、Classic デスクトップのコンポーネントパレットのタブなどです。

image.png

コードエディタ

image.png

個人的についに!と思ったのがここ。
プロパティがちゃんとあるべき場所であるコンテキストメニューの一番最後に移動しました。
それ以外については大きな変更は無さそうです。

オプション

image.png

オプション画面はこのような感じで全体的にモダンな見た目になっています。
灰色で影がつくようなデザインから、Windows 10 の Modern UI テイストになっています。

プロジェクトオプション

image.png

プロジェクトオプションも変更され、すっきりとした見た目になっています。
また、一部で言われていた Windows 用の設定なのに icns 指定ができる macOS 用設定なのに ico が指定できるといったことも改称されています。

image.png
image.png

GetIt

image.png

GetIt も今までのアイコンが並んでいるスタイルから、アイコンと説明部が並ぶスタイルに変わりました。
非常にわかりやすくなりました。

バージョン情報

image.png

現時点での 10.3 Rio のバージョンは 26.0.32429.4364 となっています。
パッチやマイナーバージョンアップで、このバージョンは変わっていきます。

DocWiki

DocWiki も全体の雰囲気に合わせてデザインが変更されています。

RAD Studio Rio ヘルプ

言語の変更箇所

ここからは言語に関する変更を見ていきます。
Object Pascal に大きな変更が加わっています。

インライン変数宣言

なんと言ってもまずはコレ。

procedure Foo;
begin
  var A: Integer;
  A := 0;
end;

と、こんな風に変数宣言ブロック無しでいきなり変数を宣言できるようになりました。
さらに

procedure Foo;
begin
  var A: Integer := 0;
end;

と、宣言と初期化を一緒にできます。
ここで、注意したいのは

procedure Foo;
begin
  var A: Integer := 0; // OK
  var B: Integer = 0;  // NG
end;

と、大域変数の宣言方式ではなく := が必要になるところです。
恐らくこれは後述の型推論による型宣言を省略したときに代入の一貫性を持たせるためだと思われます。

インライン宣言された変数のスコープはブロック(begin end や repeat until など)毎のスコープになります。

procedure Foo;
begin
  // 複文でスコープを設定する
  begin
    var A: Integer := 0;
  end;

  // この位置では A は見えない。
  Writeln(A); // NG
end;

ちなみに、TIntefacedObject を利用したインターフェースの自動開放もブロックスコープ毎になります。

type
  IBar = interface
    procedure Hello;
  end;

  TBar = class(TInterfacedObject, IBar)
  public
    procedure Hello;
  end;

{ TBar }

procedure TBar.Hello;
begin
  Writeln('Hello, Rio !');
end;

procedure Foo;
var
  i: Integer;
begin
  begin
    var B: IBar := TBar.Create;
    B.Hello;
  end; // B はここでリリースされる
end;

さらに今までの変数ブロック方式では絶対に無理だった型推論も搭載されました。
↓こんな風に右辺値から左辺の型を推論し型を決定してくれます。

procedure Foo;
begin
  var A := 20; 
  var B := TList<String>.Create;
  try
    B.Add('Bar');
  finally
    B.DisposeOf;
  end;
end;

型推論が威力を発揮するのは for to do / for in do ループです。
インデックスにわざわざ型を指定しなくても良くなります。
特に Dictionary では TPair を指定するのが面倒だったため非常に有用ですね

procedure Foo;
begin
  var D := TDictionary<String, Integer>.Create;
  try
    D.Add('Bar', 0);

    // 型を省略
    for var Item in D do
      Writeln(Item.Key, ' = ',  Item.Value);
  finally
    D.DisposeOf;
  end;

  // 型を省略
  for var i := 0 to 10 do
    Writeln(i);
end;

ただし、TDictionary については for-in 文の前に別の for 文があると推論が上手くいかずに実行時エラーになるため、型を指定してあげなくてはならないようです(RSP-21632)。

ARC 廃止

現状では、Linux 向けコンパイラのみ Windows コンパイラと同じメモリ管理モデルに戻ったとのことですが、将来的には全てのコンパイラで ARC が廃止される予定になっています。

これは VCL や FMX の Owner モデルと都合が悪かったり、メモリモデルが2種類(ARC と非 ARC)となるとコードが煩雑になる、自動的に挿入される解放コードによって実行速度が遅くなる、といった複数の問題に直面したため、ARC を廃止するという方向になったようです。

例えば、以下のようなコードは

ARCが有効な場合
procedure Foo;
var
  P: TObject;
begin
  P := TBar.Create;
  // なにか処理
end;
// ここを抜けると P が廃棄される

下記の様に普通に生成と破棄をセットにして書き直さねばなりません。

ARCが無効の場合
procedure Foo;
var
  P: TObject;
begin
  P := TBar.Create;
  try
    // なにか処理
  finally
    P.DisposeOf;
  end;
end;

勘違いしないで欲しいのですが TInterfacedObject を使った参照カウント管理の仕組みは生きています。
つまり、TOCImport や TJavaImport は TInterfacedObject を継承しているため各 OS の API にアクセスするコードはそのまま有効です。

Linux での Ansi 文字列のサポート

Windows と同等のコンパイラになったという副作用から AnsiString, AnsiChar が使えるようになっています。
ただし、使えるようになっただけで、通常の String (UnicodeString) が推奨なのは言うまでもありません。

ちなみに、今までは下記の様なコードで変換していました(iOS / Android は今でも同じです)。

var
  M: TMarshaller;
  P: TPtrWrapper;
begin
  P := M.AsAnsi('UnicodeString'); // TPtrWrapper に変換され
  Bar(P.ToPointer) //ToPointer メソッドで Ansi 文字列へのポインタがとれる
end;

Managed Record

10.3 Rio でサポートされる予定だった "Managed Record" に関しては今回は見送りとなりました。
10.4 以降でサポートされる予定だそうです。

Deferring Delphi Managed Records Support

その他

C++Builder

C++Builder 側では C++17 に対応したりデフォルトコンパイラが Clang ベースの物になるなど大きく進化しました。

VCL

VCL では、高 DPI サポートが強化されました。
また、 Win32 API, WinRT API が更新されました。

FMX

FMX は Android API 26 に対応し、Google Play の新しい要件をクリアできるようになりました。
iOS12, macOS Mojave もサポートされました。
Android では、Android Z オーダーサポートや、一部のコントロールではネイティブコントロールがサポートされました。
個人的に嬉しいのは新設された TPermissionsService クラスによって統合的にアクセス許可を得られるようになったことです。

RTL

RTL の変更点は主にスピードアップです。
TStringHelper や JSON の処理、TList, TMemIniFile などがスピードアップされています。

まとめ

駆け足になりましたが、IDE と言語機能について紹介しました。
Rio は思ったよりも大きな変更になりました。
今後も Delphi を発展させるための礎を築いたのかな、と感じています。
引き続き Community Edition も提供されていますし、今後の発展を願ってやみません!


  1. GetIt インストーラーができたのはエンバカデロ・テクノロジーズの社長であるアタナス・ポポフ氏がインストーラー遅いから速いの作れや!ってなってできた物です。なので速いのです。