OberonCore https://forum.oberoncore.ru/ |
|
Вызов метода одного объекта из другого https://forum.oberoncore.ru/viewtopic.php?f=23&t=6914 |
Страница 1 из 1 |
Автор: | Александр К [ Пятница, 10 Март, 2023 16:18 ] |
Заголовок сообщения: | Вызов метода одного объекта из другого |
Как из одного объекта вызвать метод другого? Например я нажимаю на кнопку с цифрой 2 и хочу вызвать метод А: Код: TYPE Model = POINTER TO RECORD (Models.Model) END; View1 = POINTER TO RECORD (Views.View) model: Model END; View2 = POINTER TO RECORD (Views.View) model: Model END; PROCEDURE (obj: View1) A, NEW; ... END A; PROCEDURE (obj: View2) HandleCtrlMsg (f: Views.Frame; VAR msg: Controllers.Message; VAR focus: Views.View); BEGIN WITH msg: Controllers.EditMsg DO IF msg.op = Controllers.pasteChar THEN IF msg.char = "2" THEN (* как из этого места вызвать метод А? *) END END ELSE END END HandleCtrlMsg; PROCEDURE Start*; VAR v1: View1; v2: View2; m: Model; BEGIN NEW (m); ... NEW (v1); v1.model := m; ... NEW (v2); v2.model := m; ... END Start; Если не ошибаюсь тут надо передать ему сообщение? Или как? |
Автор: | Иван Денисов [ Пятница, 10 Март, 2023 17:18 ] |
Заголовок сообщения: | Re: Вызов метода одного объекта из другого |
Не обязательно сообщение. Можете сделать ссылку на первое отображение в поле второго Код: View2 = POINTER TO RECORD (Views.View)
v1: View1; model: Model END; |
Автор: | arisu [ Пятница, 10 Март, 2023 17:25 ] |
Заголовок сообщения: | Re: Вызов метода одного объекта из другого |
не очень понятно, что вы пытаетесь сделать. вы можете послать broadcast-сообщение, конечно, но я сильно подозреваю, что вашу задачу можно решить иначе, проще. опишите, пожалуйста, именно общую задачу, а не ваше решение: так можно будет посоветовать разные методы. |
Автор: | Александр К [ Суббота, 11 Март, 2023 07:06 ] | ||
Заголовок сообщения: | Re: Вызов метода одного объекта из другого | ||
Я пишу программу, чертящую графики по точкам. Собственно Model содержит список точек, View2 служит для ручного редактирования этого списка и для пометки точек, он также выводит таблицу с координатами, View1 строит сам график, причём его метод A делает вычисления над некоторыми точками. Я хочу, чтобы метод A вызывался только при редактировании списка, но не при пометке точек. Мне ещё хочется сделать, чтобы при нажатии на графике в таблице помечались точки, т.е. из View1 вызывался метод B. Способ, предложенный Иваном Денисовым не годится: в случае, если я захочу заменить View1 на другой, строящий графики по другому принципу, или View2 заменить на другой, вводящий данные с внешнего устройства, скажем, с вольтметра, то мне придётся всё перекомпилировать снова. Я же хочу перекомпилировать только внешний модуль, собирающий View1, View2, Model воедино в процедуре Start, изменяя в нём лишь строку импорта. Думается, раз у них Model общий, значит можно как-то через него осуществить это, но как именно - не знаю.
|
Автор: | arisu [ Суббота, 11 Март, 2023 12:30 ] |
Заголовок сообщения: | Re: Вызов метода одного объекта из другого |
если я правильно понял, то у вас получается shared state: информация об отметке и прочем живёт в модели. соответственно, можно (и нужно) делать `Models.Broadcast()` при изменении состояний модели, и ловить это во вьюхах. придётся, натурально, определить набор операций над моделью, чтобы указывать в броадкаст-сообщении что именно поменялось. но это технические детали. это тот самый механизм, который сама среда и использует, чтобы сказать вьюшкам, что модель поменялась. |
Автор: | Иван Денисов [ Суббота, 11 Март, 2023 12:35 ] |
Заголовок сообщения: | Re: Вызов метода одного объекта из другого |
Посмотрите пример ObxViews12, там как раз сообщение модели посылается. Чтобы сообщения от модели доходили до вида надо не забыть их объединить в один домен: Stores.Join(v, m); |
Автор: | arisu [ Суббота, 11 Март, 2023 12:57 ] |
Заголовок сообщения: | Re: Вызов метода одного объекта из другого |
(sidenote: кажется, в Obx есть ответы если не на все, то почти на все вопросы, надо их только найти. каждый раз недооцениваю эти примеры. ;-) |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |