OberonCore
https://forum.oberoncore.ru/

сделать текущий размер вьюшек персистентным
https://forum.oberoncore.ru/viewtopic.php?f=24&t=1956
Страница 1 из 2

Автор:  Info21 [ Среда, 14 Октябрь, 2009 23:13 ]
Заголовок сообщения:  сделать текущий размер вьюшек персистентным

Проблемка такая:

определяется вьюшка так, чтобы растягиваться по окну (horFitToWin := TRUE ...).
при каждой отрисовке запоминает в своих полях свой текущий размер (берет через v.context.GetSize).
на SizePref отвечает этим размером.
при сохранении на диск сохраняет этот размер, а при считывании -- восстанавливает значения.

Теперь:
создаем такую вьюшку, задавая ей размер некий размер по умолчанию (SIC: этот размер и будет проблемой),
и открываем в отдельном окошке.
растягиваем мышкой окно. вьюшка адаптируется как приказано.
сохраняем вьюшку (File, Save), закрываем.

Открываем снова -- и видим странное дело (отслеживая в Log сообщения):
сначала ББ просит SizePref, вьюшка отвечает правильными -- считанными с диска размерами (это дважды).
Но затем идет вызов Restore, и ББ дает контекст, в котором размеры вьюшки -- те самые изначальные, до всяких растягиваний окна.

Нетрудно понять, что ББ не может заглянуть внутрь модуля и отгадать, где там хранятся эти изначальные размеры -- но можно и доказать, что они считываются с диска:
достаточно после сохранения и закрытия вьюшки изменить эти начальные размеры в определяющем вьюшку модуле, скомпилировать его, перегрузить для надежности весь ББ, и открыть вьюшку.

То есть: система (ББ+виндуса) помнит и хранит для вьюшки самый ее первый размер.
И при записи (обычные системные команды) записывает его.
А при открывании вьюшки -- откуда-то выцарапывает их и пытается навязать их опять.

Как обойти эту хрень я знаю. Даже два способа, причем даже и не сложно.

Но если кто-то может мне объяснить эту, повторю, хрень -- в каких дебрях застревают самые первоначальные размеры и кто их вытаскивает на свет божий, то заранее спасибо.

Автор:  Rifat [ Четверг, 15 Октябрь, 2009 01:08 ]
Заголовок сообщения:  Re: сделать текущий размер вьюшек персистентным

Возможно, что View получает размеры по умолчанию при иницализации модуля.

Автор:  Trurl [ Четверг, 15 Октябрь, 2009 10:24 ]
Заголовок сообщения:  Re: сделать текущий размер вьюшек персистентным

Вьюшки хранятся и отображаются не сами по себе, а внутри контейнера, в простейшем случае - документа. Вот размеры документа и сохраняются/восстанавливаютя.

Автор:  Info21 [ Четверг, 15 Октябрь, 2009 11:48 ]
Заголовок сообщения:  Re: сделать текущий размер вьюшек персистентным

Trurl писал(а):
Вьюшки хранятся и отображаются не сами по себе, а внутри контейнера, в простейшем случае - документа. Вот размеры документа и сохраняются/восстанавливаютя.
То есть Вы хотите сказать, что когда я мышкой поресайзил окно, то документ этого не заметил?
То есть на диск сохранил нересайзенные значения?
Тогда я склонен считать это багом.

Но надо посмотреть, спасибо за направление.

Автор:  Info21 [ Четверг, 15 Октябрь, 2009 11:49 ]
Заголовок сообщения:  Re: сделать текущий размер вьюшек персистентным

Rifat писал(а):
Возможно, что View получает размеры по умолчанию при иницализации модуля.
Невозможность этого была доказана.

Автор:  Trurl [ Четверг, 15 Октябрь, 2009 15:16 ]
Заголовок сообщения:  Re: сделать текущий размер вьюшек персистентным

Я уже жаловался, что работа с документами абсолютно недокументирована.

Info21 писал(а):
То есть Вы хотите сказать, что когда я мышкой поресайзил окно, то документ этого не заметил?
То есть на диск сохранил нересайзенные значения?

Конечно. Окно же может быть не единственным.

Автор:  Trurl [ Четверг, 15 Октябрь, 2009 15:39 ]
Заголовок сообщения:  Чтобы стало понятнее.

Открываем окно. Выполняем "Tools"/ "Document Size...". Устанавливаем размеры документа "Fixed". Нажимаем ctrl+spase. Ресайзим окно мышкой и наблюдаем, что размеры документа не меняются. Но их можно изменить, подвигав темные квадратики. При сохранении документа именно эти размеры и запишутся.
Теперь установим размеры документа "Window Width"x "Window Heigh". Повторяем эксперимент с мышкой. Видим, как документ подгоняется под окно, а квадратики стали белыми. Но теперь размеры документа не сохраняются.

Автор:  Info21 [ Четверг, 15 Октябрь, 2009 20:02 ]
Заголовок сообщения:  Re: сделать текущий размер вьюшек персистентным

Trurl писал(а):
Info21 писал(а):
То есть Вы хотите сказать, что когда я мышкой поресайзил окно, то документ этого не заметил?

Конечно. Окно же может быть не единственным.
Не аргумент: есть главное окно, оно единственное.

Автор:  Trurl [ Четверг, 15 Октябрь, 2009 21:40 ]
Заголовок сообщения:  Re: сделать текущий размер вьюшек персистентным

А ещё есть принтеры.

Автор:  Иван Горячев [ Пятница, 16 Октябрь, 2009 00:49 ]
Заголовок сообщения:  Re: сделать текущий размер вьюшек персистентным

Info21 писал(а):
Не аргумент: есть главное окно, оно единственное.

Как это? Главный - документ, а все его окна - просто отображения, вполне между собой равные. Тот факт, что одно из них было открыто раньше - просто случайность. Или у моделей есть "главная" вьюшка и второстепенные?

PS. Это я к тому, что в общем случае документ не может ориентироваться на параметры какого либо конкретного окна, даже если это окно одно. Получится неоправданное усложнение

Автор:  Info21 [ Пятница, 16 Октябрь, 2009 07:53 ]
Заголовок сообщения:  Re: сделать текущий размер вьюшек персистентным

Trurl писал(а):
А ещё есть принтеры.
С принтерами как раз проблемы нет:

Ports.IsPrinterPort (p: Port): BOOLEAN;

Иван Горячев писал(а):
Info21 писал(а):
Не аргумент: есть главное окно, оно единственное.

Как это? Главный - документ, а все его окна - просто отображения, вполне между собой равные. Тот факт, что одно из них было открыто раньше - просто случайность. Или у моделей есть "главная" вьюшка и второстепенные?

PS. Это я к тому, что в общем случае документ не может ориентироваться на параметры какого либо конкретного окна, даже если это окно одно. Получится неоправданное усложнение
Вы (или авторы ББ :)) немножко запутали.

Мне нужна простая как репа вещь: у вьюшки есть одно -- одно! см. документацию ББ -- главное окно, и она хочет определить размер этого окна. Что она с ним будет делать -- ее (моё) дело.
В данном случае я хочу потом открыть ее снова точно в той же позиции (я взял код из Desktop, но там всё сложно и низкоуровнево).

Повторю: понятие главного окна -- концептуальное в ББ. И оно никак не отражено в API.

Автор:  Info21 [ Пятница, 16 Октябрь, 2009 08:42 ]
Заголовок сообщения:  Re: сделать текущий размер вьюшек персистентным

Плюс ко всему: речь о вьюшке без модели.
Тут и вторичные окна не открываются.
Так что вообще проблемы с множественностью окон нет.

Вьюшка без модели -- одно окно, нужно сохранять ее размер.

Это недодумка в ББ.

Автор:  Иван Горячев [ Пятница, 16 Октябрь, 2009 08:55 ]
Заголовок сообщения:  Re: сделать текущий размер вьюшек персистентным

Info21 писал(а):
Мне нужна простая как репа вещь: у вьюшки есть одно -- одно! см. документацию ББ -- главное окно, и она хочет определить размер этого окна. Что она с ним будет делать -- ее (моё) дело.
В данном случае я хочу потом открыть ее снова точно в той же позиции (я взял код из Desktop, но там всё сложно и низкоуровнево).

Повторю: понятие главного окна -- концептуальное в ББ. И оно никак не отражено в API.


Это всё понятно. Но! Понятие "окно" в ББ ниразу не концептуальное. Концептуальное - документ, и, соответственно, документоориентированный интерфейс. Отсюда и отсутствие нормальных "окон" в API.

Цитата:
Плюс ко всему: речь о вьюшке без модели.

Если вьюшка не имеет модели - это не значит что модели нет вообще. Модель есть у документа, и окно суть - отображение документа.

Проблема в том, что ББ вынужден работать в абсолютно неродной для себя среде

PS. Посмотрел в документации. Действительно, там есть понятие "основное окно документа". В одном абзаце упоминается. Но оно введено исключительно как соглашение, для какого-то (сиюминутного) удобства разработчиков. Концепции основного окна нет!

Автор:  Trurl [ Пятница, 16 Октябрь, 2009 13:21 ]
Заголовок сообщения:  Re: сделать текущий размер вьюшек персистентным

Info21 писал(а):
С принтерами как раз проблемы нет:
у вьюшки есть одно -- одно! см. документацию ББ -- главное окно, и она хочет определить размер этого окна.

У вьюшки нет ни одного окна.

Автор:  Info21 [ Пятница, 16 Октябрь, 2009 13:29 ]
Заголовок сообщения:  Re: сделать текущий размер вьюшек персистентным

Иван Горячев писал(а):
Концепции основного окна нет!
Есть. Откройте любой текст и нажмите F2.

Автор:  Иван Горячев [ Пятница, 16 Октябрь, 2009 13:54 ]
Заголовок сообщения:  Re: сделать текущий размер вьюшек персистентным

Info21 писал(а):
Есть. Откройте любой текст и нажмите F2.

И что? Это показывает лишь то, что окна имеются в нижележащей ОС. А в ББ концепции окон нет! Равно как и меню, и горячих клавиш. Всё это зарыто в подсистеме Host или во вспомогательных (а потому недокументированных) модулях. Это конечно плохо, но так уж сложилось

Автор:  Info21 [ Пятница, 16 Октябрь, 2009 21:35 ]
Заголовок сообщения:  Re: сделать текущий размер вьюшек персистентным

Иван Горячев писал(а):
Info21 писал(а):
Есть. Откройте любой текст и нажмите F2.

И что? Это показывает лишь то, что окна имеются в нижележащей ОС. А в ББ концепции окон нет! Равно как и меню, и горячих клавиш. Всё это зарыто ...
Уф.

Да мне нужна не философия, а простая вещь!

Вьюшка без модели. Второе окно у нее не открывается хоть тресни. Одно оно! Оно же и размер документа. Я с ним работаю (графики там поудобней растягиваю-сдвигаю то-да-сё), устрою поудобней -- и хочу в таком виде чтобы и назавтра оно было, и на послезавтра.

На кой ляд мне сохранять какой-то случайный дефолтный начальный размер и потом всегда его восстанавливать?

Вот и вся концепция :)

Автор:  Иван Горячев [ Суббота, 17 Октябрь, 2009 01:52 ]
Заголовок сообщения:  Re: сделать текущий размер вьюшек персистентным

Вы же не требуете наличия составных документов от IDE Delphi. Нету - значит нету. Нужно делать самому. Либо частное сиюминутное решение, либо общее. Только и всего.

Автор:  Борис Рюмшин [ Суббота, 17 Октябрь, 2009 06:58 ]
Заголовок сообщения:  Re: сделать текущий размер вьюшек персистентным

Иван Горячев писал(а):
Info21 писал(а):
Есть. Откройте любой текст и нажмите F2.

И что? Это показывает лишь то, что окна имеются в нижележащей ОС. А в ББ концепции окон нет! Равно как и меню, и горячих клавиш. Всё это зарыто в подсистеме Host или во вспомогательных (а потому недокументированных) модулях. Это конечно плохо, но так уж сложилось

А правы оба на самом деле. :)
Цитата:
Only one of the two views is externalized when the document is saved in a file. To avoid schizophreny, one window is clearly distinguished as the main window, while all others are so-called subwindows. If you close a subwindow, only this window is closed. But if you close the main window, it and all its subwindows are closed simultaneously.

Только с точки зрения ББ последняя, верхняя абстракция до ОС - фрейм. Окон действительно нет.
И Трурль прав. У отображения окна нет. Его (отображение) можно показать через фрейм.
И самое смешное, второй фрейм (под второе окно) не сделаешь, т.к. модели нет, к которой можно второе отображение подключить. :)
Забавно.

P.S. Вот она, кстати, трурлевская гуюшка! Вьюшка без модели! :mrgreen:
P.P.S. А ведь технически, ничего не нарушая (не нарушая фреймворка), можно спокойно модернизировать связку ББ - ОС...хм... :roll:

Автор:  Илья Ермаков [ Суббота, 17 Октябрь, 2009 07:13 ]
Заголовок сообщения:  Re: сделать текущий размер вьюшек персистентным

Уточню: под второе окно делается не просто фрейм, а копия вьюшки. Два фрейма на одну вьюшку - это ситуация с вложенными отображениями, если родительское открыто в двух окнах.

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