powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Уведомление формы о событии в других модулях
19 сообщений из 19, страница 1 из 1
Уведомление формы о событии в других модулях
    #39811735
derwesh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Опишу сначала ситуацию. Имеется приложение (Delphi XE8) с главной формой Form1 и DataModule, также могут быть другие формы, которые обращаются к DataModule.
В DataModule находится компонент TFDConnection. Хочу реализовать отображение состояния TFDConnection на Form1. Прямое решение - мониторить состояние через таймер на Form1 мне кажется не очень верным, как и прямое обращение из DataModule в Form1.
Из того что нагуглил: можно использовать Events и API.Messages. Т.е. при изменении состояния TFDConnection, код в DataModule вызывает своё TMessage (Events) а код в Form1 отлавливает его, проверяет состояние TFDConnection и отображает в своих компонентах состояние подключения.
Можете посоветовать какой метод удобнее в данной ситуации и простенький примерчик или литературу?
P.S. Извините, если вышло немного сумбурно.
...
Рейтинг: 0 / 0
Уведомление формы о событии в других модулях
    #39811739
DesWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
derwesh,

Ну и отправь сообщение Form1
...
Рейтинг: 0 / 0
Уведомление формы о событии в других модулях
    #39811741
DesWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DesWind,

RgisterMessage
Post|Sendmessge
If Messge=
...
Рейтинг: 0 / 0
Уведомление формы о событии в других модулях
    #39811742
derwesh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DesWind, т.е. в данном случае удобнее использовать TMessages? Как-то так: PostMessage(Screen.Forms[0].Handle, ...); Это то, что нарыл.
...
Рейтинг: 0 / 0
Уведомление формы о событии в других модулях
    #39811744
DesWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
derwesh,

Нет, это надо открывать WIN API
...
Рейтинг: 0 / 0
Уведомление формы о событии в других модулях
    #39811745
derwesh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DesWind, это имеете ввиду?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
var
  FM_FINDPHOTO: Integer;

  // Для того, чтобы использовать hwnd_Broadcast нужно
  // сперва зарегистрировать уникальное сообщение.

initialization
  FM_FindPhoto := RegisterWindowMessage('MyMessageToAll');

  // Чтобы поймать это сообщение в другом приложении
  // (приемнике) нужно перекрыть DefaultHandler

procedure TForm1.DefaultHandler(var Message);
begin
  with TMessage(Message) do
  begin
    if Msg = Fm_FindPhoto then
      MyHandler(WPARAM, LPARAM)
    else
      inherited DefaultHandler(Message);
  end;
end;

// А теперь можно в приложении-передатчике
SendMessage(HWND_BROADCAST, FM_FINDPHOTO, 0, 0);


Насколько я понял это сообщение всем программам в системе, наверное так и придётся делать, а есть ли возможность делать то-же в пределах одного приложения?
...
Рейтинг: 0 / 0
Уведомление формы о событии в других модулях
    #39811746
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это называется шаблон "Наблюдатель"

Датамодуль Наблюдаемый он же observable
Остальные формы модули Наблюдатели они же observer

Получаем слабую связанность и удобное быстрое добавление наблюдателей

https://refactoring.guru/ru/design-patterns/observer
...
Рейтинг: 0 / 0
Уведомление формы о событии в других модулях
    #39811758
DesWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DesWind,
Для одного приложения у формы есть WndProc, которую достаточно перекрыть
...
Рейтинг: 0 / 0
Уведомление формы о событии в других модулях
    #39811760
DesWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DesWind,

Только для начала, надо разобраться в различии Send|Post
...
Рейтинг: 0 / 0
Уведомление формы о событии в других модулях
    #39811763
derwesh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DesWind, спасибо, буду рыть в этом направлении.
...
Рейтинг: 0 / 0
Уведомление формы о событии в других модулях
    #39811770
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
derwesh,

И посылай в параметрах сообщения сразу нужное состояние соединения, чтобы в форме уже не нужно было опрашивать датамодуль.
...
Рейтинг: 0 / 0
Уведомление формы о событии в других модулях
    #39811786
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
const
  WM_MyConnect = WM_USER + 1;

TForm1 = class(TForm)

  procedure WMMyConnect(var Message: TMessage); message WM_MyConnect;
end;


procedure TDataModule.DoAfterConnect(Sender: TObject);
var i: integer;
begin
  for i := 0 to Screen.FormCount-1 do
    Screen.Forms[i].Perform(WM_MyConnect, integer(FDConnection1.Connected),0);
end;
...
Рейтинг: 0 / 0
Уведомление формы о событии в других модулях
    #39812588
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DataModule.Connection.OnConnect := Form1.ConnectionConnect ?
...
Рейтинг: 0 / 0
Уведомление формы о событии в других модулях
    #39812620
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
type
  TOnConnect = procedure(ASender: TObject; AConnect: Boolean) of object;

  TMyDataModule = class(TDataModule)
    ..........
  strict private
    FOnConnect: TOnConnect;
    procedure DoConnectChange(AConnect: Boolean);
  public
    property OnConnect: TOnConnect read FOnConnect write FOnConnect;
  end;

procedure TMyDataModule.DoConnectChange(AConnect: Boolean);
begin
  if Assigned(FOnConnect)
    FOnConnect(Self, AConnect);
end;

.................

procedure TMyForm.FormCreate(Sender: TObject);
begin
  ..........
  MyDataModule.OnConnect = DoConnect;
  ..........
end;

procedure TMyForm.FormDestroy(Sender: TObject);
begin
  ..........
  MyDataModule.OnConnect = nil;
  ..........
end;

procedure TMyForm.DoConnect(ASender: TObject; AConnect: Boolean);
begin
  ..........
end;
...
Рейтинг: 0 / 0
Уведомление формы о событии в других модулях
    #39812678
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Код: pascal
1.
2.
3.
4.
5.
6.
procedure TMyForm.FormCreate(Sender: TObject);
begin
  ..........
  MyDataModule.OnConnect = DoConnect;
  ..........
end;


Так будет уведомление лишь одной формы
...
Рейтинг: 0 / 0
Уведомление формы о событии в других модулях
    #39812818
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну по уму конечно надо реализовывать схему паблишер-сабскрайбер, варианты реализации могут быть просто различны, начиная от банального наследника листа в который занести формы подписчики, а потом при возникновении события по листу дернуть у всех форм что нужно.
Ну или смотреть в сторону mvc, биндингов и прочего
...
Рейтинг: 0 / 0
Уведомление формы о событии в других модулях
    #39812841
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
энди,

Зачем городить велосипед, если вариант с перебором форм выше прекрасно будет работать?
Единственное, я бы заменил .Perform() на PostNotifyMessage().
...
Рейтинг: 0 / 0
Уведомление формы о событии в других модулях
    #39812842
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBrТак будет уведомление лишь одной формы
ТС и не просил большего.
Если нужно уведомлять несколько получателей, то можно создать класс-список хэндлеров и повесить на Datamodule.OnConnect метод объекта этого класса. В самом объекте уже реализовать добавление/удаление хэндлера и вызов хэндлеров по списку. В этом случае сам Datamodule никак не будет затронут, а формы будут подписываться на события через объект-мультихэндлер. Только надо не забыть либо подписать объект на удаление формы, либо из формы на FormClose удалять свой метод из списка.
...
Рейтинг: 0 / 0
Уведомление формы о событии в других модулях
    #39812847
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант с сообщениями безопасней в том плане, что при удалении формы ничего страшного не случится, просто сообщение будет послано невалидному хэндлу. Зато сообщения завязаны на gui и winAPI, а добавить хэндлер можно от любого объекта, будь то другой датамодуль или вообще поток.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Уведомление формы о событии в других модулях
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]