|
|
|
Уведомление формы о событии в других модулях
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Опишу сначала ситуацию. Имеется приложение (Delphi XE8) с главной формой Form1 и DataModule, также могут быть другие формы, которые обращаются к DataModule. В DataModule находится компонент TFDConnection. Хочу реализовать отображение состояния TFDConnection на Form1. Прямое решение - мониторить состояние через таймер на Form1 мне кажется не очень верным, как и прямое обращение из DataModule в Form1. Из того что нагуглил: можно использовать Events и API.Messages. Т.е. при изменении состояния TFDConnection, код в DataModule вызывает своё TMessage (Events) а код в Form1 отлавливает его, проверяет состояние TFDConnection и отображает в своих компонентах состояние подключения. Можете посоветовать какой метод удобнее в данной ситуации и простенький примерчик или литературу? P.S. Извините, если вышло немного сумбурно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2019, 19:20 |
|
||
|
Уведомление формы о событии в других модулях
|
|||
|---|---|---|---|
|
#18+
derwesh, Ну и отправь сообщение Form1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2019, 19:25 |
|
||
|
Уведомление формы о событии в других модулях
|
|||
|---|---|---|---|
|
#18+
DesWind, RgisterMessage Post|Sendmessge If Messge= ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2019, 19:28 |
|
||
|
Уведомление формы о событии в других модулях
|
|||
|---|---|---|---|
|
#18+
DesWind, т.е. в данном случае удобнее использовать TMessages? Как-то так: PostMessage(Screen.Forms[0].Handle, ...); Это то, что нарыл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2019, 19:31 |
|
||
|
Уведомление формы о событии в других модулях
|
|||
|---|---|---|---|
|
#18+
derwesh, Нет, это надо открывать WIN API ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2019, 19:32 |
|
||
|
Уведомление формы о событии в других модулях
|
|||
|---|---|---|---|
|
#18+
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. Насколько я понял это сообщение всем программам в системе, наверное так и придётся делать, а есть ли возможность делать то-же в пределах одного приложения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2019, 19:39 |
|
||
|
Уведомление формы о событии в других модулях
|
|||
|---|---|---|---|
|
#18+
Это называется шаблон "Наблюдатель" Датамодуль Наблюдаемый он же observable Остальные формы модули Наблюдатели они же observer Получаем слабую связанность и удобное быстрое добавление наблюдателей https://refactoring.guru/ru/design-patterns/observer ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2019, 19:43 |
|
||
|
Уведомление формы о событии в других модулях
|
|||
|---|---|---|---|
|
#18+
DesWind, Для одного приложения у формы есть WndProc, которую достаточно перекрыть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2019, 20:42 |
|
||
|
Уведомление формы о событии в других модулях
|
|||
|---|---|---|---|
|
#18+
DesWind, Только для начала, надо разобраться в различии Send|Post ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2019, 20:53 |
|
||
|
Уведомление формы о событии в других модулях
|
|||
|---|---|---|---|
|
#18+
DesWind, спасибо, буду рыть в этом направлении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2019, 21:36 |
|
||
|
Уведомление формы о событии в других модулях
|
|||
|---|---|---|---|
|
#18+
derwesh, И посылай в параметрах сообщения сразу нужное состояние соединения, чтобы в форме уже не нужно было опрашивать датамодуль. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2019, 22:58 |
|
||
|
Уведомление формы о событии в других модулях
|
|||
|---|---|---|---|
|
#18+
Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2019, 01:58 |
|
||
|
Уведомление формы о событии в других модулях
|
|||
|---|---|---|---|
|
#18+
DataModule.Connection.OnConnect := Form1.ConnectionConnect ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2019, 16:08 |
|
||
|
Уведомление формы о событии в других модулях
|
|||
|---|---|---|---|
|
#18+
Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2019, 17:19 |
|
||
|
Уведомление формы о событии в других модулях
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Код: pascal 1. 2. 3. 4. 5. 6. Так будет уведомление лишь одной формы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2019, 21:45 |
|
||
|
Уведомление формы о событии в других модулях
|
|||
|---|---|---|---|
|
#18+
ну по уму конечно надо реализовывать схему паблишер-сабскрайбер, варианты реализации могут быть просто различны, начиная от банального наследника листа в который занести формы подписчики, а потом при возникновении события по листу дернуть у всех форм что нужно. Ну или смотреть в сторону mvc, биндингов и прочего ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2019, 10:12 |
|
||
|
Уведомление формы о событии в других модулях
|
|||
|---|---|---|---|
|
#18+
энди, Зачем городить велосипед, если вариант с перебором форм выше прекрасно будет работать? Единственное, я бы заменил .Perform() на PostNotifyMessage(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2019, 10:42 |
|
||
|
Уведомление формы о событии в других модулях
|
|||
|---|---|---|---|
|
#18+
DimaBrТак будет уведомление лишь одной формы ТС и не просил большего. Если нужно уведомлять несколько получателей, то можно создать класс-список хэндлеров и повесить на Datamodule.OnConnect метод объекта этого класса. В самом объекте уже реализовать добавление/удаление хэндлера и вызов хэндлеров по списку. В этом случае сам Datamodule никак не будет затронут, а формы будут подписываться на события через объект-мультихэндлер. Только надо не забыть либо подписать объект на удаление формы, либо из формы на FormClose удалять свой метод из списка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2019, 10:42 |
|
||
|
Уведомление формы о событии в других модулях
|
|||
|---|---|---|---|
|
#18+
Вариант с сообщениями безопасней в том плане, что при удалении формы ничего страшного не случится, просто сообщение будет послано невалидному хэндлу. Зато сообщения завязаны на gui и winAPI, а добавить хэндлер можно от любого объекта, будь то другой датамодуль или вообще поток. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2019, 10:50 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39812818&tid=2039487]: |
0ms |
get settings: |
6ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
422ms |
get topic data: |
15ms |
get forum data: |
4ms |
get page messages: |
66ms |
get tp. blocked users: |
1ms |
| others: | 220ms |
| total: | 746ms |

| 0 / 0 |
