OberonCore https://forum.oberoncore.ru/ |
|
Вложенные вьюшки https://forum.oberoncore.ru/viewtopic.php?f=24&t=6880 |
Страница 1 из 1 |
Автор: | Александр К [ Понедельник, 02 Январь, 2023 09:19 ] |
Заголовок сообщения: | Вложенные вьюшки |
Как динамически вставить в одну вьюшку в другую в заданном месте? Например, имеется тип: Код: 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); Как вставить эти две въюшки динамически одну под другой в третью, предположим в белый квадрат и как динамически их удалить оттуда? |
Автор: | Иван Денисов [ Понедельник, 02 Январь, 2023 14:59 ] |
Заголовок сообщения: | Re: Вложенные вьюшки |
Размещает другой вид на кадре команда Код: Views.InstallFrame(host: Frame; view: View; x, y, level: INTEGER; focus: BOOLEAN) Однако перед тем как размещать, вы для неё должны сделать "контекст". Это такой объект, который размеры задаёт. Посмотрите пример ObxTwins, там как раз показано, как сделать контекст, и как нарисовать — тоже. Если будут вопросы, пишите, сделаем примерчик попроще. |
Автор: | adimetrius [ Понедельник, 02 Январь, 2023 17:29 ] |
Заголовок сообщения: | Re: Вложенные вьюшки |
Смысл приведенного фрагмента программы неясен, я хочу уточнить. В ответ на сообщение Controllers.TrackMsg вы рисуете что-то на холсте в зависимости от состояния переменной - от obj.sought. Скорее всего, это нарисованное немедленно исчезнет с экрана, если вообще станет заметно. Поскольку по окончании отработки щелчка мышью ББ попробует перерисовать экран (ну, почти), для этого вызовет ваш Restore, и все вернется на прежнее место. Поэтому вопрос. Если вы хотите, чтобы что-то было нарисовано, пока не отпущена мышь - надо организовать цикл, напр REPEAT ... f.Input(_, _, isDown, _) UNTIL ~isDown Если вы хотите, чтобы после щелчка объект и далее отрисовывался иначе - то нужно изменить состояние obj, сообщить ББ, что obj требует отрисовки Views.Update(obj, Views.keepFrames) и учесть это в Restore - в зависимости от состояния рисовать stamp по-разному. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |