Передача сообщений между формами в Delphi 12 FMX для Android
В разработке приложений на Delphi часто возникает необходимость организовать взаимодействие между различными формами. В этой статье мы рассмотрим несколько эффективных способов передачи сообщений между формами в Delphi 12 FMX, особенно актуальных для Android-приложений.
Система сообщений TMessageManager
Начиная с Delphi XE7, Embarcadero ввела в RTL мощную систему сообщений через класс TMessageManager. Этот механизм позволяет организовать слабосвязанное взаимодействие между компонентами приложения.
Пример реализации
Создаем общий модуль для определения типа сообщения:
unit SharedMessages;
interface
uses
System.Messaging;
type
TIntegerMessage = class(TMessage<Integer>);
implementation
end.
Форма-получатель (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.
Форма-отправитель (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. Использование интерфейсов
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 предлагает альтернативную реализацию системы сообщений:
Жизненный цикл приложения - отписывайтесь от сообщений при деактивации формы
Потоки - сообщения могут приходить из разных потоков, используйте синхронизацию
Производительность - избегайте передачи больших объемов данных через сообщения
Заключение
Система сообщений через TMessageManager - это современный, гибкий и эффективный способ организации взаимодействия между формами в Delphi. Она особенно полезна в сложных приложениях с множеством форм и компонентов. Для простых случаев можно использовать более традиционные подходы с событиями или интерфейсами.
Выбор конкретного метода зависит от сложности вашего приложения и личных предпочтений. Главное - соблюдать принципы слабой связанности и поддерживать чистоту кода.
Контекст описывает методы передачи сообщений между формами в Delphi 12 FMX для Android, включая использование TMessageManager, интерфейсов, событий и альтернативных библиотек.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.