OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 11 Декабрь, 2019 18:11

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




Начать новую тему Ответить на тему  [ Сообщений: 46 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Тайловый интерфейс
СообщениеДобавлено: Пятница, 21 Ноябрь, 2014 18:35 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2477
Альтернатива многооконному MDI в виде областей со вкладками, переключающими окна.

Сделал страницу с описанием проекта:
http://oberoncore.ru/projects/tile

Сделал видео-демонстрацию текущего прототипа:
http://youtu.be/sxnHe3SValk


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тайловый интерфейс
СообщениеДобавлено: Суббота, 22 Ноябрь, 2014 00:35 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1162
Откуда: Tel-Aviv
Спасибо за компонент и за демку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тайловый интерфейс
СообщениеДобавлено: Суббота, 22 Ноябрь, 2014 06:04 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2477
Уважаемые форумчане,

в HostWindows процедура New единственная помечена как EXTENSIBLE. Можно ли как-то в рамках RedTabs компонента ее расширить? Пробовал создать наследника HostWindows.Directory, но не получается в наследника скопировать содержимое предка! Срабатывает охрана типов. А вручную скопировать поля нельзя, так как они скрыты. Как быть, чтобы расширить HostWindows.Directory после его инициализации?

Код:
   PROCEDURE (d: Directory) New* (): Window, EXTENSIBLE;
      VAR w: Window;
   BEGIN
      NEW(w); RETURN w
   END New;


Это нужно, чтобы новые окна "ловить" без Actions.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тайловый интерфейс
СообщениеДобавлено: Суббота, 22 Ноябрь, 2014 15:04 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2638
Откуда: Россия, Ярославль
Используйте агрегирование!
Но все равно, наследовать реализацию - моветон :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тайловый интерфейс
СообщениеДобавлено: Суббота, 22 Ноябрь, 2014 22:09 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2477
Пётр Кушнир писал(а):
Используйте агрегирование!
Но все равно, наследовать реализацию - моветон :)

Пётр, а если это агрегирование использовать, то получается придется все функции, которые не трогаю записать примерно так?
Код:
   PROCEDURE (d: Directory) Focus* (target: BOOLEAN): Window;
   BEGIN
      RETURN w.parentDir.Focus(target)
   END Focus;

Но ведь тогда и EXTENSIBLE не нужен... а он там зачем-то есть в New. Что я не понимаю?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тайловый интерфейс
СообщениеДобавлено: Суббота, 22 Ноябрь, 2014 22:13 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2477
Пётр Кушнир писал(а):
Но все равно, наследовать реализацию - моветон :)

Альтернатива — свой HostWindows, но тогда придется поддержку его постоянно делать и не так просто будет переключение организовать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тайловый интерфейс
СообщениеДобавлено: Суббота, 22 Ноябрь, 2014 22:47 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2638
Откуда: Россия, Ярославль
Вот поэтому хосты должны быть без интерфейса.
Тогда всем просто надо будет написать свою обертку базового типа Windows.Directory и не придется смущать себя конкретной реализацией.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тайловый интерфейс
СообщениеДобавлено: Воскресенье, 23 Ноябрь, 2014 16:28 

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 717
Откуда: Барнаул
Иван Денисов писал(а):
Уважаемые форумчане,

в HostWindows процедура New единственная помечена как EXTENSIBLE. Можно ли как-то в рамках RedTabs компонента ее расширить? Пробовал создать наследника HostWindows.Directory, но не получается в наследника скопировать содержимое предка! Срабатывает охрана типов. А вручную скопировать поля нельзя, так как они скрыты. Как быть, чтобы расширить HostWindows.Directory после его инициализации?

Код:
   PROCEDURE (d: Directory) New* (): Window, EXTENSIBLE;
      VAR w: Window;
   BEGIN
      NEW(w); RETURN w
   END New;


Это нужно, чтобы новые окна "ловить" без Actions.

Не совсем понятно, что ты хочешь получить, как-то слишком туманно для меня написано,
потому-что в данном конкретном случае EXTENSIBLE в процедуре New относится не к Directory, а к Window


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тайловый интерфейс
СообщениеДобавлено: Воскресенье, 23 Ноябрь, 2014 20:21 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2477
EXTENSIBLE все-таки относится к процедуре New, которая является методом записи HostWindows.Directory и говорит, о том, что этот метод возможно расширить.

Но, когда я прочитал ваш комментарий, то внезапно понял, что у Directory то как раз нету скрытых полей!!!, так что проблема решается примерно так!

Код:
TYPE
   Directory* = POINTER TO RECORD (HostWindows.Directory)
      parent: HostWindows.Directory;
   END;

PROCEDURE (d: Directory) New*(): HostWindows.Window;
   VAR w: HostWindows.Window; res: INTEGER; title: ARRAY 128 OF CHAR; a: AddWindowAction;
BEGIN
   w := d.parent.New();
   NEW(a); a.w := w;
   Services.DoLater(a, Services.now);
   RETURN w
END New;

PROCEDURE Install*;
   VAR tab: Tab; area: Area; dir: Directory;
BEGIN
   IF dlg.b = NIL THEN
   
      NEW(dir);
      dir.parent := HostWindows.dir;
      dir.unit := HostWindows.dir.unit;
      dir.invisible := HostWindows.dir.invisible;
      dir.unmoveable := HostWindows.dir.unmoveable;
      dir.background := HostWindows.dir.background;
      dir.l := HostWindows.dir.l;
      dir.t := HostWindows.dir.t;
      dir.r := HostWindows.dir.r;
      dir.b := HostWindows.dir.b;
      dir.minimized := HostWindows.dir.minimized;
      dir.maximized := HostWindows.dir.maximized;
      Windows.SetDir(dir);

...


Минутка самоиронии:
«Спрашивают четырех индейцев, убежавших из тюрьмы:
- Скажите, почему вы убежали?
- Сидим мы день, второй, третий. На четвертый день Острый Глаз заметил, что одной стены нет.»


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тайловый интерфейс
СообщениеДобавлено: Воскресенье, 23 Ноябрь, 2014 21:47 

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 717
Откуда: Барнаул
Иван Денисов писал(а):
EXTENSIBLE все-таки относится к процедуре New, которая является методом записи HostWindows.Directory и говорит, о том, что этот метод возможно расширить.

EXTENSIBLE означает, что по отношению к процедуре базового типа у данной процедуры используются "расширенные" типы формальных параметров/результата, что позволяет не использовать громоздкие приведения типов. В данном конкретном случае EXTENSIBLE относится к результату, имеющему тип HostWindows.Window* = POINTER TO EXTENSIBLE RECORD (Windows.Window), тогда как тип результат метода базового типа - Windows.Window = POINTER TO ABSTRACT RECORD


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тайловый интерфейс
СообщениеДобавлено: Воскресенье, 23 Ноябрь, 2014 22:29 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2933
Откуда: г. Ярославль
Kemet писал(а):
EXTENSIBLE означает, что по отношению к процедуре базового типа у данной процедуры используются "расширенные" типы формальных параметров/результата, что позволяет не использовать громоздкие приведения типов. В данном конкретном случае EXTENSIBLE относится к результату, имеющему тип HostWindows.Window* = POINTER TO EXTENSIBLE RECORD (Windows.Window), тогда как тип результат метода базового типа - Windows.Window = POINTER TO ABSTRACT RECORD
Другими словами, раз заложена возможность наследования HostWindows.Window, то и директория HostWindows.Directory должна иметь возможность создавать экземпляр потомка HostWindows.Window, так ведь?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тайловый интерфейс
СообщениеДобавлено: Воскресенье, 23 Ноябрь, 2014 22:31 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2477
Новая версия без Actions.

Вложение:
Tabs4.txt [36.87 КБ]
Скачиваний: 405


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тайловый интерфейс
СообщениеДобавлено: Воскресенье, 23 Ноябрь, 2014 22:37 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2318
Откуда: Россия, Томск
Kemet писал(а):
EXTENSIBLE означает, что по отношению к процедуре базового типа у данной процедуры используются "расширенные" типы формальных параметров/результата
EXTENSIBLE не описывает отношение к процедуре базового типа. EXTENSIBLE описывает отношение к процедуре типа-расширения. Атрибут процедуры EXTENSIBLE означает, что при создании типа, являющегося расширением данного, в этом новом типе процедуру можно будет переопределить согласно некоторым правилам. Процедуры без атрибута EXTENSIBLE в расширенном типе переопределить нельзя.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тайловый интерфейс
СообщениеДобавлено: Понедельник, 24 Ноябрь, 2014 00:12 

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 717
Откуда: Барнаул
Я сейчас пробежался по компилятору, похоже что этот EXTENSIBLE если и влияет на что-то, то только в COM, или вообще это недочищенный артефакт.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тайловый интерфейс
СообщениеДобавлено: Понедельник, 24 Ноябрь, 2014 00:46 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2318
Откуда: Россия, Томск
Kemet писал(а):
Я сейчас пробежался по компилятору, похоже что этот EXTENSIBLE если и влияет на что-то, то только в COM, или вообще это недочищенный артефакт.
Можно ещё пробежаться по Language Report, по разделу 10.2. : )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тайловый интерфейс
СообщениеДобавлено: Понедельник, 24 Ноябрь, 2014 06:59 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2477
Чтобы уже совсем было понятно про EXTENSIBLE.

Docu/CP-New.odc писал(а):
Записевые типы «по умолчанию» и с атрибутами EXTENSIBLE, ABSTRACT и LIMITED
Компонентный Паскаль использует единственное средство для обозначения как интер­фей­сов объектов, так и их реализаций — записевые типы. Эта унификация позволяет зафикси­­ровать одни аспекты реализации интерфейса, оставляя открытыми другие. Такая гибкость часто желательна в сложных каркасах. Но такие архитектурные решения важно выражать как можно точнее, так как они могут повлиять на большое число клиентов.
В этих целях записевый тип в Компонентном Паскале может иметь атрибуты, которые позво­ляют проектировщику интерфейса явно сформулировать несколько фундаментальных архитектурных решений. Важно, что компилятор может проверить соответствие этим решениям. Такими тщательно подобранными атрибутами являются EXTENSIBLE, ABSTRACT и LIMITED. Они позволяют различать четыре разные комбинации возможностей расширения и размещения [allocation]:
атрибут расширение размещение присваивание записей
отсутствует («FINAL») нет да да
EXTENSIBLE да да нет
ABSTRACT да нет нет
LIMITED нет* нет* нет
*за исключением определяющего модуля


Так вот оказалось, что не только процедура New имеет атрибут EXTENSIBLE, но и Open. Так я смог расширить фабрику HostWindows.Directory, установить в Windows.Window эту новую фабрику (директорию) и ловить все открытия новых окон. Это позволило избежать частой периодической проверки открытости новых окон и убрать зависимость от Services.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тайловый интерфейс
СообщениеДобавлено: Понедельник, 24 Ноябрь, 2014 10:35 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2477
Перенес компонент в папку Cpc и сделал черновик документации.

Вложение:
Tabs5.txt [39.2 КБ]
Скачиваний: 402


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тайловый интерфейс
СообщениеДобавлено: Понедельник, 24 Ноябрь, 2014 12:22 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1162
Откуда: Tel-Aviv
Компоненты лучше хранить в общедоступном хранилище с историей изменений, а на форуме выкладывать ссылки на новый выпуск.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тайловый интерфейс
СообщениеДобавлено: Понедельник, 24 Ноябрь, 2014 16:29 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1162
Откуда: Tel-Aviv
А в порте на GTK такой интерфейс было бы трудно сделать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тайловый интерфейс
СообщениеДобавлено: Понедельник, 24 Ноябрь, 2014 16:36 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2477
Роман М. писал(а):
А в порте на GTK такой интерфейс было бы трудно сделать?

Там все это надо рисовать на одном окне. Сейчас Иван К. разбирается как сделать Windows, чтобы окна ББ на одном окне рисовались. Я потихоньку тоже вникаю в это. Сам модуль CpcTabs платформенно-независимый, поэтому эту логику с областями и табами легко будет на новом хосте воспроизвести.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 46 ]  На страницу 1, 2, 3  След.

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


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

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


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

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