OberonCore
https://forum.oberoncore.ru/

FormController или TextController
https://forum.oberoncore.ru/viewtopic.php?f=24&t=162
Страница 1 из 1

Автор:  Cardinal [ Вторник, 18 Апрель, 2006 14:16 ]
Заголовок сообщения:  FormController или TextController

Код:
MODULE TestCont;

   IMPORT log := StdLog, Containers, TextControllers, FormControllers;
   
   PROCEDURE show*;
      VAR c: Containers.Controller;
   BEGIN
      c := Containers.Focus();
      WITH
         | c : TextControllers.Controller DO log.String('text controller');
         | c : FormControllers.Controller DO log.String('form controller');
         ELSE log.String('unknown controller');
      END;
      log.Ln;
   END show;
END TestCont.

(!) "StdCmds.OpenToolDialog('Test/Rsrc/Form.odc', 'test')"
(!) "StdCmds.OpenAuxDialog('Test/Rsrc/Form.odc', 'test')"


Создаю форму, размещаю на ней скопированный из буфера обмена новый текстовой документ, и создаю кнопку "Show" со ссылкой на "TestCont.show". Если форма открывается как OpenToolDialog, то при нажатии на кнопку на форме в лог пишется - "text controller". Форма, открытая с помощью OpenAuxDialog - в логе - "form controller". Стал искать в чем разница.

OpenAuxDialog вызывает процедуру StdDialog.Open(v, title, NIL, "", NIL, FALSE, TRUE, TRUE, FALSE, TRUE).
OpenToolWindow вызывает процедуру StdDialog.Open(v, title, NIL, "", NIL, TRUE, FALSE, TRUE, FALSE, TRUE)

Процедура StdDialog.Open выглядит так:
Код:
PROCEDURE Open* (v: Views.View; title: ARRAY OF CHAR;
                           loc: Files.Locator; name: Files.Name; conv: Converters.Converter;
                           asTool, asAux, noResize, allowDuplicates, neverDirty: BOOLEAN);

Этот вызов ведёт к вызову Windows.dir.Open(..., flags, ...), а дальше Views.SetRoot(..., flags, ...). В помощи к Views
Код:
flags-: SET
Флаги, специфичные для окна. Зарезервировано для будущего использования.

Как влияют флаги asTool и asAux, я так и не понял и не нашел. Может, сталкивался кто-нибудь и знает, почему так происходит?

Автор:  Илья Ермаков [ Вторник, 18 Апрель, 2006 15:35 ]
Заголовок сообщения: 

Цитата:
Если форма открывается как OpenToolDialog, то при нажатии на кнопку на форме в лог пишется - "text controller"


Объяснение простое: процедуры Focus() возвращает так называемый целевой фокус, то есть, фокус среди окон документов и aux-окон. Tool-окно - это передний фокус. Т.е. в случае tool-диалога вы получали контроллер лежащего под ним текста.

Так сделано специально, чтобы инструментальные окна легко обнаруживали целевые фокусы, к которым их применяют. Почитайте документацию Controllers.

Достать передний фокус тоже можно. Скачайте нашу библиотеку Mt (http://sources.metasystems.ru/mt/) и посмотрите MtBrowser.FrontFocus().

Автор:  Cardinal [ Вторник, 18 Апрель, 2006 16:03 ]
Заголовок сообщения: 

Код:
   PROCEDURE show*;
      VAR v, subv: Views.View; m: Models.Model; rd: FormModels.Reader;
   BEGIN
      v := MtBrowser.FrontFocus();
      ASSERT(v # NIL, 20);
      m := v.ThisModel();
      ASSERT(m # NIL, 21);
      WITH m: FormModels.Model DO
            rd := m.NewReader(NIL);
            rd.ReadView(subv);
            WHILE (subv # NIL) & ~(subv IS TextViews.View) DO
               rd.ReadView(subv)
            END;
            IF subv # NIL THEN
               log.String('text view'); log.Ln;
            END;
      END;
   END show;

Код:
TRAP 21  (precondition violated)

 TestCont.show   [0000003AH]
   .m   Models.Model   NIL
   .rd   FormModels.Reader   NIL
   .subv   Views.View   NIL
   .v   Views.View   [011FAED0H]

Автор:  Илья Ермаков [ Вторник, 18 Апрель, 2006 16:23 ]
Заголовок сообщения: 

Вы открываете Tool Dialog и потом кликаете по коммандеру? Так при щелчке фокус уходит от tooldialog к тому окну, где лежит командер.

Автор:  Trurl [ Вторник, 18 Апрель, 2006 16:23 ]
Заголовок сообщения: 

В дополнение.
Окна ББ делятся на два класса - диалоги и документы. (С точки зрения windows их три "Oberon Dlg", "Oberon Doc" и "Oberon Aux", но два последних отличаются только оформлением).
При нажатии на кнопку (и вообще при активации окна) если она в окне-документе, то он получает фокус, если же в окне-диалоге, фокус остается там где был.

Автор:  Cardinal [ Вторник, 18 Апрель, 2006 16:42 ]
Заголовок сообщения: 

Эх... Проще, наверное, сказать чего я хочу: есть форма, на ней текстовой документ и кнопка. При нажатии на кнопку что-либо происходит с документом (например, строки дописываются). Это у меня получается, если открываю форму так:
"StdCmds.OpenAuxDialog('Test/Rsrc/Form.odc', 'test')".

Но мне хочется использовать ToolDialog вот по этой причине
http://forum.oberoncore.ru/viewtopic.php?p=1575&highlight=movewindow#1575. Как я понял - нужны именно ToolDialog.

Автор:  Cardinal [ Вторник, 18 Апрель, 2006 16:45 ]
Заголовок сообщения: 

Илья Ермаков писал(а):
Вы открываете Tool Dialog и потом кликаете по коммандеру? Так при щелчке фокус уходит от tooldialog к тому окну, где лежит командер.

Да нет же :) Я щелкаю по коммандеру, открывается форма, на форме жму кнопку, выполняется процедура show.

Автор:  Илья Ермаков [ Вторник, 18 Апрель, 2006 16:58 ]
Заголовок сообщения: 

Попробовал. Хе... Теперь кнопка перехватывает на себя фокус! (посмотрите- переменная Show.view имеет тип Controls.PushButton).

До формы надо добираться через view.context.

Автор:  Илья Ермаков [ Вторник, 18 Апрель, 2006 17:00 ]
Заголовок сообщения: 

А вообще-то, если нужно что-то выводить в заранее подготовленный на форме TextView, воспользуйтесь MtBrowser - я его для того и писал.

Автор:  Cardinal [ Пятница, 21 Апрель, 2006 11:37 ]
Заголовок сообщения: 

Как получить доступ к текстовому view, на котором добавлен скроллер (Tools | AddScroller)?

Автор:  Илья Ермаков [ Пятница, 21 Апрель, 2006 13:14 ]
Заголовок сообщения: 

К сожалению, никак. Стандартные скроллеры этого не позволяют. Воспользуйтесь нашим MtScroller.

Автор:  Cardinal [ Пятница, 21 Апрель, 2006 14:16 ]
Заголовок сообщения: 

Илья Ермаков писал(а):
К сожалению, никак. Стандартные скроллеры этого не позволяют. Воспользуйтесь нашим MtScroller.

Хм... А как через Ваш? В модуле MtScrollers не нашел никаких методов (процедур), которые позволяют получить view, в которой встроен скроллер.

Автор:  Илья Ермаков [ Пятница, 21 Апрель, 2006 15:30 ]
Заголовок сообщения: 

Цитата:
В модуле MtScrollers не нашел никаких методов (процедур),


Эта процедура в базовом типе MtViews.Wrapper (или MtBrowser.Wrapper, не помню точно).

Автор:  Ира [ Пятница, 21 Апрель, 2006 16:09 ]
Заголовок сообщения: 

Можно ли при составлении формы на этапе выполнения программы добавить скрол к контролу (таблице)?

Автор:  Илья Ермаков [ Пятница, 21 Апрель, 2006 18:11 ]
Заголовок сообщения: 

Неудобно, что нет процедуры типа StdScrollers.AddScrollersOn(VAR v: Views.View). Кстати, добавлю такую в MtScrollers для следующей версии.

А так нужно, во-первых, чтобы форма была уже открытой в фокусе, во-вторых установить фокус на таблицу, уже помещенную на форму:
formView.ThisController().SetFocus(table). Затем вызвать StdScrollers.AddScroller.

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