Delphi7で止まっていたロートルがBerlinを触ってみた

これは [Delphi Advent Calendar 2016](http://qiita.com/advent-calendar/2016/delphi) 20日目の記事です。

[Delphi 10.1 Berlin Starter Edition](https://www.embarcadero.com/jp/products/delphi/starter/promotional-download) がリリースされ、無料でDelphiに触れることができるようになったので勢いで触ってみました。

## これまでのDelphi経験

業務アプリケーション開発でDelphi 4、Delphi 7を使用しました。HTML、CSS、JavaScriptだと3日かかる作業がDelphiだと1日で終わるというGUI開発の生産性の高さに魅了され、Delphiが世界を席巻してくれることを夢見続けています。

#### よく使っていたVCL

簡単なCRUDなら以下のVCLだけで済ませられましたね。
`TMainMenu` 、 `TActionList` 、 `TToolBar` 、 `TImageList` の組み合わせは素敵でした。

```
TPanel、TMainMenu、TActionList、TToolBar、TImageList、TLabel、TEdit、TListView
```

## 本記事の趣旨

**Delphi 10.1 Berlin** でどんなところが変わり、改善されたのかを実際にアプリケーションを開発しながらまとめてみます。ちなみに **Starter Edition** での内容です。なお、Delphi 7までで個人的に感じていたところは以下になります。

#### Delphiの良いと感じていた点

* コンパイル、起動が速い
* ビューを直接いじりながら画面デザイン、コンポーネント配置ができる
  - Shiftキー＋方向キーで1px単位で位置調整できるのは最高
* 標準のVCL、クラスライブラリだけでも十分に開発できる
* 各コンポーネントのイベントハンドラの作成、把握が容易
* 困ったら `F1` ヘルプでたいてい解決できる
* 初期Delphiの主要開発者だったアンダース・ヘルスバーグ氏が ネ申

#### Delphiの残念に感じていた点

* 有料で結構なお値段
* IDEとしてのエディット機能が貧弱
  - リファクタリングがつらい・・・
* Windowsでしか動かないし(Kylyxなんてなかった、いいね？)、Windowsのバージョンアップ対応が大変

## Delphi 10.1 Berlin の良い点

### あまり大きな違和感を感じなかった

操作感、コンパイル・起動速度は変わらずですね。
かつてのVCLも健在で以前の開発スタイルでも問題なさそうです。

![Delphi_run.gif](https://qiita-image-store.s3.amazonaws.com/0/106217/3663088b-5580-7b56-621c-9bf6a5265a0a.gif)

### エディタのフォントが充実

`Ricty` が標準で入っているのは嬉しいですね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/106217/91ea3409-1074-5e1b-b12f-51afac94cb7e.png)

### Windows 10コンポーネント

`TSplitView` や `TToggleSwitch` 、 `TSearchBox` といった今風なコンポーネントが追加されています。 `TMainMenu` から `TSplitView` を使用したメニューに切り替えるのが良さそうです。

![Delphi_menu2.gif](https://qiita-image-store.s3.amazonaws.com/0/106217/a7b5a4d7-d009-55be-2c87-dd1d9a0684b2.gif)

### FMXが利用できる

マルチプラットフォーム向けのFMX(FireMonkeyフレームワーク)が使えます！

## 残念な点・ハマった点

### 画像のインポート

`TImageList` に画像を追加したら何故か黒く潰れてしまいました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/106217/308fe730-3c72-8023-88a9-21199732f720.png)

原因は `TImageList` の `ColorDept` が初期状態だと `cdDeviceDependent` になっていたことでした。
`cd32bit` に変更したらちゃんとインポートできました。 **Starter Edition** だと `cd32bit` を選択するしかないようです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/106217/0e80510d-a7de-f1a9-0324-72b9ea9a5085.png)

### ジェネリクスの使用にはGenerics.Collectionsのインポートが必要

```delphi
unit BookUnit;

interface

uses
  System.Classes;

type
  TBook = class
  private
    FTitle: String;
    FTags: TList<String>;
  public
    constructor Create(Title: String; Tags: TList<String>);
    function GetTag: String;
  end;
```
ジェネリクスがいつのまにかにサポートされたという事で上記のようなコードを書いてみたらコンパイルが通らない？
```
[dcc32 エラー] BookUnit.pas(12): E2003 未定義の識別子 : 'TList<>'
```

`Delphi ジェネリクス` で泣きそうになりながらググっていたら `Generics.Collections` というワードを発見。uses節に追加したらコンパイルが通りました！
これはハマる人が多そうだな・・・　　　。


### リファクタリング機能、クラス補完機能が備わっていない

残念ながら **Starter Edition** にはリファクタリング機能、クラス補完機能がありませんでした。
`Ctrl + Shift + C` で実装の雛型が作成されないのは戸惑いますね。
`Ctrl + Shift + ↓` `Ctrl + Shift + ↑` で定義と実装の行き来ができないのもコーディングのリズムに大きく影響を受けました。

### Windows用の32ビットEXEしかビルドできない

Windows用の32ビットのEXEしか作成できませんでした。
でも、無料版でそれなりに動くアプリケーションを開発できるのはプログラミング初心者には良い素材に思います。

## まとめ

**Starter Edition** は機能制限はあるもののDelphiの良さを感じるには十分な内容が備わっていると思います。HTMLやCSS、JavaScriptに疲れた人やGUIに興味のあるプログラミング初心者には是非お勧めしたいですね。 **Professional** の廉価版のお手頃なライセンスが登場してくれることを祈ります。