OberonCore
https://forum.oberoncore.ru/

Тайловый интерфейс
https://forum.oberoncore.ru/viewtopic.php?f=24&t=5253
Страница 1 из 4

Автор:  Иван Денисов [ Пятница, 21 Ноябрь, 2014 18:35 ]
Заголовок сообщения:  Тайловый интерфейс

Альтернатива многооконному MDI в виде областей со вкладками, переключающими окна.

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

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

Автор:  Роман М. [ Суббота, 22 Ноябрь, 2014 00:35 ]
Заголовок сообщения:  Re: Тайловый интерфейс

Спасибо за компонент и за демку.

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

Уважаемые форумчане,

в 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.

Автор:  Пётр Кушнир [ Суббота, 22 Ноябрь, 2014 15:04 ]
Заголовок сообщения:  Re: Тайловый интерфейс

Используйте агрегирование!
Но все равно, наследовать реализацию - моветон :)

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

Пётр Кушнир писал(а):
Используйте агрегирование!
Но все равно, наследовать реализацию - моветон :)

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

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

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

Пётр Кушнир писал(а):
Но все равно, наследовать реализацию - моветон :)

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

Автор:  Пётр Кушнир [ Суббота, 22 Ноябрь, 2014 22:47 ]
Заголовок сообщения:  Re: Тайловый интерфейс

Вот поэтому хосты должны быть без интерфейса.
Тогда всем просто надо будет написать свою обертку базового типа Windows.Directory и не придется смущать себя конкретной реализацией.

Автор:  Kemet [ Воскресенье, 23 Ноябрь, 2014 16:28 ]
Заголовок сообщения:  Re: Тайловый интерфейс

Иван Денисов писал(а):
Уважаемые форумчане,

в 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

Автор:  Иван Денисов [ Воскресенье, 23 Ноябрь, 2014 20:21 ]
Заголовок сообщения:  Re: Тайловый интерфейс

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);

...


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

Автор:  Kemet [ Воскресенье, 23 Ноябрь, 2014 21:47 ]
Заголовок сообщения:  Re: Тайловый интерфейс

Иван Денисов писал(а):
EXTENSIBLE все-таки относится к процедуре New, которая является методом записи HostWindows.Directory и говорит, о том, что этот метод возможно расширить.

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

Автор:  Иван Кузьмицкий [ Воскресенье, 23 Ноябрь, 2014 22:29 ]
Заголовок сообщения:  Re: Тайловый интерфейс

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

Автор:  Иван Денисов [ Воскресенье, 23 Ноябрь, 2014 22:31 ]
Заголовок сообщения:  Re: Тайловый интерфейс

Новая версия без Actions.

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

Автор:  Александр Ильин [ Воскресенье, 23 Ноябрь, 2014 22:37 ]
Заголовок сообщения:  Re: Тайловый интерфейс

Kemet писал(а):
EXTENSIBLE означает, что по отношению к процедуре базового типа у данной процедуры используются "расширенные" типы формальных параметров/результата
EXTENSIBLE не описывает отношение к процедуре базового типа. EXTENSIBLE описывает отношение к процедуре типа-расширения. Атрибут процедуры EXTENSIBLE означает, что при создании типа, являющегося расширением данного, в этом новом типе процедуру можно будет переопределить согласно некоторым правилам. Процедуры без атрибута EXTENSIBLE в расширенном типе переопределить нельзя.

Автор:  Kemet [ Понедельник, 24 Ноябрь, 2014 00:12 ]
Заголовок сообщения:  Re: Тайловый интерфейс

Я сейчас пробежался по компилятору, похоже что этот EXTENSIBLE если и влияет на что-то, то только в COM, или вообще это недочищенный артефакт.

Автор:  Александр Ильин [ Понедельник, 24 Ноябрь, 2014 00:46 ]
Заголовок сообщения:  Re: Тайловый интерфейс

Kemet писал(а):
Я сейчас пробежался по компилятору, похоже что этот EXTENSIBLE если и влияет на что-то, то только в COM, или вообще это недочищенный артефакт.
Можно ещё пробежаться по Language Report, по разделу 10.2. : )

Автор:  Иван Денисов [ Понедельник, 24 Ноябрь, 2014 06:59 ]
Заголовок сообщения:  Re: Тайловый интерфейс

Чтобы уже совсем было понятно про EXTENSIBLE.

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


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

Автор:  Иван Денисов [ Понедельник, 24 Ноябрь, 2014 10:35 ]
Заголовок сообщения:  Re: Тайловый интерфейс

Перенес компонент в папку Cpc и сделал черновик документации.

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

Автор:  Роман М. [ Понедельник, 24 Ноябрь, 2014 12:22 ]
Заголовок сообщения:  Re: Тайловый интерфейс

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

Автор:  Роман М. [ Понедельник, 24 Ноябрь, 2014 16:29 ]
Заголовок сообщения:  Re: Тайловый интерфейс

А в порте на GTK такой интерфейс было бы трудно сделать?

Автор:  Иван Денисов [ Понедельник, 24 Ноябрь, 2014 16:36 ]
Заголовок сообщения:  Re: Тайловый интерфейс

Роман М. писал(а):
А в порте на GTK такой интерфейс было бы трудно сделать?

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

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