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/ |