既存のVCLアプリでもモバイル活用！
簡単マルチデバイス連携術
第34回 エンバカデロ・デベロッパーキャンプ

エンバカデロ・テクノロジーズ
毛利 春幸

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

はじめに 既存のVCLアプリケーションからでは、大規模な改修をしないとモバイルやクラウドを活用できないと諦めていませんか？
アプリケーション間連携の手法を用いれば、コンポーネントによって簡単にモバイル、多様なデータソース、クラウドを利用できます。
新たにモバイル向けのフルシステムを組むのではなく、今までのVCLアプリと連動させたシンプルなモバイル化の例をファーストステップとして、多様なデータベース、クラウド接続へと展開していく方法を説明します。

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

既存のVCLアプリケーション
 大規模な改修をしないとモバイルやクラウドを活用できないと諦めていませんか？
デスクトップ

デスクトップDB

クライアントサーバー

アプリケーション

アプリケーション

アプリケーション

Windowsデスクトップ

Windowsデスクトップ

デスクトップDB

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

Windowsクライアント

RDBMS

3

コンポーネントによって簡単にモバイル
 事例• 既存の見積管理システム(VCL)

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

既存の見積管理システム
 見積管理システムの画面（Delphiで構築したWindowsアプリケーション）• 顧客管理• 見積管理• 見積詳細(印刷) 使用機能等• データベース: InterBase• 印刷・帳票： FastReport

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

顧客テーブル

見積テーブル

見積詳細テーブル

顧客ID
お客様名
住所など

顧客ID
見積ID
見積件名

見積ID
見積詳細
見積小計など5

見積管理システムのモダナイゼーション
 見積管理システムの画面（Delphiで構築したWindowsアプリケーション）
••
•
•

顧客管理
見積管理
見積詳細(印刷)
写真取得アプリ

顧客テーブル

見積テーブル

見積詳細テーブル

顧客ID
お客様名
住所など

顧客ID
見積ID
見積件名

見積ID
見積詳細
見積小計など 使用機能等• データベース: InterBase• 印刷・帳票： FastReport• アプリ通信：AppTethering

写真テーブル

見積詳細印刷DelphiのAppTethering
コンポーネントで転送機能を素早く実装
スマホ見積ID
写真見積管理または顧客管理

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

6

データモジュール データモジュール内に TFDConnection, TFDQuery,TDataSourceなど既存で利用されたコンポーネント

既存システム側はTTetheringManagerとTTetheringAppProfileを追加で配置するだけです。(設定は必要です)

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

7

アプリケーション テザリング
 RTL にはアプリケーション テザリング コンポーネントが用意されているため、アプリケーションは同じマシンまたはリモート マシンで動作している他のアプリケーションとやり取りできます。
 アプリケーションでは、アプリケーション デザリングを使用して次のことをたやすく行えます。
• アプリケーション テザリングを使用している他のアプリケーションの検出•（対象は、当アプリケーションと同じデバイスか接続している他のデバイスで動作しているもの）。

• アクションのリモート実行• あるアプリケーションでアプリケーション テザリングを使ってアクションを公開できます。そのとき、他のアプリケーションでは、前者のアプリケーションに用意されているこれらのアクションのどれでもリモートで呼び出すことができます。

• アプリケーション間でのデータの共有• アプリケーション テザリングを使用すると、標準データ型とストリームを共有できます。

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

8

アプリケーション テザリング プロトコル 特定のトランスポートやプロトコルに依存せず、アプリケーション テザリング API を使用して新しいトランスポートおよびプロトコルを実装することもできます。 RTL では、IP 接続および クラシック
Bluetooth 接続に対するサポートが組み込まれています。IP は、同じデバイスで動作するアプリケーション間の接続もサポートします。
IP 接続

クラシック Bluetooth 接続

Windows○

○

OS X

○

○

iOS

○-Android○○

プラットフォーム

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

9

アプリケーション テザリング | コンポーネント
 アプリケーション テザリングには次のコンポーネントが必要です。
名称説明

TTetheringManager

アプリケーション テザリングを使用している他のアプリケーションを検出できます（対象となるのは、当該アプリケーションと同じデバイスか接続している他のデバイスで動作しているもの）

TTetheringAppProfile

当該アプリケーションが TTetheringManager を使って前もってペアにされた他のアプリケーションと共有するアクションおよびデータを定義できます

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

10

アプリケーション テザリング | リモート アプリケーション接続
 2 つのアプリケーション間で TTetheringAppProfile コンポーネント間でアクションおよびデータを共有できるようにする
 アプリケーションどうしが自分の TTetheringManager を使って互いを検出してペアにする必要があり、その後で、それらのアプリケーションの TTetheringAppProfile がリンクされます。

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

11

アダプタおよびプロトコルの要件
 アプリケーションのペア設定用とデータの交換用にアプリケーション テザリング
機能に用意されているさまざまなアダプタとプロトコル
型名

用途

TTetheringNetworkAdapterCommon

同じデバイスで動作しているアプリケーション間や、ローカル エリア ネットワーク（LAN）やインターネットなどの IP ネットワークを介して到達可能なア
プリケーション間の接続用のアダプタ

TTetheringBluetoothAdapter

クラシック Bluetooth を使って到達可能かつペアになっている別個のデバイスで動作しているアプリケーション間の接続用のアダプタ

TTetheringTCPProtocol

上記のアダプタで使用される通信プロトコル

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

12

アプリケーション接続方法

詳細

グループを使用してアプリケーションに接続

各アプリケーションの TTetheringAppProfile コンポーネントの Group プロパティに同じ文字列を入力します。
各アプリケーションの TTetheringManager コンポーネントの AutoConnect メソッドを実行時に呼び出します。
たまたま同じ Group 文字列を使用している第三者のアプリケーションに当アプリケーションが誤って接続しないように、Group 文字列には、できるだけ一意なものを選びます。たとえば、Group の文字列として UUID を使用できます。

手動でリモート アプリケーションに接続

1.
2.
3.

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

DiscoverManagers メソッドを呼び出して、アプリケーション テザリングを使用している他のアプリケーションの検出
RemoteManagers のリストから、TTetheringManager.PairManager を呼び出して、希望するものとペアにします
検出した RemoteProfiles のリストを読み取り、TTetheringAppProfile コンポー
ネントに対して Connect13サブネット外部のアプリケーションへの接続

デフォルトでは、AutoConnect と DiscoverManagers はどちらも、アプリケーションの動作デバイスが存在するローカル エリア ネットワーク（LAN）のサブネットで検出を実行します。
メソッドのオプション パラメータ Target を使用して、この動作をオーバーライドしIP アドレスやサブネットを指定することができます。
リモート マネージャを検索する IP アドレスを指定するには、その IP アドレスを Target として指定します。
IP アドレスのサブネットを指定するには、4 番目の数を 0 に設定した IP アドレスを指定します。たとえば、Target に"192.168.4.0" と指定した場合、マネージャは 192.168.4.x サブネットでリモート マネージャを検索します。
(これより広いサブネットを指定することはできません。たとえば、"192.168.0.0" はサポートされていません。)

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

14

アプリケーション テザリング | ActionListの共有
 ActionListとTetheringAppProfile.Actionsに入れるだけです。
ProFile側

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

ActionList

15アプリケーション テザリング | TLocalAction
プロパティ

詳細

ActionIsPublic

リモートプロファイルと共有する（True）否か（False）

Kind

Mirror(送信)/Shared(公開受信)

Name

一意に識別する文字列

NotifyUpdates

自動的に変更をアナウンスするか（True）、否か（False）を指定

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

16

アプリケーション テザリング | ActionList
送信側

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

受信側

17

RunRemoteActionとRunRemoteActionAsync
 TTetheringAppProfile には RunRemoteAction というメソッドが用意されており、これを使用してリモート アクションを実行することができます。
• (RunRemoteActionAsyncは非同期)

受信側
void __fastcall TForm1::Button1Click(TObject *Sender){for (auto prof_:TetheringManager1->RemoteProfiles){
TetheringAppProfile1->RunRemoteAction(prof_, "b1");}}

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

18

アプリケーション テザリング | データの共有と送信
 アプリケーション テザリングを使ったデータの送信は、以下のいずれかの方法で行うことができます
機能詳細

共有リソースを定義するリソースで値をラップします。接続されたアプリケーションは、共有リソースの値を読み取ったり、共有リソースをサブスクライブして共有リソースの値が変化したときに更新を受け取ることができます。

一時リソースとしてデータを送信する

実行時に文字列やストリームを送信し、それを、接続されたアプリケーションで一時リソースとして受け取ることができます。接続されたアプリケーションが一時リソースの更新をサブスクライブすることはできません。元のアプリ
ケーションは一時リソースを一度しか送信しないからです。

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

19

アプリケーション テザリング | データの共有
 TLocalResource• 標準データ型（Boolean、Integer、Int64、Single、Double、String）とTStream をラップしています。
• 接続されたアプリケーションとリソースを共有することができます。
標準データ
BooleanInteger / Int64
Single / Double
StringStream

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

20

アプリケーション テザリング | データの共有 送信側
void __fastcall TForm1::Button1Click(TObject *Sender){
TetheringManager1->AutoConnect();
TetheringAppProfile1->Resources->FindByName("r1")->Value = "文字列";}

 受信側
void __fastcall TForm1::Button1Click(TObject *Sender){
TetheringManager1->AutoConnect();
UnicodeString s_ = TetheringAppProfile1->Resources->FindByName("r1")->Value.AsString;}

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

21

アプリケーション テザリング |リモート リソースを要求する
 TTetheringAppProfile コンポーネントにはGetRemoteResourceValue というメソッドが用意されており、これを使用してリモート リソースを要求することができます。
void __fastcall TForm1::Button2Click(TObject *Sender){
TetheringManager1->AutoConnect();for (auto aProf_ : TetheringManager1->RemoteProfiles){
auto aResource_ = TetheringAppProfile1->GetRemoteResourceValue(aProf_, "r1");
UnicodeString s_ = aResource_->Value.AsString;
ShowMessage(s_);}}

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

22

アプリケーション テザリング |リモート リソースを要求する
 GetRemoteProfileResources というメソッドが用意されています。このメソッドは、TTetheringProfileInfo のインスタンスとして指定されたリモート アプリケーション プロファイルが共有しているリモート リソースのリストを返します。

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

23

アプリケーション テザリング |データ送信
 指定されたリモート プロファイルへ送信
メソッド名

説明

SendStream

指定されたストリームを指定されたリモート プロファイルへ送信し、成功した場合には True を、失敗した場合には False を返します。

SendString

指定された文字列を、指定されたリモート プロファイルに送信します。

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

24

アプリケーション テザリング |データ送信 送信側コード
void __fastcall TForm1::Button1Click(TObject *Sender) {TetheringAppProfile1->SendString(TetheringManager1->RemoteProfiles->Items[0], "Description", "送信データ");} 受信側
void __fastcall TForm1::TetheringAppProfile1ResourceReceived(TObject * const Sender,TRemoteResource * const AResource){ShowMessage(AResource->Value.AsString);}

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

25

アプリケーション テザリング | 送信 リモート プロファイルの接続を使って、指定されたコマンドを送信
メソッド名機能

SendCommand指定された接続または指定されたリモート プロファイルの接続を使って、指定されたコマンドを送信します。

SendCommandWithResponse

指定されたコマンドを指定された接続または指定されたリモート プロファイルの接続を使って送信し、応答コマンドを受信するまで待機し、受信したコマンドを返します。

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

26

アプリケーション テザリングのモダナイゼーションまとめ
 見積管理システムの画面（Delphiで構築したWindowsアプリケーション）
••
•
•

顧客管理
見積管理
見積詳細(印刷)
写真取得アプリ

顧客テーブル

見積テーブル

見積詳細テーブル

顧客ID
お客様名
住所など

顧客ID
見積ID
見積件名

見積ID
見積詳細
見積小計など 使用機能等• データベース: InterBase• 印刷・帳票： FastReport• アプリ通信：AppTethering

写真テーブル

見積詳細印刷DelphiのAppTethering
コンポーネントで転送機能を素早く実装
スマホ

見積ID
写真見積管理または顧客管理

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

27

多様なデータベースへの接続を実現
 RAD Serverを使った さまざまなDB接続
 事例• 飲食店 在庫管理

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

業務拡大中 飲食店 在庫管理
 飲食店 在庫管理アプリの画面等•

在庫テーブル表示・更新画面

在庫テーブル表示・更新画面

 使用機能等•

データベース

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

在庫テーブルID
商品名カテゴリ
数量29

飲食店 在庫管理アプリのモダナイゼーション
 飲食店 在庫管理アプリの画面等••••

在庫テーブル表示・更新画面

在庫テーブル表示・更新画面
在庫情報の取得、更新
バックヤード：Androidアプリ
厨房：iPhoneアプリ

在庫テーブルID
商品名カテゴリ数量

 使用機能等•••

データベース：MySQLAndroid / iOSアプリ：Delphi
中間サーバー： RAD Server

RAD Server
REST/JSON
在庫管理(Android / iOS)

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

30

RAD Server 特徴
 ユーザーがクラウドや社内にホストできるモバイル エンタープ
ライズ アプリケーション プラットフォーム（MEAP）• カスタム REST API やエンタープライズ データベース データを公開します。
エンタープライズ データには、FireDAC データ アクセス ライブラリを使ってアクセスできます。
• REST API• リモート データベース アクセス• ユーザーの追跡• アナリティクス

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

31

RAD Server側 プログラム
 TFDSchemaAdapter を使用すると、集中管理キャッシュ更新を管理することができます。

AResponse.Body.SetStream()

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

32

RAD Server側 プログラム
 データセットを共有する為のコード
procedure TMyResource1.Get(const AContext: TEndpointContext; const ARequest: TEndpointRequest;
const AResponse: TEndpointResponse);var
ms: TMemoryStream;
begin
ms := TMemoryStream.Create;try
FDTable1.Active := True;
FDSchemaAdapter1.SaveToStream(ms, TFDStorageFormat.sfJSON);
AResponse.Body.SetStream(ms, 'application/json', True);
finallyend;end;

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

33

RAD Serverからのクライアント側
 クライアント側はコンポーネントの配置のみです

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

34

RAD Serverからのクライアント側コード
 RAD ServerからTFDSchemaAdapterのデータ取得の際に1行コードが必要です。
procedure TForm1.Button1Click(Sender: TObject);
Begin
EMSFireDACClient1.GetData;
end;※ FDTableAdapter1.DatSTableNameは TFDTable::Nameです。

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

35

飲食店 在庫管理アプリのモダナイゼーション
 飲食店 在庫管理アプリの画面等••••

在庫テーブル表示・更新画面

在庫テーブル表示・更新画面
在庫情報の取得、更新
バックヤード：Androidアプリ
厨房：iPhoneアプリ

在庫テーブルID
商品名カテゴリ
数量 使用機能等•••

データベース：MySQLAndroid / iOSアプリ：Delphi
中間サーバー： RAD Server

RAD Server
REST/JSON
在庫管理(Android / iOS)

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

36クラウド接続
 RAD Server + FireDACを利用した クラウド接続多様性
 Amazon Simple Storage Service はインターネット用のストレージサービスです。

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

RAD Server FireDACを利用した クラウドDB接続
 RAD Server TFDConnection接続先をクラウドへ
RAD Server クラウドに移動
RAD Server

Azure

REST/JSON
在庫管理(Android / iOS)

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

38

RAD Server を利用した クラウド接続多様性
 RAD Server TAmazonConnectionInfoでクラウドストレージへ

RAD Server

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

AWS S339

クラウド AWS S3接続
 Delphi/C++ Builderは AWS接続のためのTAmazonConnectionInfoコンポーネントが用意されています
IAM(Identity and Access Management)

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

40

クラウド AWS S3接続
 S3接続側コード
function TResourceResource1.aws_s3(fname_: String): TStream;vars3_: TAmazonStorageService; res_: TCloudResponseInfo; mm_: TMemoryStream;
begin
Result := nil;
AmazonConnectionInfo1.StorageEndpoint := 's3-ap-northeast-1.amazonaws.com';
s3_ := TAmazonStorageService.Create(AmazonConnectionInfo1);
res_ := TCloudResponseInfo.Create;try
try
mm_ := TMemoryStream.Create;
s3_.GetObject('embarcader',fname_, mm_, res_);Result := mm_;exceptend;
finally
res_.DisposeOf;
s3_.DisposeOf;end;
end;

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

41

クラウド AWS S3接続
 S3からデータ取得後 SetStream()procedure TResourceResource1.Get(const AContext: TEndpointContext; const ARequest:TEndpointRequest; const AResponse: TEndpointResponse);var
mm_: TMemoryStream;
fs_: TFileStream;
begin// Sample code
mm_ := aws_s3('amane-phone.jpg') as TMemoryStream;
if Assigned( mm_ ) thenbegin
mm_.Position := 0;
AResponse.Body.SetStream(mm_,'image/jpeg', True);
end;
end;

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

42

RAD Server を利用した クラウド接続多様性
 RAD Server TAmazonConnectionInfoでクラウドストレージへ
マスターDB

CloudWatchRDSRAD Server

DBに負荷がかからないInterbaseを利用し一定期間キャッシュ保存

夜間バッチ
LambdaLambdaを使いJSON変換後S3に保存

AWS S3

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

43最終段階
 新たにモバイル向けのフルシステムを組むのではなく、今までのVCLアプリと連動させたシンプルなモバイル化の例をファーストステップとして、多様なデータベース、クラウド接続へと展開

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

最終段階
ビッグデータWindowsクライアント

IoTデバイスRDBMS

典型的なC/Sシステム

HTTP(S)
REST
JSON

デスクトップクライアント

レガシーシステム

独自のプロトコルで接続

HTTP(S)RESTJSONRAD Server
中間サーバー

HTTP(S)
REST
JSON

クラウドサービス

モバイル
クライアント本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

45

まとめ コンポーネントによって簡単にモバイル• Application Tetheringコンポーネント

 多様なデータベースへの接続を実現• 既存のシステム + RAD Serverを用いる事でのモバイルDB接続

 クラウド接続• FireDACを利用した クラウドDB接続

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

46THANKS!
www.embarcadero.com/jp
第34回 エンバカデロ・デベロッパーキャンプ

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。