OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 17:14

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




Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: FormController или TextController
СообщениеДобавлено: Вторник, 18 Апрель, 2006 14:16 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 18:08
Сообщения: 76
Код:
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 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Цитата:
Если форма открывается как OpenToolDialog, то при нажатии на кнопку на форме в лог пишется - "text controller"


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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 18 Апрель, 2006 16:03 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 18:08
Сообщения: 76
Код:
   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 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Вы открываете Tool Dialog и потом кликаете по коммандеру? Так при щелчке фокус уходит от tooldialog к тому окну, где лежит командер.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 18 Апрель, 2006 16:23 

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 18 Апрель, 2006 16:42 

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 18 Апрель, 2006 16:45 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 18:08
Сообщения: 76
Илья Ермаков писал(а):
Вы открываете Tool Dialog и потом кликаете по коммандеру? Так при щелчке фокус уходит от tooldialog к тому окну, где лежит командер.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 18 Апрель, 2006 16:58 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Попробовал. Хе... Теперь кнопка перехватывает на себя фокус! (посмотрите- переменная Show.view имеет тип Controls.PushButton).

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 18 Апрель, 2006 17:00 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
А вообще-то, если нужно что-то выводить в заранее подготовленный на форме TextView, воспользуйтесь MtBrowser - я его для того и писал.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 21 Апрель, 2006 11:37 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 18:08
Сообщения: 76
Как получить доступ к текстовому view, на котором добавлен скроллер (Tools | AddScroller)?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 21 Апрель, 2006 13:14 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
К сожалению, никак. Стандартные скроллеры этого не позволяют. Воспользуйтесь нашим MtScroller.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 21 Апрель, 2006 14:16 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 18:08
Сообщения: 76
Илья Ермаков писал(а):
К сожалению, никак. Стандартные скроллеры этого не позволяют. Воспользуйтесь нашим MtScroller.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 21 Апрель, 2006 15:30 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Цитата:
В модуле MtScrollers не нашел никаких методов (процедур),


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 21 Апрель, 2006 16:09 

Зарегистрирован: Четверг, 01 Декабрь, 2005 16:00
Сообщения: 18
Можно ли при составлении формы на этапе выполнения программы добавить скрол к контролу (таблице)?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 21 Апрель, 2006 18:11 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Неудобно, что нет процедуры типа StdScrollers.AddScrollersOn(VAR v: Views.View). Кстати, добавлю такую в MtScrollers для следующей версии.

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


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

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


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

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


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

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