Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Уведомление формы о событии в других модулях / 19 сообщений из 19, страница 1 из 1
09.05.2019, 19:20
    #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
09.05.2019, 19:25
    #39811739
DesWind
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уведомление формы о событии в других модулях
derwesh,

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

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

Нет, это надо открывать WIN API
...
Рейтинг: 0 / 0
09.05.2019, 19:39
    #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
09.05.2019, 19:43
    #39811746
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уведомление формы о событии в других модулях
Это называется шаблон "Наблюдатель"

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

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

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

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

И посылай в параметрах сообщения сразу нужное состояние соединения, чтобы в форме уже не нужно было опрашивать датамодуль.
...
Рейтинг: 0 / 0
10.05.2019, 01:58
    #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
13.05.2019, 16:08
    #39812588
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уведомление формы о событии в других модулях
DataModule.Connection.OnConnect := Form1.ConnectionConnect ?
...
Рейтинг: 0 / 0
13.05.2019, 17:19
    #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
13.05.2019, 21:45
    #39812678
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уведомление формы о событии в других модулях
_Vasilisk_
Код: pascal
1.
2.
3.
4.
5.
6.
procedure TMyForm.FormCreate(Sender: TObject);
begin
  ..........
  MyDataModule.OnConnect = DoConnect;
  ..........
end;


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

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


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