【Delphi / C++Builder / Starter 】アプリにWebページ表示機能をかんたんに組み込む

#【Delphi / C++Builder / Starter 】アプリにWebページ表示機能をかんたんに組み込む

Delphi/ C++Builder ユーザなら TWebBrowserの記事だな、と察しておられるかと思いますが、そのとおりです。
この記事では、TWebBrowserコンポーネントを使って、かんたんにアプリへWebページ表示の機能を組み込む方法をご紹介します。

Webブラウザそのものの開発を行う、といういうよりも、アプリにおいて、一部地図を表示したり、Web上サーバー上にあるhtml情報を引っ張ってきて表示する、という使い方に便利です。

TWebBrowserコンポーネントを使ったモバイルアプリ作成のチュートリアルはエンバカデロの[Dockwiki](http://docwiki.embarcadero.com/)に[「モバイル チュートリアル：Web ブラウザ コンポーネントを使用する（iOS および Android）」](http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/%E3%83%A2%E3%83%90%E3%82%A4%E3%83%AB_%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%EF%BC%9AWeb_%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6_%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%EF%BC%88iOS_%E3%81%8A%E3%82%88%E3%81%B3_Android%EF%BC%89)という題名で記載されています。より詳しい情報を知りたい方は、こちらのDocwikiもご参考になってください。

無料で使えるStarter Editionでも、Windows 32bit向け限定ではありますが、作成できます。
Delphi / C++Builder の Starter Edition は[こちらの記事をご参考](http://qiita.com/kazaiso/items/1c0df8ff902405d1c214)に

すでにDelphi / C++Builder / RAD Studioをお持ちの方は、そのお持ちの開発環境でお試しください。お持ちでない方はトライアル版使って当記事内容を確認できます。トライアル版導入については、[こちらを記事をご参照](http://qiita.com/kazaiso/items/479fdf1170fa886fe208)あれ

##作成手順のビデオ
作成手順のビデオが公開されています。こちらもどうぞ

##アプリへのWebページ表示機能の組み込み
では実際に基本的なWebページ表示機能を持つアプリの作成手順を記載していきます。

### IDEの起動とUI設計
まずはUIパーツを配置していきましょう


1. RAD Studio を起動します
1. RAD Studioの初期表示のウエルカムページで 「マルチデバイスアプリケーションの新規作成」 を選択します。
1. 表示される空のアプリケーションを選択して、OKボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/8b693953-b65d-3100-e64b-42db1c6bc49b.png) <br><br>
1. 基本の空のフォームが表示されます。ここに、右下のツールパレットからTToolbarをドラッグアンドドロップして配置します。検索バーに「tool」と入れると見つけやすいです
![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/da2487f4-5fd9-eed5-38b1-ad4fa21752ab.png)<BR><BR>
2. 合わせてTButtonコンポーネントをToolBarの子として配置します。「Button1」としてToolBarにぶら下がっていることを左上の構造ペインで確認してください
![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/cb0fec74-d678-fa0f-78bc-fe18936d33be.png)
<BR>ぶら下がっていなければこの構造ペインでButton1をToolbar1の上にドラッグアンドドロップしてこのようなツリー構造にしておきます<BR><BR>
1. 「Button1」をクリックして選択状態して、左下のプロパティにあるAlignを「Left」に設定します
<BR>![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/b2c5db24-961d-2b05-9333-d3fdf30b2522.png)<br><br>
2. 同様にプロパティのStyleLookUpを [PriorToolButton]プライアツールボタン に設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/1dee88e4-119c-3319-c756-fe5b7b836d07.png)
<BR>戻るボタンらしく、ビジュアルを変更します。<br><br>
1. 次にTEditをToolBarの子として配置します。「Edit1」として配置されます。
2. Edit1のプロパティのAlignを「Client」に設定しツールバーいっぱいに表示します
3. 同じくプロパティのKeyboardTypeを[URL]に設定して、モバイルデバイスでポップアップキーボードが表示された際に、URL記述に適したキーボードが表示されるようにします
4. 同じくプロパティのKillForcusByReturnに[True]をセットして、エンターキー入力時にEdit1からフォーカスが外れるようにセットします<br>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/8f54954b-9468-6631-b224-bb99d5e1621a.png)<BR><BR>
1. 次に、Webページを表示するコンポーネントのTWebBrowserをフォームにドラッグアンドドロップします
1. TWebBrowserのプロパティのAlignに[Client]をにセットして、Form1いっぱいに表示します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/938fec05-3e69-7e2c-a3e2-5c7d8e781d9f.png)<br><br>
これでUIパーツの設置は終了です。完了後のUIは画面中央、構成は左上の構造ペインのようになっているはずです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/5a34ceae-754a-17a0-0cc1-005ed00ee537.png)



###イベントハンドラを記述する 
イベントハンドラにコードを書いて実際にTWebBrowserにWebページを表示するようにしていきます。
余談になりますが、この何か動作・何かイベントが発生したときに、どのように動くのか、をプログラミングしていく、この「イベントドリブン」という動かし方、Delphi/C++Builderの基本的なコーディングスタイルですが、わかりやすくてとても好きです。

では実際にWebページを表示させるコードを記述します
エラーハンドリングまでやらず、下記の基本動作実装まで。

* Edit1に入力されてEnterキーが押されたら、Edit1の記載のアドレスのURLをTwebBrowserで開く
* 戻るボタンがクリックされたら前のページに戻る

####Edit1記載のURLを表示
1. フォーム上、または構造ペイン上のEdit1をクリックして選択状態にします
2. 左下のオブジェクトインスペクタにある[イベント]のタブをクリック
3. イベントリストが表示されているので、キーが押された時に発生する(呼ばれる)[OnkeyDown]を見つけ出します。
4. OnKeyDownの右側の空白をダブルクリックします。クリックした位置に[Edit1KeyDown]と記述が自動追加され、イベントハンドラのコード記述部分に表示が切り替わります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/1c93469a-b3b6-e520-d78f-ac29bfbd502b.png)<br><br>
1. イベントハンドラでは 押されたたKey情報も引数として渡されているので、Returnキーが押されたかどうかを判定し、Returnキー（vkReturn）が押されたら、入力終了と判断して、Edit1内のテキストをURLとみなし、WebBrowser1で表示を試みます。 コードは下記のようになります。

```delphi
//Delphiのコード
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; var KeyChar: Char;
  Shift: TShiftState);
begin
  {イベントハンドラ引数のKeyがvkReturnならリターンキーが押されている}
  if Key = vkReturn then
  begin
   {NavigateメソッドはURLを開く}
    WebBrowser1.Navigate(Edit1.Text);
  end;
end;
```
```cpp
//Cppのコード
// ---------------------------------------------------------------------------
void __fastcall TForm1::Edit1KeyDown(TObject *Sender, WORD &Key,
	System::WideChar &KeyChar, TShiftState Shift)
{   /*イベントハンドラ引数のKeyがvkReturnならリターンキーが押されている */
	if (Key == vkReturn) {
		/* NavigateメソッドはURLを開く */
		WebBrowser1->Navigate(Edit1->Text);
	}
}
```
<br>

####戻るボタンの動作を実装
1. IDEの画面の中央下に[デザイン]と記載されているタブがあります。これをクリックして、UIフォーム表示画面に戻ります
2. フォーム上の戻るボタン(Button1)もしくは構造ペインに表示されている「Button1」をクリックして選択状態にします
3. オブジェクトインスペクタ内のイベントタブ内にある「OnClick」イベントでマウスクリックされたときのイベントハンドラを記述します。Onclickの左の空白をダブルクリックします（もしくはフォーム上の戻るボタンをダブルクリックでもOK)OnClickに[Button1Click]と記述が自動追加され、イベントハンドラのコード記述部分に表示が切り替わります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/ad027761-244f-c33e-19cf-98eec52eee18.png)
<br><br>
4. 戻る URL情報があるか（すでにどこかページを見ているか）を確認後、あるなら、WebBrowser1のメソッドで戻ります。コードは下記のようになります。

```delphi
//Delphiのコード
procedure TForm1.Button1Click(Sender: TObject);
begin
  {CanGoBackメソッドで戻れるURLがあるかの存在確認}
  if WebBrowser1.CanGoBack then
  begin
   {GoBsackメソッドで戻る}
    WebBrowser1.GoBack;
  end;
end;
```

```cpp
//Cppのコード
// ---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	/* CanGoBackメソッドで戻れるURLがあるかの存在確認 */
	if (WebBrowser1->CanGoBack) {
		/* GoBsackメソッドで戻る */
		WebBrowser1->GoBack();
	}
}
```
TwebBrowserのメソッドとして戻れるかどうかのチェックや戻るためのメソッドを使いましたが、詳細情報、他の用意されているメソッド、イベントなどは[Docwikiで確認](http://docwiki.embarcadero.com/Libraries/Tokyo/ja/FMX.WebBrowser.TWebBrowser)できます。


これで基本的な実装をおえました。次は実行です。

##アプリの実行
では、そのままWindows上で実行してみます。

###Windows
1. IDE上部左側の緑三角ボタンをクリックするか、Shift + Ctrl +F9キーを押します(F9キーのみでデバッグ実行も可）<br>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/07f54d66-20ce-921b-88dd-e38dc0ca734d.png)
<br><br>
1. Windows上でアプリが起動してきました。 エディットボックスにURLを入力し、リターンキーを押すとWebページが表示されます。 ここでは www.google.com と入力しています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/be064127-673f-7a77-63ba-596ce2656570.png)<br><br>

1. また、他のページに移動してから、戻るボタン(![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/23b4ae21-1159-71bd-017a-209bc14e59b3.png))をクリックすると、ページが戻ります

###iOS
次に、iOS向けにビルドしてみましょう。Delphi / C++BuilderならUI設計、コードも同じままで、IOSでも動作させることができます。先ほどのWindows上で起動していたアプリは終了させておいてください。

Starterユーザーさんは、iOS向けは作れませんのであしからずご了承ください。
また、iOS向けにビルドするにはmacOS機と、XCodeのインストールなど、事前準備が必要です。詳しくはこ知らの記事[「【超入門】iOSアプリ開発をDelphi/C++Builderで始めるためのファーストステップ」](http://qiita.com/kazaiso/items/10562f1d103c12d415af)を参考になり、ご準備ください。

1. IDE右上のプロジェクトマネージャペインで、「ターゲットプラットフォーム」の[+]をクリックして展開し、iOSデバイス-64ビットをダブルクリックして選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/45fa3fad-410d-d286-4442-82b07c8f710c.png)<br><br>
1. Mac側に iOSデバイスを接続して、「PAServer」も起動しておきます。
2.RAD Studio の[ツール] - [オプション]の[接続プロファイルマネージャ]で接続テストで接続できてい
ることを確認します。
1. プロジェクマネージャーのターゲットプラットフォーム [iOS デバイス64ビット」のツリー下の「ターゲット」を右クリックして「更新」し、表示されたiOSデバイスをダブルクリックして太文字選択状態にします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/988be239-727e-ea1f-ef21-3ed21f54b584.png)<br><br>

2. IDE上部左側の緑三角ボタンをクリックするか、Shift + Ctrl +F9キーを押します(F9キーのみでデバッグ実行も可）<br>
3. ビルドが終了すると、RAD Studioが PAServerを通じて、アプリをiOS 機に送り込み、iOS機上でアプリがl起動してきます
<BR>
<img width="375" alt="IMG_1705.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/145847/412cf504-ca3c-28fe-2411-bd0242e53b98.png">
iPhone7での画面です。edit1 に www.embarcadero.com/jp を入力してエンバカデロWebページを表示しました。キーパッドもURL入力向けに適したキー配列のものが表示されています。 

##おわりに

このように、TwebBrowserコンポーネントを使用してアプリにWebページ表示機能を加えることができます。季節ごとや、時間ごとで変わるような情報をアプリ内で表示したい場合など、Webサーバー側にHTMLをおいといて、それを表示するように作りこめば良いかもしれませんね。