Delphi/C++Builderテクニカルセッション「マルチデバイス対応アプリ開発の勘所」
エンバカデロ・テクノロジーズ
エヴァンジェリスト 高橋智宏
www.embarcadero.com/jp© Copyright 2014 Embarcadero Technologies, Inc. All Rights Reserved.

アジェンダ•

FireUIマルチデバイスデザイナ–•

メッセージボックス系はモバイルで要注意–•

Delphi(C++)サーバーからクラスインスタンスを返すには?
DOMベンダーを「Omni XML」にするには?

DataSnap RESTサーバー & クライアント–

2

Indy, TXMLDocument(Omni XML)
XMLデータバインディング(C++/Delphi)が便利

SOAPサーバー & クライアント––•

Indy(TIdHTTP), TXMLDocument(Omni XML)
XMLデータバインディング(C++/Delphi)が便利

TRESTxxxxコンポーネント + JSON––•

プロジェクトマネージャと配置マネージャの関係
マルチプラットフォーム(Win/Mac/iOS/Android)で試すHTTP + XML––•

Java2OP.exeの使い方(C++/Delphi), C++言語でGPSのリスナーを記述!?

SQLite + FireDAC + Visual LiveBinding––•

DelphiとC++言語で無名メソッドを利用(Non-Blocking & Blocking)Android APIにアクセス–•

iPhone 6(Plus), Android Wear向けビュー, Yosemite(10.10)スタイル, Lollipopの新ART

データセット1個または複数個を一度に送(受)信するには?
© Copyright 2014 Embarcadero Technologies, Inc. All Rights Reserved.

FireUIの基礎• 「スタイル&マスタ」と「ビュー」– マスタに追加したGUIコンポーネントを個別のビューで設計時にカスタマイズしておく• カスタマイズした内容は専用の.fmxファイルに保存される• 特定のOS/フォームファクタでは Visible := False など– .pas, .cppにフォームファクタおよびOS指定したリンク命令が追加される

3© Copyright 2014 Embarcadero Technologies, Inc. All Rights Reserved.

個別のビューの作成• iPhone 6, iPhone 6 Plus向けビュー– iPad系は1種類で足りる– .fmxのリンク例• Android Wear向けカスタムビュー– Samsung Gear Live(1.63インチ, 320 x 320, 278ppi)– パッケージ(.pas,.bpl)の作成およびIDEへの登録– C:¥Users¥[User]¥AppData¥Roaming¥Embarcadero¥BDS¥15.0¥MobileDevices.xm
lへ追記し、IDEを再起動– アプリプロジェクトに.pasを追加して組み込む

4© Copyright 2014 Embarcadero Technologies, Inc. All Rights Reserved.

最新のOS• OS X Yosemite(10.10)に対応するには?
– Yosemite向けスタイル(Yosemite.fsf または YosemiteDark.fsf)をTStyleBookで利用• 残念ながら、XE6(5)のAndroidアプリは、Lollipop 5.0(新ART) とKitKat 4.4の実験的ARTモードでは起動しません– 最新のXE7を使用する必要があります• iOS 8.0, 8.1– 特別なスタイルは不要, TEditのiOSネイティブモードも利用可• Windows 10 !?
5© Copyright 2014 Embarcadero Technologies, Inc. All Rights Reserved.

iOS,Androidでは要注意• XE7のiOS,Androidでは、UIイベントのフリーズを防ぐ
ため、慣れ親しんだ以下の4つのメソッドは、呼び出すと直ちに呼び出し側に戻ります(Non-Blocking)– ShowMessage• ウィンドウを閉じるタイミングを知るには、MessageDlgへの移行が必要– MessageDlg– InputQuery(※複数項目の入力はiOSは未対応)– InputBox
RAD Studio XE7のオンラインヘルプより– 「Delphi XE7 および C++Builder XE7 の新機能 - ダイアログ ボックスのメソッドでは閉じる際の処理を行う無名メソッドをサポート」

6© Copyright 2014 Embarcadero Technologies, Inc. All Rights Reserved.

Delphiの場合• 無名メソッドで閉じるイベントを捕捉

7© Copyright 2014 Embarcadero Technologies, Inc. All Rights Reserved.

C++言語の場合• TCppInterfacedObjectの派生クラスでoverrideしたInvokeメソッドを使用

8© Copyright 2014 Embarcadero Technologies, Inc. All Rights Reserved.

ブロッキング的フローの例• 複数のShowMessage(と同等のMessageDlg)を順番に表示

9© Copyright 2014 Embarcadero Technologies, Inc. All Rights Reserved.

Android APIにアクセス• 特定のJavaクラスのAPIを呼び出したい場合– XE7のJava2OP.exeでブリッジ(.pas)を生成し利用する– 例:C:¥>Java2OP.exe -jar Hello.jar -classes com.example.hello.Hello -unitcom.example.hello.Hello10© Copyright 2014 Embarcadero Technologies, Inc. All Rights Reserved.

Android APIにアクセス(続き)• C++からも.pasを利用可能
––––

11

.pasをプロジェクトに追加
いったんビルドして、生成された.hppをインクルード
プロジェクトの[ライブラリ]ノードにHello.jarを追加
Hello.jarがマージされたclasses.dexが.apk内にパッケージングされる© Copyright 2014 Embarcadero Technologies, Inc. All Rights Reserved.

C++アプリ - AndroidでGPSにアクセス• TLocationSensorコンポーネントで足りない場合– Delphi(.pas)でJava向けGPSリスナーを直接記述し、C++からも利用

12© Copyright 2014 Embarcadero Technologies, Inc. All Rights Reserved.

組み込みDBを利用するには?
• SQLiteとマルチOS– FireDACでアクセスし、Visual LiveBindingで表示• DBファイルの物理パスは、実行時にTFDConnectionのBeforeConnectイベントで設定する– XE7では、DBファイルをプロジェクトマネージャに直接追加• 配置マネージャに自動で反映されます13© Copyright 2014 Embarcadero Technologies, Inc. All Rights Reserved.

XMLを受信してDOMにアクセス• HTTPクライアントとXML DOMパーサとマルチOS– Indy(TIdHTTP)でWebにアクセスし、TXMLDocumentでDOMにアクセス• XE7には、マルチOS対応の新しい「Omni XML」を搭載– DOMツリーを直接操作するより、より安全・便利な「XMLデータバインディングウィザードが生成するラッパー」がオススメです• DelphiおよびC++言語に対応– 行政によるオープンデータ化の推進• 福井県鯖江市 西山動物園の動物（ＸＭＬ）– http://www3.city.sabae.fukui.jp/xml/zoo/nisiyamazoo.xml

14© Copyright 2014 Embarcadero Technologies, Inc. All Rights Reserved.

TXMLDocumentの使い方• DOMVendorプロパティで Omni XML を指定– Delphi: uses Xml.omnixmldom が自動追加される– C++: #include <Xml.omnixmldom.hpp> が自動追加される

15© Copyright 2014 Embarcadero Technologies, Inc. All Rights Reserved.

JSON > XML ?
•••••JSONのほうがXMLよりも構造がシンプル
一般的にエンコードは UTF-8
MIMEタイプ: application/json
Delphi/C++Builderは、TJSONxxxx系クラスで処理
XML を JSON に変換するには?
– 例: XML-JSON相互変換ツール - Bluehawk's lab.
• http://bluehawk.infinitybird.com/dev/xmljson.html

XML16JSON© Copyright 2014 Embarcadero Technologies, Inc. All Rights Reserved.

JSONを受信して処理する• TRESTxxxx系コンポーネントがとっても便利––––

TRESTClient
TRESTRequest
TRESTResponse
TRESTResponseDataSetAdapter• 問題は、JSONのデータ構造を示すスキーマが存在しないこと– 安全で便利な JSON <ー> クラス マッピングが難しい– JSONをTDataSet型(例:TFDMemTable)にマッピングすると便利• TRESTResponseDataSetAdapterのResponseJSONプロパティを利用

17© Copyright 2014 Embarcadero Technologies, Inc. All Rights Reserved.

SOAP > HTTP+XML• XML形式のデータをHTTP上で送受信する• 利用者は、メソッド呼び出しの形式で通信できる
引数X1,X2…

クライアントHTTPリクエスト

サーバコードreturn Y;

Y = obj.Foo(X1,X2…);

スタブ

スケルトン
戻り値Y
HTTPレスポンス

SOAPライブラリ

18

SOAPライブラリ© Copyright 2014 Embarcadero Technologies, Inc. All Rights Reserved.

WSDL•••

Webサービス記述言語（Web Services Description Language）
提供するWebサービスのインターフェース（メソッド等）を規定する
WSDLファイルから、クライアント/サーバ各用のスタブ/スケルトンコードを生成する・・・・・・・・・・・・

WSDLファイル

サーバコードクライアントY = obj.Foo(X1,X2…);

return Y;
SOAPライブラリ(A)

スタブ

生成

SOAPライブラリ(B)生成

SOAPライブラリ(A)

19

スケルトン

SOAPライブラリ(B)© Copyright 2014 Embarcadero Technologies, Inc. All Rights Reserved.

SOAPサーバー•XE7では、Win32/Win64のサーバーのみ– スタンドアローン(exe), GGI(exe), ISAPI(dll), Apache DSO(dll)

••
•

20

WSDLはサーバーが生成してくれるサーバー用インターフェースを宣言し、実装クラスを定義する
クラス型を引数・戻り値に使用する場合はTRemotableの派生クラスを定義© Copyright 2014 Embarcadero Technologies, Inc. All Rights Reserved.

SOAPクライアント•

VCL(Win32/Win64)およびFireMonkey(Windows/OS X/iOS/Android)– スタブは「WSDLインポータ」を使用して、.pasまたは.cpp/.hを自動生成– DOMパーサは MSXML(Windows) または Omni XML(クロスプラットフォーム)• Xml.xmldomユニットのDefaultDOMVendorグローバル変数を指定

21© Copyright 2014 Embarcadero Technologies, Inc. All Rights Reserved.

DataSnap > HTTP+JSON• JSON形式のデータをHTTP上で送受信する• 利用者は、メソッド呼び出しの形式で通信できる– RPC形式のサーバーメソッドの実装• 要は、RDBMSのストアドプロシージャと同じ扱い!!
• パラメータ & 戻り値– in, var, out, return• インスタンスのライフサイクル– Server, Session, Invocation• Callback, Filter, Event– 組み込み型・TJSONxxxx型・TDataSet型 と JSON の間は自動変換
業務ロジック
SQL文 etc…

GUI

RESTベースのDataSnapプロトコル

DataSnapサーバ

FireDAC

22

DataSnap

GUIアプリHTTP(s)© Copyright 2014 Embarcadero Technologies, Inc. All Rights Reserved.

ドライバ

RDBMS

TDataSetの配列を送受信する•

なぜTDataSetの配列が必要なのか?
– 複数テーブルの処理を単一トランザクション(1回のサーバーメソッド呼び出し)で行うため•「array of TDataSet」はパラメータに使用できない仕様– 基本的にTJSONArrayを使用し、データセットをJSON文字列にしたものを複数個入れる– もしくは、Data.FireDACJSONReflectユニットのTFDJSONDataSets型を利用する• FireDACのTFDDataSetの派生クラスのインスタンスを複数保持する

23© Copyright 2014 Embarcadero Technologies, Inc. All Rights Reserved.

www.embarcadero.com/jp

24© Copyright 2014 Embarcadero Technologies, Inc. All Rights Reserved.