Инструменты пользователя

Инструменты сайта


cp:containers

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

cp:containers [2020/07/24 09:22] (текущий)
iadenisov создано
Строка 1: Строка 1:
 +=====Containers=====
 +Модуль **Containers** содержит различные описатели типов и записей,​ и связанные процедуры для работы с //​контейнерами//​. Суть контейнеров состоит в том, что эти объекты могут содержать другие объекты.
  
 +Контейнеры делятся на две категории:​
 +  * Контейнеры с фиксированной структурой и фиксированными типами внедряемых //​отображений//​ (статические контейнеры);​
 +  * Контейнеры,​ позволяющие внедрять произвольное количество //​отображений//​ с различными их типами (динамические контейнеры).
 +
 +Модуль **Containers** поддерживает только динамические контейнеры. Динамические контейнеры содержат в себе два типа содержимого:​
 +  * собственное содержание (для текстового редактора -- это текст);​
 +  * внедрённое содержание (для текстового редактора -- это картинки)
 +
 +Для построения //​отображений//​ модуль **Containers** предоставляет строительные блоки в виде моделей и диспетчеров. Особенностью модуля является то, что в отличии от большинства модулей BlackBox, этот модуль предоставляет к использованию несколько реализованных типов (кроме типов-интерфейсов).
 +
 +====Фокус и выделение====
 +Модуль содержит константы:​
 +  - noSelection - указывает на то, что выделение должно быть отключено;​
 +  - noFocus - никакое из внедрённых отображений не имеет фокуса;​
 +  - noCaret - каретка ввода/​выбора должна быть отключена;​
 +
 +====SelectAll====
 +''​ (c: Controller) **SelectAll** (select: BOOLEAN), NEW, ABSTRACT;''​
 +
 +Может содержать в качестве параметра //select// одну из двух констант:​
 +  - select -- выбирать;​
 +  - deselect -- не выбирать;​
 +
 +====hide, show====
 +''​CONST **hide**, **show** '' ​
 +
 +Часто используются в контроллерах отображений для скрытия или показа выбранной метки.
 +
 +==== TYPE Model ====
 +''​TYPE **Model (Models.Model)**,​ ABSTRACT;''​
 +
 +Абстрактная базовая модель для всех контейнеров.
 +
 +==== PROCEDURE GetEmbeddingLimits====
 +''​PROCEDURE (модель_ : Model) **GetEmbeddingLimits** (OUT minW, maxW, minH, maxH: INTEGER), NEW, ABSTRACT;''​
 +
 +Возвращает минимальные (''​minW,​ minH''​) и максимальные (''​maxW,​ maxH''​) границы размеров отображения,​ внедряемого в модель ''​модель_ ''​. При попытке внедрить в ''​модель_ ​ ''​ отображение с 
 +  -  minW > шириной >= maxW
 +  -  minH > высотой >= maxH
 +для модели ''​модель_ ​ ''​ следует (но не обязательно требуется) изменить размер внедряемого отображения.
 +
 +Итоговое условие,​ которое должно выполняться:​
 +  - 0 <= minW <= maxW
 +  - 0 <= minH <= maxH
 +
 +====PROCEDURE ReplaceView ====
 +''​PROCEDURE (модель_ : Model) **ReplaceView** (стар_ , нов_ : Views.View),​nNEW,​ ABSTRACT;''​
 +
 +Подстановка вместо отображения ''​стар_ '',​ которое должно быть внедренным в ''​модель_ '',​ отображения ''​нов_ '',​ которое не может быть ранее внедренным нигде. В результате ''​нов_ ''​ оказывается внедренным в ''​модель_ '',​ но ''​стар_ ''​ сохраняет свой контекст,​ который затем распространяется вместе с ''​нов_ ''​ . Замена отображения допускает обертывание отображений:​ Новое отображение занимает место старого,​ добавляет некоторые новые свойства,​ но также может сохранить ссылку на старое отображение и делегировать к нему запросы. Пока старое отображение сохраняет свой контекст,​ оно будет продолжать работать,​ как если бы оно было непосредственно внедрено в ''​модель_ ''​.
 +
 +Предусловие
 +    стар_# NIL
 +    стар_.context.ThisModel() = модель_
 +    EmbeddedIn(old,​ модель_)
 +    нов_# NIL
 +    нов_.context = NIL
 +
 +Постусловие
 +    NotEmbedded(стар_)
 +    нов_.context.ThisModel() = модель_
 +    нов_.context = стар_.context
 +==== TYPE View ====
 +''​TYPE **View** (Views.View),​ ABSTRACT;''​
 +
 +Отображение для контейнеров.
 +
 +====PROCEDURE Internalize====
 +''​PROCEDURE (вьюшка_ : View) **Internalize** (VAR rd: Stores.Reader)''​
 +
 +Уточнение унаследованной процедуры.
 +
 +Полностью реализованная загрузка для отображений без собственного сохраняемого состояния,​ обрабатывающая загрузку модели отображения-контейнера и диспетчера. Если загрузка модели терпит неудачу,​ отображение переключается в нелегальное состояние и загрузка ''​вьюшка_ ''​ отменяется;​ в противном случае модель присоединяется к ''​вьюшка_ ''​. Если загрузка диспетчера терпит неудачу,​ диcпетчер хранится для последующей выгрузки,​ чтобы предотвратить потерю информации,​ но не подключается к отображению (''​вьюшка_ .ThisController() = NIL''​),​ и отображение загружается нормально (то есть, не становится нелегалом).
 +
 +====PROCEDURE Externalize ====
 +''​PROCEDURE (вьюшка_ : View) **Externalize** (VAR wr: Stores.Writer)''​
 +
 +Уточнение унаследованной процедуры
 +
 +Полностью реализованная выгрузка для отображений без собственного сохраняемого состояния,​ обрабатывающая загрузку модели отображения-контейнера и диспетчера. Если ''​вьюшка_ ''​ было ранее загружено с диспетчером-нелегалом,​ и никакой другой диспетчер установлен не был, то нелегальный диспетчер будет выгружен,​ хотя ''​вьюшка_ .ThisController() = NIL''​.
 +
 +Супервызов в начале обязателен
 +
 +Предусловие
 +    вьюшка_ .ThisModel() # NIL 20
 +
 +====PROCEDURE CopyFrom ====
 +''​PROCEDURE (вьюшка_ : View) **CopyFrom** (источник_ : Stores.Store)''​
 +
 +Уточнение унаследованной процедуры
 +
 +Предполагая,​ что модель для ''​вьюшка_ ''​ уже была установлена,​ копирует диспетчер и, возможно,​ состояние другого отображения из ''​источник_ ''​. Если ''​источник_ ''​cодержит скрытый нелегальный диспетчер (см. **Internalize** выше), ссылка на него также копируется.
 +
 +Супервызов в начале обязателен
cp/containers.txt · Последние изменения: 2020/07/24 09:22 — iadenisov