В этой статье мы рассмотрим пример, в котором будет реализована возможность запуска Действий в удалённом приложении.
Список статей:
- App Tethering #1: Поиск и подключение к удалённым приложениям
- App Tethering #2: Используем удалённые действия (Actions)
- App Tethering #3: Передача и получение данных
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». Добавляем кнопку.
Чтобы действие было доступно для удалённого запуска, необходимо:
- Выбрать компонент «TTetheringAppProfile», у него свойство «Actions» и в открывшемся окне добавить новое Действие.
- Для нового действия, в свойстве «Action» выбрать уже существующее Действие, которые было создано в компоненте «TActionList».
- Теперь, данное действие можно запускать удалённо.
Есть два типа Действий (свойство 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
На этом всё.
В следующей статье мы научим приложения обмениваться данными.