OberonCore

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

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




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Вложенные вьюшки
СообщениеДобавлено: Понедельник, 02 Январь, 2023 09:19 

Зарегистрирован: Воскресенье, 06 Август, 2017 19:33
Сообщения: 79
Как динамически вставить в одну вьюшку в другую в заданном месте? Например, имеется тип:
Код:
stamp = POINTER TO RECORD (Views.View)
      sought, fixed: BOOLEAN;
   END;

его отрисовка и поведение и инициация:
Код:
PROCEDURE GetThickness (f: Views.Frame): INTEGER;
BEGIN
   RETURN 10 * f.dot
END GetThickness;

PROCEDURE GetSideSize (f: Views.Frame): INTEGER;
BEGIN
   RETURN 100 * f.dot
END GetSideSize;

PROCEDURE (obj: stamp) Restore (f: Views.Frame; l, t, r, b: INTEGER);
VAR
   sideSize, thickness, space: INTEGER;
BEGIN
   sideSize := GetSideSize (f);
   thickness := GetThickness (f);
   space := thickness * 2;
   f.DrawRect (0, 0, sideSize, sideSize, thickness, Ports.grey25)   
END Restore;

PROCEDURE (obj: stamp) HandleCtrlMsg (f: Views.Frame; VAR msg: Controllers.Message; VAR focus: Views.View);
VAR
   sideSize, thickness, space: INTEGER;
BEGIN
   WITH msg: Controllers.TrackMsg DO
      IF ~obj.fixed THEN
         sideSize := GetSideSize (f);
         thickness := GetThickness (f);
         space := thickness * 2;
         IF obj.sought THEN
            f.DrawLine (space, space, sideSize - space, sideSize - space, thickness, Ports.red);
            f.DrawLine (sideSize - space, space, space, sideSize - space, thickness, Ports.red);
            f.DrawLine (sideSize - space, space, space, sideSize - space, thickness, Ports.red);
         ELSE
            f.DrawLine (space, 40 * f.dot, 50 * f.dot, sideSize - space, thickness, Ports.green);
            f.DrawLine (50 * f.dot, sideSize - space, sideSize - space, space, thickness, Ports.green);
         END
      END
   ELSE
   END
END HandleCtrlMsg;

PROCEDURE (obj: stamp) Init (flag: BOOLEAN), NEW;
BEGIN
   obj.fixed := FALSE;
   obj.sought := flag
END InitT;

Создаю два объекта и инициализирую их по-разному:
Код:
NEW (obj1);
obj1.Init (TRUE);
NEW (obj2);
obj2.Init (FALSE);

Как вставить эти две въюшки динамически одну под другой в третью, предположим в белый квадрат и как динамически их удалить оттуда?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вложенные вьюшки
СообщениеДобавлено: Понедельник, 02 Январь, 2023 14:59 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Размещает другой вид на кадре команда
Код:
Views.InstallFrame(host: Frame; view: View; x, y, level: INTEGER; focus: BOOLEAN)

Однако перед тем как размещать, вы для неё должны сделать "контекст". Это такой объект, который размеры задаёт.
Посмотрите пример ObxTwins, там как раз показано, как сделать контекст, и как нарисовать — тоже.
Если будут вопросы, пишите, сделаем примерчик попроще.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вложенные вьюшки
СообщениеДобавлено: Понедельник, 02 Январь, 2023 17:29 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Смысл приведенного фрагмента программы неясен, я хочу уточнить.

В ответ на сообщение Controllers.TrackMsg вы рисуете что-то на холсте в зависимости от состояния переменной - от obj.sought.

Скорее всего, это нарисованное немедленно исчезнет с экрана, если вообще станет заметно. Поскольку по окончании отработки щелчка мышью ББ попробует перерисовать экран (ну, почти), для этого вызовет ваш Restore, и все вернется на прежнее место.
Поэтому вопрос.
Если вы хотите, чтобы что-то было нарисовано, пока не отпущена мышь - надо организовать цикл, напр
REPEAT ... f.Input(_, _, isDown, _) UNTIL ~isDown
Если вы хотите, чтобы после щелчка объект и далее отрисовывался иначе - то нужно изменить состояние obj, сообщить ББ, что obj требует отрисовки Views.Update(obj, Views.keepFrames) и учесть это в Restore - в зависимости от состояния рисовать stamp по-разному.


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

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


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

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


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

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