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 общий, значит можно как-то через него осуществить это, но как именно - не знаю.

Вложения:
Модель.PNG
Модель.PNG [ 2.26 КБ | Просмотров: 4045 ]

Автор:  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/