Важно (9.07.22)

Если картинки в постах не отображаются, зайдите в блог через прокси. РКН заблокировал поддомены blogger.com на которые загружались картинки.

пятница, 3 апреля 2015 г.

App Tethering #2: Используем удалённые действия (Actions)

В этой статье мы рассмотрим пример, в котором будет реализована возможность запуска Действий в удалённом приложении.










Список статей:

p.s. Все права на картинку принадлежат Embarcadero Technologies, Inc.


Перед тем как запустить удалённое действие, необходимо соединиться с удалённым приложением, как это сделать, читайте в предыдущей статье «App Tethering: Поиск и подключение к удалённым приложениям».

Если вы уже выбрали удобный для вас способ соединения, то давайте приступим к реализации возможности «запуск удалённых действий». Для данного примера, я выбрал автоматический режим подключения, чтобы было поменьше кода и не пришлось затрагивать тему подключения снова.

Создадим два проекта (или можете скачать первый пример из предыдущей статьи), первый назовём «Server», второй «Client». Такие названия я выбрал для наглядности. Теперь, в каждом проекте добавляем на форму компоненты «TTetheringManager» и «TTetheringAppProfile» и изменяем свойства (дублируя):

TTetheringManager
  • AllowedAdapters: Network – выбираем тип подключения
  • Enabled: True 
  • Password: 12345 – Устанавливаем пароль на подключение
  • Name и Text: TMServer и TMClient – это имя менеджера для каждого проекта, оно будет отображаться в информации о подключении
TTetheringAppProfile
  • Enabled: True 
  • Group: Test – это свойство определяет группу профилей, которые будут автоматически соединяться
  • Manager – выбираем менеджер, который лежит на форме рядом профилем
  • Name и Text: TAPServer и TAPClient – это имя профиля, будет отображаться при запросе списка доступных профилей
Теперь для наглядности добавим несколько компонентов, которые помогут нам определить, удалось ли установить соединение между приложениями. В каждом проекте положим на форму: 1 – TLabel, 1 – TMemo.

Далее, в каждом проекте мы создадим какое-нибудь действие. Как создавать действия, подробно написано в справке (FMX и VCL) (ничего сложного нет). У меня, это будет обычное заполнение компонента «TMemo» текстом.
Кладём на форму компонент «TActionList» и добавляем новое Действие и обработчик события «OnExecute». Добавляем кнопку. 

Чтобы действие было доступно для удалённого запуска, необходимо:
  1. Выбрать компонент «TTetheringAppProfile», у него свойство «Actions» и в открывшемся окне добавить новое Действие.
  2. Для нового действия, в свойстве «Action» выбрать уже существующее Действие, которые было создано в компоненте «TActionList».
  3. Теперь, данное действие можно запускать удалённо.
Есть два типа Действий (свойство Kind):
  • Расшаренное/общее (Shared) – действие, которое определено локально и его можно будет запускать из любого подключившегося приложения.
  • Зеркальное (Mirror) – действие, которое не определено локально. Такое действие является как бы «ярлыком» для удалённого, расшаренного действия. Такое действие может выполнять только удалённое действие и имя действия должно совпадать с именем удалённого действия.
Использование подхода «Shared + Mirror» удобно, в случае если у вас, например два приложения, одно основное установлено на ноутбуке и второе установлено на мобильном устройстве. Второе приложение должно полностью дублировать функционал основного приложения, проще говоря, удалённое управление основным приложением. 
Например: У вас есть музыкальный плеер на ПК, подключённом к аудиосистеме и вы хотите управлять плеером из любой комнаты в квартире. Вы создаёте второе приложение, кидаете кнопки управления и создаёте для них действия со свойством «Kind: Mirror». И всё, не нужно писать какой-то код, этого будет достаточно, чтобы управлять основным приложением, т.е. плеером на ноутбуке (прим. Я специально опустил момент с настройкой подключения).

Я написал небольшой пример. В данном примере, у кнопки "Запустить действие" изменено свойство "Action", в котором указано зеркальное Действие.

Проект «Server»:


Проект «Client»:


Запускаем приложение «Server» и приложение «Client», в приложении «Client» жмём кнопку «Запустить действие» и видим, как в приложении «Server» появился текст.

На скриншоте видно результат работы:


Исходники примера: Скачать с Google Drive

Действия можно запускать при помощи метода «RunRemoteAction» у компонента «TTetheringAppProfile», указав в параметрах удалённый профиль и имя действия, которое необходимо выполнить. Или просто получив список удалённых действий при помощи метода «GetRemoteProfileActions» у компонента «TTetheringAppProfile». Как получать список доступных менеджеров (метод «RemoteManagers» у компонента «TTetheringManager») и профилей (свойство «RemoteProfiles» у компонента «TTetheringManager») мы знаем из прошлой статьи, чтобы получить список подключённых профилей, можно воспользоваться методом «GetConnectedProfiles» (вернёт массив профилей), либо свойством «ConnectedProfiles» (вернёт список профилей) у компонента «TTetheringAppProfile»

Внесём изменения в предыдущий проект.
Проект «Server» оставляем таким же.

Проект «Client»:
  • Убираем с формы «TActionList».
  • Удаляем действие из компонента «TTetheringAppProfile»
  • Пишем обработчик события OnClick у кнопки.
Скриншоты проекта «Client»:



Код кнопки, вызывающей удалённое действие в проекте «Server»:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  if TAPClient.ConnectedProfiles.Count > 0 then
  begin
    for i := 0 to TAPClient.ConnectedProfiles.Count - 1 do
    begin
      if TAPClient.ConnectedProfiles[i].ProfileText = 'TAPServer' then
      begin
         TAPClient.RunRemoteAction(TAPClient.ConnectedProfiles[i], 'acAddTextServer');
      end;
    end;
  end;
end;

Результат запуска будет как в предыдущем примере.

Исходники примера: Скачать с Google Drive

На этом всё.

В следующей статье мы научим приложения обмениваться данными.