Модуль Containers содержит различные описатели типов и записей, и связанные процедуры для работы с контейнерами. Суть контейнеров состоит в том, что эти объекты могут содержать другие объекты.
Контейнеры делятся на две категории:
Модуль Containers поддерживает только динамические контейнеры. Динамические контейнеры содержат в себе два типа содержимого:
Для построения отображений модуль Containers предоставляет строительные блоки в виде моделей и диспетчеров. Особенностью модуля является то, что в отличии от большинства модулей BlackBox, этот модуль предоставляет к использованию несколько реализованных типов (кроме типов-интерфейсов).
Модуль содержит константы:
'' (c: Controller) SelectAll (select: BOOLEAN), NEW, ABSTRACT;''
Может содержать в качестве параметра select одну из двух констант:
''CONST hide, show ''
Часто используются в контроллерах отображений для скрытия или показа выбранной метки.
TYPE Model (Models.Model), ABSTRACT;
Абстрактная базовая модель для всех контейнеров.
PROCEDURE (модель_ : Model) GetEmbeddingLimits (OUT minW, maxW, minH, maxH: INTEGER), NEW, ABSTRACT;
Возвращает минимальные (minW, minH) и максимальные (maxW, maxH) границы размеров отображения, внедряемого в модель ''модель_ ''. При попытке внедрить в ''модель_ '' отображение с
для модели ''модель_ '' следует (но не обязательно требуется) изменить размер внедряемого отображения.
Итоговое условие, которое должно выполняться:
PROCEDURE (модель_ : Model) ReplaceView (стар_ , нов_ : Views.View),nNEW, ABSTRACT;
Подстановка вместо отображения ''стар_ '', которое должно быть внедренным в ''модель_ '', отображения ''нов_ '', которое не может быть ранее внедренным нигде. В результате ''нов_ '' оказывается внедренным в ''модель_ '', но ''стар_ '' сохраняет свой контекст, который затем распространяется вместе с ''нов_ '' . Замена отображения допускает обертывание отображений: Новое отображение занимает место старого, добавляет некоторые новые свойства, но также может сохранить ссылку на старое отображение и делегировать к нему запросы. Пока старое отображение сохраняет свой контекст, оно будет продолжать работать, как если бы оно было непосредственно внедрено в ''модель_ ''.
Предусловие
стар_# NIL стар_.context.ThisModel() = модель_ EmbeddedIn(old, модель_) нов_# NIL нов_.context = NIL
Постусловие
NotEmbedded(стар_) нов_.context.ThisModel() = модель_ нов_.context = стар_.context
TYPE View (Views.View), ABSTRACT;
Отображение для контейнеров.
PROCEDURE (вьюшка_ : View) Internalize (VAR rd: Stores.Reader)
Уточнение унаследованной процедуры.
Полностью реализованная загрузка для отображений без собственного сохраняемого состояния, обрабатывающая загрузку модели отображения-контейнера и диспетчера. Если загрузка модели терпит неудачу, отображение переключается в нелегальное состояние и загрузка вьюшка_ '' отменяется; в противном случае модель присоединяется к ''вьюшка_ ''. Если загрузка диспетчера терпит неудачу, диcпетчер хранится для последующей выгрузки, чтобы предотвратить потерю информации, но не подключается к отображению (вьюшка_ .ThisController() = NIL''), и отображение загружается нормально (то есть, не становится нелегалом).
PROCEDURE (вьюшка_ : View) Externalize (VAR wr: Stores.Writer)
Уточнение унаследованной процедуры
Полностью реализованная выгрузка для отображений без собственного сохраняемого состояния, обрабатывающая загрузку модели отображения-контейнера и диспетчера. Если вьюшка_ '' было ранее загружено с диспетчером-нелегалом, и никакой другой диспетчер установлен не был, то нелегальный диспетчер будет выгружен, хотя ''вьюшка_ .ThisController() = NIL.
Супервызов в начале обязателен
Предусловие
вьюшка_ .ThisModel() # NIL 20
PROCEDURE (вьюшка_ : View) CopyFrom (источник_ : Stores.Store)
Уточнение унаследованной процедуры
Предполагая, что модель для ''вьюшка_ '' уже была установлена, копирует диспетчер и, возможно, состояние другого отображения из ''источник_ ''. Если ''источник_ ''cодержит скрытый нелегальный диспетчер (см. Internalize выше), ссылка на него также копируется.
Супервызов в начале обязателен