C++Builder Starter (無料版)

<img width="887" alt="スクリーンショット 2018-03-02 11.13.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/5d4b72c6-b10d-9020-2a70-88e61f82b146.png">

追記：2018年07月18日から、pro版相当の機能が使えるCommunity Editionが配布されました。
https://www.embarcadero.com/jp/products/cbuilder/starter

無料版はWindows32bitしか開発出来ませんが、C++を使った開発が出来るツールです。
以前に[独断と偏見で　Visual C++ vs C++Builder - Qiita](https://qiita.com/mm_sys/items/912d7ae258c9beee69cf)という記事を書いています。

~~ちなみに、iOSとAndroidはProfessionalとMobileAddOnパッケージを購入しないといけないので20万近く~~ ~~20万円以上かかります。~~
現在はProfessional版だけでモバイル開発出来るようです。
C++Builder 10.2.3からProfessional版には標準でモバイル開発機能が搭載されました。
Linuxはさらに高額なEnterprise以上のエディションじゃないと開発出来ません。

## ダウンロードとインストール

ダウンロードにはユーザー登録の手続きが必要です。

[C++Builder Starter - Embarcadero Website](https://www.embarcadero.com/jp/products/cbuilder/starter)

手続きが終わるとメールでSerial Number等が書かれたものが送られてきて、そこにあるURLからでもダウンロード出来るので、それを実行してインストール作業をします。

![0.anv8co0tgru.jpg](https://qiita-image-store.s3.amazonaws.com/0/76058/6857925f-c435-6452-a2a5-29e3bdf76348.jpeg)

インストールが完了すると、windows software development kitのインストールが開始されるので、インストールしてください。

![0.2kmpwi9sab7.jpg](https://qiita-image-store.s3.amazonaws.com/0/76058/78af86f5-d291-c6aa-5656-8d732430912a.jpeg)

## 最初にしておきたい設定

### テーマ

10.2.2からツールの色合いが変更かのうになりました。濃色にしてますが、本バージョンからの追加だからか、一部色がおかしなことになりますし、一旦描画してから色を変えている感じがしてチラツキがありますので、淡色の方が最初は良いかもしれません。

<img width="680" alt="0.bvxsisoeys8.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/2590acd2-fb07-4088-92bb-7c5ae351a302.png">

### 支援機能

C++BuilderはVisual Studioに比べて非常に重たいと思います。特に、入力支援機能関係でものすごくディスクアクセスが発生している感じがします。
ですので、入力支援機能は切ったほうが良いです。
切ったとしても、任意で支援機能を使うことが出来ます。
**ツール->オプション** から
**エディタ設定->支援機能**
で、どうしても必要な機能以外はチェックを外します。

<img width="709" alt="0.cn1pu8yyc7u.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/033e535a-0e0b-c344-a692-c11c6224d61f.png">

#### 任意で支援機能を使う。

コード入力中に**ctrl + スペース**で任意のタイミングで支援機能を使えます。

## 試しに書類を作る

### FMXとVCL

C++Builder(と、Delphi)は、GUIのフレームワークとしてFireMonkey(FMX)とVCLがあります。
VCLは昔からあるWindows用のフレームワークで、FMXは新しいマルチプラットフォーム用のフレームワークです。
今回はStarterですので、どっちにしても32bitしか開発出来ないのでどっちでもいいですが、せっかくなのでFMXで開発してみましょう。
**ファイル->新規作成->マルチデバイスアプリケーション**

<img width="590" alt="0.mvpovd63pq9.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/c90efaa3-0b32-04be-9ec5-b6b4872f8c94.png">

空のアプリケーションを選択します。

<img width="770" alt="0.2g95pwk4m2l.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/24d3452c-ec94-34e1-046d-954f6017574c.png">

すると、キャンバスが現れたかと思います。

<img width="1280" alt="0.k9yth140bqd.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/3fc84398-58ea-dd67-9d7e-c86dd9e564d7.png">

### ツールの数が多い

C++Builderの特徴として、とにかくツールの数が多いというのがあります。
標準のツールだけでもかなりの数があります。
Pro版なら表グラフやデータベースのアクセス機能なんかもあります。
下の画像はツールパレットのカテゴリのスクリーンショットで、左がStarter、右がProfessionalです。（Professional版のほうは、以前から使ってるやつなので、無料のツールをいくつか入れてますが・・・）

<img width="499" alt="0.3dfikxll5fi.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/888bb7e4-bef8-1e3f-4e60-92dc140f8120.png">

#### でも

Professional版についているFireDACというツール。このツールは簡単にデータベースへアクセス出来るようにするツールで、たしかに使いやすいツールなのですが、FireDAC Client/Server Add-On Packを追加で購入しなければSQLiteやInterBase等の一部のデータベースしか使えません。
私はODBCの接続とかにサードパーティ製のUniDACというのを使ってます。
有料ですが、FireDACを購入するよりずっと安いですし、コードは似た作りになってます。

> [Universal Data Access Components (UniDAC) for Delphi](https://www.devart.com/unidac/)

ちなみに、Pro版以上にあるdbGOでADOが出来ますのでODBC接続が使えます。
https://qiita.com/mm_sys/items/a6dd8edc9ebfb3de31ea

### プロジェクトフォルダは作ってくれない

C++BuilderはVisualStudioのようにプロジェクトフォルダを作ってくれません。
ですので、書類を展開したら、
**ファイル->すべて保存**
で、プロジェクトのフォルダをつくった上で、そこに全て保存しましょう。

## プロジェクトの設定

### コンパイラを変更

C++Builder（とDelphi）は、元々買収したボーランド社のコンパイラを使ってましたが、最近のバージョンではClangコンパイラを拡張したものを選択できます。

しかし、デフォルトではなぜか古い方が使用されるようになってますので、プロジェクトの設定で**C++コンパイラ->従来のコンパイラ->従来のBorlandコンパイラを使用**のチェックを外しましょう。

<img width="664" alt="0.l859gwfpyk9.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/fc29aeff-818f-e872-173f-c1daeae154ca.png">

ちなみに、ボーランドコンパイラはC++03までしか対応してないようです。

### 動的リンク

プロジェクトの設定で、Releaseの設定に**C++リンカ->動的RTLとリンクする**と、**パッケージ->実行時パッケージ->実行時パッケージを使ってリンク**のチェックをはずすと配布用に出来ます。
（ちなみに、コンパイラの不具合でexeを起動しても`borlndmm.dllが見つからなかったため、このアプリケーションを開始できませんでした。 `と表示されることがありますが、exeと同じディレクトリに同名のファイルのコピーを置けば動作します。
そのファイルは`C:\Program Files (x86)\Embarcadero\Studio\（バージョン番号）\bin`にあります。

### フォームに部品を貼り付ける

先程作った書類の、フォーム作成画面で、ツールパレットからTButton、TStyleBook、TCheckBoxを貼り付けてみます。
検索ボックスから検索すればすぐ出てきます。

![0.f8i281tlt9w.jpg](https://qiita-image-store.s3.amazonaws.com/0/76058/7bb55995-112f-83b6-bff0-7927b1ed5067.jpeg)

### スタイルを変更する

作成したexeのGUIの見た目を変更してみます。
貼り付けたTStyleBookコンポーネントをダブルクリックしてスタイル編集画面に移動します。
移動したら、左上あたりにあるフォルダのアイコンを選択。

<img width="331" alt="0.414d689qslh.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/7fd696b2-a33a-2f3c-a294-02496f50a498.png">

選択すると、ファイル選択ダイアログが表示されるので、`C:\Users\Public\Documents\Embarcadero\Studio\19.0\Styles`にあるスタイルのセットのどれかを選択します。今回は`Dark.style`を選択しました。
注意すべきは、`パブリックユーザ`のドキュメントにあるというところでしょうか。

スタイルを選択したら、ビューウィンドウを閉じようとします。すると、適用するか聞いてくるので、「はい」を選びましょう。

> [簡単にUIの印象を変える方法 - Styleの適用 - FireMonkey と VCL [Japan] - Community Blogs - Embarcadero Community](https://community.embarcadero.com/blogs/entry/ui-style-firemonkey-vcl-japan)

<img width="785" alt="0.uuv865ejt7p.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/8c8ee15a-f934-8ced-5ce6-61e9ac6e3db2.png">

TStyleBookオブジェクトを選択して、UseStyleManagerにチェックを入れます。

<img width="249" alt="0.4lqjxml6t0e.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/e80f87ea-292a-706f-f269-601affe5c670.png">

## ビルド

`実行->実行`を選択すると、.exeファイルが出力され、プログラムが実行されます。
TStyleBookコンポーネントで`Dark`テーマが使われて出力したアプリケーションのデザインが変更されています。

<img width="254" alt="0.q4ozjhhidxn.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/dc2ddf2f-2bb6-df59-110b-b1ffbcff4c03.png">

コンポーネントを貼り付けてプロパティを変えて、必要なところはC++を記述する。
短時間で見た目の良いアプリケーションを作成出来るので便利だと思います。

## GetItパッケージ

機能拡張のパッケージ管理機能です。
**ツール->GetItパッケージマネージャ**を選択して管理します。

##### 注意
ウィルス対策ソフトがGetItパッケージをブロックすることが有ります。ウィルス対策ソフトの設定を変えてインストールすることをおすすめします。

<img width="400" alt="0.255lxs13mrw.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/b0d5d9a5-e6ad-9743-323a-b7c80c525594.png">

## CodeSite Expressを使ってみる

GetItパッケージでCodeSiteを探してインストールしてください。
<img width="193" alt="スクリーンショット 2018-03-09 23.08.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/909b9941-f0af-5688-1a6d-fcda7c88a6d6.png">
<img width="504" alt="スクリーンショット 2018-03-09 23.10.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/b65a7940-df62-823f-37a6-0711bc9ee0e1.png">

CodeSiteはデバッグに使うロギングシステムです。
実際に使ってみましょう。

インストールが完了したら、先程作ったプロジェクトの`Unit1.h`を開いて`#include`と`Class`の間に以下のような記載を追加します。

```c++:unit.h
...//略
#include <FMX.Edit.hpp>
#include <FMX.StdCtrls.hpp>
#include <FMX.Types.hpp>
# ↓このへんに追加
#include "CodeSiteLogging.hpp"
#pragma comment(lib,"CodeSiteExpressPkg.lib")
#pragma link "CodeSiteLogging"
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
...//略
```

次にフォーム(Unit1.fmx)を開いて貼り付けておいた`TButton`コンポーネント(Button1)をボタンをダブルクリックするか、選択した状態でイベントのOnClickをダブルクリックしてイベントを作成してください。

<img width="260" alt="スクリーンショット 2018-03-09 23.14.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/8ddc9523-76ba-13f0-6345-74264d7c98ff.png">

作ったら、その中に以下のように追記してください。

```c++:Unit1.cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// ↓これを記入する
	CodeSite->Send(L"test");
}
//---------------------------------------------------------------------------
```

これで実行すると、アクセスを求めてくることがありますが、許可を出してやれば、入力した内容がコンソールのように表示されます。
一時的な計算などのコンソール表示を使いたいときはこの方法を使うと良いでしょう。
ちなみに、文字列だけでなく時間やboolとか色々表示出来ます。

<img width="653" alt="スクリーンショット 2018-03-09 23.24.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/cd48c2fe-78ec-6571-80cf-43a5e3ff2b83.png">

<img width="720" alt="スクリーンショット 2018-03-09 23.25.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/c5b94a23-92f7-83c8-9961-e15613e6764a.png">


## その他

### 不要なアクションは保存時に削除される

VisualC++と違って、例えば貼り付けたTButtonコンポーネントをダブルクリックすると、Clickアクションの実装がすぐに出来ますが、何も記述しないでそのままファイルを上書きすると、使われていないアクションのコードが自動で削除されます。
コメントや実装の中身を記述していたら削除されません。

### コードと構成がシンプル

実際のヘッダと実装、ファイル構成を見てみると非情にシンプルになっています。

### 文字列

`UnicodeString`をメインで使いながら、必要に応じて`.c_str()`メソッドを使って外部APIとやりとりします。
マルチバイトの処理は互換性のあるAnsiStringを使います。
この`UnicodeString`と`AnsiString`は非常に強力で、Visual C++のように文字列の扱いで迷うことがほとんどありません。