Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Какой простой способ передачи сообщений между формами TForm в Delphi 12 FMX для Android?

Delphi , Программа и Интерфейс , MDI приложения

Передача сообщений между формами в Delphi 12 FMX для Android

В разработке приложений на Delphi часто возникает необходимость организовать взаимодействие между различными формами. В этой статье мы рассмотрим несколько эффективных способов передачи сообщений между формами в Delphi 12 FMX, особенно актуальных для Android-приложений.

Система сообщений TMessageManager

Начиная с Delphi XE7, Embarcadero ввела в RTL мощную систему сообщений через класс TMessageManager. Этот механизм позволяет организовать слабосвязанное взаимодействие между компонентами приложения.

Пример реализации

  1. Создаем общий модуль для определения типа сообщения:
unit SharedMessages;

interface

uses
  System.Messaging;

type
  TIntegerMessage = class(TMessage<Integer>);

implementation

end.
  1. Форма-получатель (FormA):
unit FormAUnit;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  SharedMessages, System.Messaging;

type
  TFormA = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    procedure HandleIntegerMessage(const Sender: TObject; const M: TMessage);
  public
    { Public declarations }
  end;

implementation

{$R *.fmx}

procedure TFormA.FormCreate(Sender: TObject);
begin
  TMessageManager.DefaultManager.SubscribeToMessage(TIntegerMessage, HandleIntegerMessage);
end;

procedure TFormA.FormDestroy(Sender: TObject);
begin
  TMessageManager.DefaultManager.Unsubscribe(TIntegerMessage, HandleIntegerMessage);
end;

procedure TFormA.HandleIntegerMessage(const Sender: TObject; const M: TMessage);
var
  Msg: TIntegerMessage;
begin
  Msg := M as TIntegerMessage;
  case Msg.Value of
    1: ShowMessage('Получено сообщение 1');
    2: ShowMessage('Получено сообщение 2');
    999: 
    begin
      ShowMessage('Выполняем задачу 999');
      // Дополнительные действия для задачи 999
    end;
  end;
end;

end.
  1. Форма-отправитель (FormB):
unit FormBUnit;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.StdCtrls, FMX.Edit, SharedMessages, System.Messaging;

type
  TFormB = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

implementation

{$R *.fmx}

procedure TFormB.Button1Click(Sender: TObject);
var
  Value: Integer;
begin
  if TryStrToInt(Edit1.Text, Value) then
    TMessageManager.DefaultManager.SendMessage(Self, TIntegerMessage.Create(Value))
  else
    ShowMessage('Введите целое число');
end;

end.

Преимущества этого подхода:

  1. Слабая связность - формы не ссылаются друг на друга напрямую
  2. Гибкость - можно легко добавить новые типы сообщений
  3. Масштабируемость - несколько форм могут подписаться на одно сообщение

Альтернативные методы передачи сообщений

1. Использование интерфейсов

unit IMessageReceiver;

interface

type
  IMessageReceiver = interface
    ['{GUID}']
    procedure ReceiveMessage(Value: Integer);
  end;

implementation

end.

FormA реализует интерфейс, FormB вызывает методы интерфейса.

2. События и делегаты

type
  TMessageEvent = procedure(Value: Integer) of object;

// В FormB объявляем событие
property OnMessage: TMessageEvent;

// В FormA подписываемся на событие
FormB.OnMessage := HandleMessage;

// В FormB вызываем событие
if Assigned(OnMessage) then
  OnMessage(999);

3. VSoft.Messaging

Как упомянул JonRobertson, библиотека VSoft.Messaging предлагает альтернативную реализацию системы сообщений:

uses
  VSoft.Messaging;

// Подписка
MessageBus.Subscribe<TIntegerMessage>(HandleMessage);

// Отправка
MessageBus.Post<TIntegerMessage>.Value(999).Dispatch;

Рекомендации для Android-разработки

При работе с FMX на Android учитывайте:

  1. Жизненный цикл приложения - отписывайтесь от сообщений при деактивации формы
  2. Потоки - сообщения могут приходить из разных потоков, используйте синхронизацию
  3. Производительность - избегайте передачи больших объемов данных через сообщения

Заключение

Система сообщений через TMessageManager - это современный, гибкий и эффективный способ организации взаимодействия между формами в Delphi. Она особенно полезна в сложных приложениях с множеством форм и компонентов. Для простых случаев можно использовать более традиционные подходы с событиями или интерфейсами.

Выбор конкретного метода зависит от сложности вашего приложения и личных предпочтений. Главное - соблюдать принципы слабой связанности и поддерживать чистоту кода.

Создано по материалам из источника по ссылке.

Контекст описывает методы передачи сообщений между формами в Delphi 12 FMX для Android, включая использование TMessageManager, интерфейсов, событий и альтернативных библиотек.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: MDI приложения ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-08-27 09:35:26/0.0037739276885986/0