OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 29 Март, 2024 13:30

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
СообщениеДобавлено: Пятница, 10 Март, 2023 16:18 

Зарегистрирован: Воскресенье, 06 Август, 2017 19:33
Сообщения: 79
Как из одного объекта вызвать метод другого? Например я нажимаю на кнопку с цифрой 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 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Не обязательно сообщение. Можете сделать ссылку на первое отображение в поле второго
Код:
View2 = POINTER TO RECORD (Views.View)
      v1: View1;
      model: Model
END;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 10 Март, 2023 17:25 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1163
не очень понятно, что вы пытаетесь сделать. вы можете послать broadcast-сообщение, конечно, но я сильно подозреваю, что вашу задачу можно решить иначе, проще. опишите, пожалуйста, именно общую задачу, а не ваше решение: так можно будет посоветовать разные методы.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 11 Март, 2023 07:06 

Зарегистрирован: Воскресенье, 06 Август, 2017 19:33
Сообщения: 79
Я пишу программу, чертящую графики по точкам. Собственно Model содержит список точек, View2 служит для ручного редактирования этого списка и для пометки точек, он также выводит таблицу с координатами, View1 строит сам график, причём его метод A делает вычисления над некоторыми точками. Я хочу, чтобы метод A вызывался только при редактировании списка, но не при пометке точек. Мне ещё хочется сделать, чтобы при нажатии на графике в таблице помечались точки, т.е. из View1 вызывался метод B.

Способ, предложенный Иваном Денисовым не годится: в случае, если я захочу заменить View1 на другой, строящий графики по другому принципу, или View2 заменить на другой, вводящий данные с внешнего устройства, скажем, с вольтметра, то мне придётся всё перекомпилировать снова. Я же хочу перекомпилировать только внешний модуль, собирающий View1, View2, Model воедино в процедуре Start, изменяя в нём лишь строку импорта.

Думается, раз у них Model общий, значит можно как-то через него осуществить это, но как именно - не знаю.


Вложения:
Модель.PNG
Модель.PNG [ 2.26 КБ | Просмотров: 3850 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 11 Март, 2023 12:30 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1163
если я правильно понял, то у вас получается shared state: информация об отметке и прочем живёт в модели. соответственно, можно (и нужно) делать `Models.Broadcast()` при изменении состояний модели, и ловить это во вьюхах. придётся, натурально, определить набор операций над моделью, чтобы указывать в броадкаст-сообщении что именно поменялось. но это технические детали. это тот самый механизм, который сама среда и использует, чтобы сказать вьюшкам, что модель поменялась.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 11 Март, 2023 12:35 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Посмотрите пример ObxViews12, там как раз сообщение модели посылается.

Чтобы сообщения от модели доходили до вида надо не забыть их объединить в один домен:
Stores.Join(v, m);


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 11 Март, 2023 12:57 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1163
(sidenote: кажется, в Obx есть ответы если не на все, то почти на все вопросы, надо их только найти. каждый раз недооцениваю эти примеры. ;-)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB