アプリケーション テザリングを使用したリモート アプリケーションとのデータの共有

提供: RAD Studio
移動先: 案内検索

アプリケーション テザリングの使用 への移動


RTL のアプリケーション テザリングの実装では、接続されたアプリケーション間のデータ共有をサポートしています。

接続されたアプリケーションへのデータの送信

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

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

リソースを共有する

TLocalResource はラッパーで、標準データ型(BooleanIntegerInt64SingleDoubleString)か TStream をラップしています。アプリケーション テザリングによって、接続されたアプリケーションとリソースを共有することができます。

リソースを作成して共有するには:

  1. フォーム デザイナTTetheringAppProfile コンポーネントを選択し、[オブジェクト インスペクタ]でその Resources プロパティをダブルクリックします。
  2. list editor が開くので、新規作成 をクリックして、新しい TLocalResource をリストに追加します。
  3. 新規追加した TLocalResource をリスト エディタで選択した状態で、[オブジェクト インスペクタ]Name プロパティに一意の値を設定します。
TLocalResource Editing.png

これで、リソースがアプリケーション テザリングによって共有されます。接続されたアプリケーションは、このリソースの値を読み取り、リソースの更新をサブスクライブすることができます。そうすると、元のアプリケーションのリソースの値が変化したときに、接続されたアプリケーションは変更を通知され、新しい値を読み取ることができます。

設計時にリソースを定義した後、実行時に次のようにしてリソースの値を設定しなければなりません。

  • Delphi の場合:
    • TetheringAppProfile1.Resources.FindByName('ResourceName').Value := 'SomeValue';
    • TetheringAppProfile1.Resources.Items[ResourceNumber].Value := 'SomeValue';
  • C++ の場合:
    • TetheringAppProfile1->Resources->FindByName("ResourceName")->Value = "SomeValue";
    • TetheringAppProfile1->Resources->Items[ResourceNumber]->Value = "SomeValue";
ここで、
  • ResourceName は、設計時にリソースを作成したときに Name プロパティに入力した名前です。
  • SomeValue は、リソースに設定したい値です。この値は、上述の標準データ型のいずれでもかまいません。
  • ResourceNumber は、設計時にTResourceCollection を作成した際に、そのItems プロパティに入っている項目の数です。

リソースにストリームを使う場合:

  • TetheringAppProfile1.Resources.Items[1].Value := LMemoryStream;
  • LMemoryStream.Free;

コードは即座に、ソース ストリームのフル コピーを行います。元のストリーム(つまり LMemoryStream)は、このため即座に破壊されます。

接続されたアプリケーションは、任意の時点で共有リソースの値を要求することができます。また、共有リソースの更新をサブスクライブすると、元のアプリケーションでリソースの値を変更したときに、サブスクライブしたリモート アプリケーション プロファイルで更新後のリソースを受信することもできます。

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

リソースを共有する代わりに、TTetheringAppProfile コンポーネントの SendString メソッドや SendStream メソッドを使用して、文字列やストリームを接続されたアプリケーションに送信することができます。

リモート アプリケーション プロファイルは、一時リソースにラップされた値を受信します。一時リソースとは、元のアプリケーション プロファイルが、接続されたアプリケーションに一度だけ送信するリソースです。この一時リソースはその後削除されるため、接続されたアプリケーションがこのリソースの更新をサブスクライブすることはできません。

これらのメソッドに必要なパラメータは次のとおりです。

  • AProfile: リモート アプリケーション プロファイルを TTetheringProfileInfo のインスタンスとして指定します。TTetheringManager コンポーネントの RemoteProfiles プロパティには、自分のプロファイルに接続されたリモート アプリケーション プロファイルのリストが含まれています。そのリストを参照して、必要なリモート アプリケーション プロファイルを探すことができます。
  • Description: 送信する値の内容について記述した文字列です。
  • AString または AStream: 送信する値です。

一時リソースを使用して String 以外の標準データ型を送信したい場合には、送信前に標準データ型を文字列に変換し、さらに文字列を受信する接続されたアプリケーション側で元の型に変換する必要があります。 JSON を参照してください。

接続されたアプリケーションからのデータの受信

アプリケーションは、リモート アプリケーション プロファイルがリソースを送信 、または、 ユーザーがリソースを要求した場合に、リソースを受け取ります。受信したリモート リソースは、TTetheringAppProfile コンポーネントを使って処理できます

リモート リソースの更新をサブスクライブすることもできます。リモート リソースの値が変更されると、アプリケーションはその変更を通知され、リモート リソースの新しい値を受け取ります。あるいは、グループを使ってリモート アプリケーションに接続している場合には、ローカル リソースを使ってリモート リソースをサブスクライブし、サブスクライブされたリモート リソースそれぞれに別個のメソッドを定義して更新を処理することができます。

リモート リソースを要求する

TTetheringAppProfile コンポーネントには GetRemoteResourceValue というメソッドが用意されており、これを使用してリモート リソースを要求することができます。

どのリモート リソースを要求するかは、以下のいずれかのパラメータで指定できます。

  • 目的のリモート リソースが含まれているリモート アプリケーション プロファイルを TTetheringProfileInfo のインスタンスとして指定するほか、そのリモート リソースの名前も指定する。
TTetheringManager コンポーネントの RemoteProfiles プロパティは、お使いのプロファイルに接続されているリモート アプリケーション プロファイルのリストを示します。
TTetheringAppProfile コンポーネントには GetRemoteProfileResources というメソッドが用意されています。このメソッドは、TTetheringProfileInfo のインスタンスとして指定されたリモート アプリケーション プロファイルが共有しているリモート リソースのリストを返します。

受信したリモート リソースを処理する

TTetheringAppProfile コンポーネントがリモート リソースを受信するのは、以下のいずれかの場合です。

  • リモート アプリケーション プロファイルが一時リソースを送信した。
  • 自分でリモート リソースを要求した。

TTetheringAppProfile コンポーネントがリソースを受け取ると、TTetheringAppProfile コンポーネントの 2 つのイベントが、まず OnAcceptResource、次に OnResourceReceived という順序で発生します。受信したリソースを処理するには、これらのイベントを処理しなければなりません。

OnAcceptResource Image.png

受信したリモート リソースを受け入れるか拒否するか

OnAcceptResource を処理して、受信したそのリソースを受け入れるかどうかを判断することができます。このイベントには次のパラメータが含まれています。

  • Sender: 送られてきたリソースを受け取ろうとしている TTetheringAppProfile コンポーネントです。
  • AProfileId: リソースを送信したリモート アプリケーション プロファイルの ProfileIdentifier です。TTetheringManager コンポーネントの RemoteProfiles プロパティには、自分のプロファイルに接続されたリモート アプリケーション プロファイルのリストが含まれています。そのリストを参照して、指定されたプロファイル ID に一致するリモート アプリケーション プロファイルを探すことができます。
  • AResourceTCustomRemoteItem のインスタンスです。リソースの Name や内容について記述された Hint など、ここに含まれているプロパティを読み取って、受信したリモート リソースを受け入れるかどうかを判断することができます。
  • AcceptResource: 論理値で、デフォルトは True です。受信したリソースを受け取りたくない場合には、この値を False に変更します。

受信したリモート リソースを読み取る

OnAcceptResource イベントを処理しない場合やイベント ハンドラで AcceptResource の値を False に変更しない場合は、OnResourceReceived イベントが発生します。このイベントを処理してリソースのデータを読み取ることができます。このイベントには次のパラメータが含まれています。

  • Sender: 送られてきたリソースを受け取ろうとしている TTetheringAppProfile コンポーネントです。
  • AResourceTRemoteResource のインスタンスです。TRemoteResource は、TCustomRemoteItem を拡張して次の 2 つのプロパティを追加し、リソースの実際の値にアクセスできるようにしたものです。
    • TRemoteResource.ResType: リソースが標準データ型を含んでいるか(TRemoteResourceType.Data)、TStream を含んでいるか(TRemoteResourceType.Stream)を示します。
    • TRemoteResource.Value: このプロパティで値にアクセスすることができます。値を取得する方法は次のとおりです。
      • 値が標準データ型の場合には、TRemoteResource.Value.DataType を見てデータの型を判断し、それに応じて、AsBoolean、AsInteger、AsInt64、AsSingle、AsDouble、AsString のいずれかを使って、TRemoteResource.Value プロパティを読み取ります。
      • 値がストリームの場合には、TRemoteResource.Value.AsStream を使ってストリームを読み取ります。

リモート リソースの更新をサブスクライブする

アプリケーションが、リソースを共有しているアプリケーションに接続している場合、その共有リソースの更新をサブスクライブして、接続先のアプリケーションで値が変更されたときにその共有リソースを受け取ることができます。

グループを使って他のアプリケーションに接続している場合には、設計時にリモート リソースとローカル リソースを関連付けることができます。そのローカル リソースのイベントを使用して、リモート リソースの値の変更を処理することができます。

あるいは、リソース名を使って実行時にリモート リソースをサブスクライブすることも可能です。

メモ: ローカル リソースと SubscribeToRemoteItem の両方を使ってリモート リソースをサブスクライブしてはなりません。 それぞれのリモート リソースについて、これらのサブスクライブ方法の一方だけを使用してください。

グループで接続されたアプリケーション上のリモート リソースをローカル リソースによってサブスクライブする

設計時にローカル リソースとリモート リソースを関連付けるには:

  1. 上述の手順でアプリケーション テザリングを使ってリソースを作成し共有します。
  2. 新規追加した TLocalResource をリソース リスト エディタで選択した状態で、[オブジェクト インスペクタ]Kind プロパティを Mirror に変更します。
TLocalResource Kind Property.png

TLocalResource の Kind を Mirror に変更すると、TLocalResource はリモート アプリケーションと共有されません。そうではなく、TLocalResource に指定した名前と同じ Name を持つリモート リソースの値が変更されるたびに、ローカル リソースの値が更新され、TLocalResource.OnResourceReceived イベントが発生します。

SubscribeToRemoteItem を使ってリモート リソースをサブスクライブする

TTetheringAppProfile コンポーネントには SubscribeToRemoteItem というメソッドが用意されており、これを使用してリモート リソースの更新をサブスクライブすることができます。

どのリモート リソースをサブスクライブするかは、次のどちらかのパラメータ セットで指定することができます。

  • 目的のリモート リソースが含まれているリモート アプリケーション プロファイルを TTetheringProfileInfo のインスタンスとして指定するほか、そのリモート リソースの名前も指定する。
TTetheringManager コンポーネントの RemoteProfiles プロパティは、お使いのプロファイルに接続されているリモート アプリケーション プロファイルのリストを示します。
  • 目的のリモート リソースが含まれているリモート アプリケーション プロファイルを TTetheringProfileInfo のインスタンスとして指定するほか、TCustomRemoteItem のインスタンスも指定する。
TTetheringAppProfile コンポーネントには GetRemoteProfileActions というメソッドが用意されています。このメソッドは、TTetheringProfileInfo のインスタンスとして指定されたリモート アプリケーション プロファイルで共有されているリモート リソースのリストを返します。

サブスクライブした TCustomRemoteItem インスタンスと同じ名前のリモート リソースの値が変化すると、サブスクライブした TCustomRemoteItem インスタンスの値が更新され、OnResourceUpdated イベントが発生します。

メモ:
  • サブスクライブした TCustomRemoteItem インスタンスから値を読み取るには、このインスタンスを TRemoteResource にキャストして、そのデータを読み取る必要があります。「受信したリモート リソースを読み取る」を参照してください。
  • ストリームをラップしているリモート リソースが変化すると、OnResourceUpdated イベントは発生しますが、サブスクライブした TCustomRemoteItem インスタンスの値は更新されません。新しいリソース値を手動で要求する必要があります。「リモート リソースを要求する」を参照してください。
  • ローカル リソースを使って同じリモート リソースをサブスクライブする場合は、OnResourceUpdated イベントは発生しません。

関連項目