OberonCore
https://forum.oberoncore.ru/

Как заменить содержимое окна?
https://forum.oberoncore.ru/viewtopic.php?f=23&t=4151
Страница 1 из 1

Автор:  Иван Денисов [ Вторник, 13 Ноябрь, 2012 19:02 ]
Заголовок сообщения:  Как заменить содержимое окна?

При разработке последовательных GUI возник вопрос, как заменить содержимое окна на закрывая его?

Автор:  Пётр Кушнир [ Вторник, 13 Ноябрь, 2012 19:19 ]
Заголовок сообщения:  Re: Как заменить содержимое окна?

Ну, например, если в режиме Layout выбрать через Ctrl+Пробел всю форму, а потом добавить скроллер через меню, то в окне появятся полосы прокрутки, что, в свою очередь (а также, сырцы модуля Documents) наталкивают на мысль о том, что Contollers.ReplaceViewMsg отлично работает в режиме раскладки. Насчёт других режимов неясно.

А вообще, самый простой путь писать ещё одну форму сверху и её стирать при ненадобности. Я так делал в подсистеме Wizard.

Автор:  Иван Денисов [ Вторник, 13 Ноябрь, 2012 20:39 ]
Заголовок сообщения:  Re: Как заменить содержимое окна?

Пётр Кушнир писал(а):
Ну, например, если в режиме Layout выбрать через Ctrl+Пробел всю форму, а потом добавить скроллер через меню, то в окне появятся полосы прокрутки, что, в свою очередь (а также, сырцы модуля Documents) наталкивают на мысль о том, что Contollers.ReplaceViewMsg отлично работает в режиме раскладки. Насчёт других режимов неясно.

А вообще, самый простой путь писать ещё одну форму сверху и её стирать при ненадобности. Я так делал в подсистеме Wizard.

Пётр, пожалуйста, напишите немного подробнее. Я скачал Wizard но не могу найти место где вы "пишете форму поверх"... помогите разобраться.

Автор:  Пётр Кушнир [ Среда, 14 Ноябрь, 2012 00:42 ]
Заголовок сообщения:  Re: Как заменить содержимое окна?

О, мне конечно жутко стыдно, пушо там куча кода, который я пилил ещё в первый год знакомства с ББ.
Вообще, замена форм мне понадобилась при проигрывании визардов, то есть, это модуль Player, там есть процедура ClearThis(...) она зачищает указанную FormView, то есть, ту, которая отображена на экране в окне, по сути, win.doc.OriginalView(), а вызывается она перед размещением новой формы шага, которая сохранена в списке шагов steps, а само размещение происходит в методе Wizard.ShowStep

Автор:  Илья Ермаков [ Среда, 14 Ноябрь, 2012 07:13 ]
Заголовок сообщения:  Re: Как заменить содержимое окна?

А ещё можно наложить на форму спец. вьюшку, которая содержит в себе список других вьюшек и показывает только одну из них? Такую вьюшку написать очень просто. Для режима разработки сделать спец. Tool-Dialog, который помогает в ней перелистывать страницы и вставлять новые. Для пустой страницы обрабатывать EditMsg с paste, забирая вставляемую вьюшку.

А дальше делаете страницами FormView-ы или что угодно...

Автор:  Пётр Кушнир [ Среда, 14 Ноябрь, 2012 10:52 ]
Заголовок сообщения:  Re: Как заменить содержимое окна?

Илья Ермаков писал(а):
А дальше делаете страницами FormView-ы или что угодно...

да, это уже следующий виток развития, сделать такое отображение, которое само знает, какую форму отобразить. А общаться с таким отображением можно с помощью сообщений Models.Message, которые проходят даже в скрытые отображения. Достаточно иметь хендл окна, или вычислять его динамически, чтобы ничего не хранить.

Автор:  Иван Денисов [ Среда, 14 Ноябрь, 2012 11:42 ]
Заголовок сообщения:  Re: Как заменить содержимое окна?

Пока нашел вот такое решение. Меня вполне устроило. Спасибо Петру огромное!

Код:
   IMPORT Containers, Controllers, Files, FormModels,Views, Windows, FormViews, Models;

   PROCEDURE ReplaceForm*;
      VAR
         win: Windows.Window; old: FormViews.View; new: Views.View;
         wr : FormModels.Writer; m : FormModels.Model; c : Containers.Controller; w, h: INTEGER;
         sm: Containers.SetOpts;
   BEGIN
      (* Стираем все со старой формы *)
      win := Windows.dir.Focus(Controllers.frontPath);
      old := win.doc.ThisView()(FormViews.View);
      m:=old.ThisModel();
      c:=old.ThisController();
      Models.BeginModification(Models.notUndoable, m);
         c.SetOpts(Containers.layout);
         c.SelectAll(TRUE);
         c.DeleteSelection();
         c.SetOpts(Containers.mask);
      Models.EndModification(Models.notUndoable, m);
      wr := m.NewWriter(NIL); wr.Set(NIL);
      (* Открываем новую форму *)
      new := Views.OldView(Files.dir.This("Lumi/Rsrc"), "Monitor");
      sm.valid := {Containers.noSelection, Containers.noFocus, Containers.noCaret};
      sm.opts := {Containers.noSelection, Containers.noCaret};
      Views.HandlePropMsg(new, sm);
      
      old.context.GetSize(w, h);
      wr.WriteView(Views.CopyOf(new, FALSE),0,0, w, h);

   END ReplaceForm;

Автор:  Пётр Кушнир [ Пятница, 16 Ноябрь, 2012 13:51 ]
Заголовок сообщения:  Re: Как заменить содержимое окна?

Иван Денисов писал(а):
Пока нашел вот такое решение. Меня вполне устроило.
Если не секрет, в двух словах про проект, цели задачи предпосылки перспективы.
Иван Денисов писал(а):
Спасибо Петру огромное!
:)
Жаль, что тредов про конкретные задачи и проблемы так мало, ведь они намного интереснее всего остального, даже в режиме только-чтения.

Автор:  Иван Денисов [ Воскресенье, 18 Ноябрь, 2012 07:25 ]
Заголовок сообщения:  Re: Как заменить содержимое окна?

Делаю сейчас приложение для прибора измеряющего динамику светового излучения биологических проб (биолюминометр). Задачи приложения, отправка управляющих команд, сбор данных, отображение динамики светового излучения в реальном времени, обработка, экспорт. Программу для МК прибора пишу на Оберон-7 в среде Astrobe. По окончании проекта сделаю более детальный пост с картинками того, что выходит.

Когда форма меняется первый раз, появляется сетка. Проблема решается установкой шага сетки больше, чем размер формы. Тогда все выглядит гладко.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/