                         4. ОБЪЕКТЫ ОКОН

                            А. ОБЗОР

     Исходная концепция окна (Window) была разработана в Turbo
Pascal  2.0.  Первоначально  окно было представлено всего лишь
двумя координатами X,  Y,  которые определяли участок  экрана,
где  производились запись и просмотр.  Вскоре после этого были
разработаны расширенные пакеты,  которые дополнили эту концеп-
цию рамками вокруг фрагментов текста и способностями сохранять
и восстанавливать содержимое экрана внизу окна.
     С разработкой  в  Turbo  Pascal 4.0 раздельной компиляции
программных модулей появилась возможность  дальнейшего  совер-
шенствования концепции окна. Система Turbo Professional 4.0, в
числе других пакетов,  предоставила возможность  использования
окон,  которые можно было заносить в стек и удалять,  выделять
тенями и изображать покомпонентно,  перемещать  и  изменять  в
размерах.  Система  Turbo  Professional 5.0 добавила к уже су-
ществующим модули более высокого уровня: например, внутри окон
могли отображаться списки указаний и текст подсказок, и, кроме
того,  эти модули обладали основными возможностями окон - соз-
данием рамок, теней, заголовков и т.д.
     В настоящее время объектно-ориентированное программирова-
ние  создало  условия  для очередного значительного расширения
возможностей окон. Рассмотрим примитивное окно в качестве объ-
екта,  который знает, как рисовать, стирать, перемещать себя и
изменять свои размеры. Это окно мало знает о своем фактическом
содержании,  что  весьма удобно.  Когда из такого примитивного
окна получают более специализированные объекты,  каждый  полу-
ченный  объект  наследует возможности своего предшественника и
затем добавляет к ним свои собственные,  новые. Таким образом,
полная  иерархия объектов окон может быть представлена в виде:
примитивные окна;  окна,  обладающие возможностью занесения  в
стек;  окна,  поддерживающие  интерфейс с клавиатурой и мышью;
окна,  содержащие списки указаний,  системы подсказок,  экраны
ввода  данных и обладающие многими другими возможностями.  Эта
иерархия может быть использована  последовательно  или  произ-
вольно в соответствии с требованиями прикладной программы.
     Идеальным применением методологии  объектно-ориентирован-
ного программирования является разработка интерфейса пользова-
теля. Это было учтено в системе Object Professional 1.0, в ре-
зультате чего достигнута полная реорганизация возможностей ра-
боты с окнами системы Turbo Professional.  Если вы  знакомы  с
системой Turbo Professional,  вы наверняка заметили сходство с
ней нового пакета.  Вы также заметите много мощных  расширений
и,  что не менее важно,  унификацию многих концепций,  которые
добавлялись по мере развития системы Turbo Professional. Авто-
ры стали сторонниками объектно-ориентированного программирова-
ния (ООП),  убедившись в возможностях, которые открываются при
тщательно разработанной иерархии,  такой,  как в окнах системы
Object Professional.
     В этой  главе  описывается  почти  вся  иерархия объектов
окон, включая следующие типы объектов:
    [Root]
      LoadableColorSet
      PackedWindow
      [PointerStack]
        WindowStack
      [DoubleListNode]
       HeaderNode*
       ShadowNode*
       HotNode*
       MenuitemNode
      [DoubleList]
        [CircularList]
         MenuitemList*
     ScrollBar*
     ScreenRect*
     VirtScreen
     AbstractFrame
       Frame
     AbstractWindow
       RawWindow
         SubMenu*
         StackWindow
           CommandWindow
             Menu
             PickList
               DirList
               PathList
               AbstractHeelpWindow
                 PageHelpWindow
                 ScrollingHelpWindow

     Объекты, чьи имена  заключены  в  квадратные  скобки,  не
описываются в данной главе.  Все они описаны в разделе, посвя-
щенном модулю OPROOT (Глава 8).  Объекты,  отмеченные звездоч-
кой,  представляют собой объекты низкого уровня, первоначально
разработанные для внутреннего использования.  Методы этих объ-
ектов, полезные для прикладных программистов, будут описаны по
мере их использования. Приведенная выше иерархия окон не явля-
ется полной; остальная ее часть относится к экранам ввода дан-
ных (EntryScreen,  ScrollingEntryScreen) и другим  специальным
окнам высокого уровня (Memo,  TextEditor, Browser и другие) не
описана в данной главе.
     Краткое описание каждого объекта,  приведенное ниже, поз-
волит выбрать из них наиболее подходящий для конкретного  при-
менения, а последующие разделы предоставят их подробное описа-
ние.
     Объект LoadableColorSet  - это простое расширение объекта
ColorSet,  описанного вместе с модулем OPCRT. Он полностью со-
держит объект ColorSet в качестве поля данных, которое исполь-
зуется для описания видеоатрибутов  любого  экранного  объекта
системы  Object  Professional.  В отличие от объекта ColorSet,
объект LoadableColorSet получен из объекта Root и обеспечивает
методы  Load и Store.  Таким образом,  он может быть записан и
считан из абстрактных последовательных файлов.  В остальном он
обладает теми же признаками, что и объект ColorSet.
     Объект PackedWindow - это объектно-ориентированная версия
средства,   содержащегося   в   модуле   TPCRT  системы  Turbo
Professional. Объект PackedWindow сохраняет содержимое прямоу-
гольного  участка экрана в сжатом формате.  Экономия экранного
пространства за счет сжатия составляет от 30%  до  90%.  Такие
упакованные окна могут быть записаны и считаны с диска,  ском-
понованы непосредственно в EXE-файл и  отображены  на  экране.
Если  нужно отобразить большое количество статических экранов,
то  для  этих   целей   лучше   всего   использовать   объекты
PackedWindows.  Предусмотрена резидентная утилита,  называемая
PSCREEN,  которая позволяет захватывать текстовые экраны, соз-
данные  любой  программой,  и  сохранять их на диске в формате
объекта PackedWindow.  В разделе H данной главы будет описано,
как использовать утилиту PSCREEN.
     Объект WindowStack  -  это  специальная   форма   объекта
PointerStack (из модуля OPROOT).  Объект WindowStack управляет
связями между всеми окнами объекта StackWindow,  изображенными
на экране одновременно.  Система Object Professional объявляет
статическую глобальную переменную объекта WindowStack под наз-
ванием wStack. Все окна объекта типа StackWindow (или получен-
ные из них) автоматически помещаются в статическую  глобальную
переменную  wStack  при их отображении на экране и извлекаются
при их удалении. В основном, использование объекта WindowStack
автоматизировано    самим    объектом    StackWindow;   объект
WindowStack включает методы,  позволяющие удалять и  извлекать
верхнее окно,  находящееся в стеке,  а также оценивать текущую
позицию мыши, чтобы определить, в каком окне она находится.
     Объекты окон,  в основном,  используют связные списки для
того,  чтобы управлять совокупностью элементов, количество ко-
торых  заранее  неизвестно.  Объекты  HeaderNode,  ShadowNode,
HotNode и MenuItemNode получены из  объекта  DoubleListNode  и
служат  в  качестве  узлов  в  таких  связных списках.  Объект
HeaderNode  управляет  заголовком  окна,  содержащим  позицию,
строку  и  видеоатрибуты.  Объект ShadowNode управляет прямоу-
гольным участком экрана, примыкающим к рамке окна и обладающим
способностью  изображаться  в виде прозрачной или непрозрачной
тени.  Объект HotNode описывает другой  прямоугольный  участок
экрана;  он может использоваться для того,  чтобы обнаруживать
нажатия на клавиши мыши и преобразовывать их в команды. Объект
MenuItemNode  представляет собой один элемент в окне меню.  Он
содержит позицию, строку, символ выбора и дополнительную стро-
ку подсказки.  Все эти типы узлов предоставляют методы для то-
го, чтобы изображать, модифицировать и возвращать информацию о
их состоянии.  Непосредственное обращение к этим узлам в боль-
шинстве случаев не потребуется,  однако  методы,  описанные  в
следующих разделах,  покажут те случаи,  когда такое обращение
будет необходимо.
     Объект MenuItemList  - это специальный связный список для
управления элементами одного подменю системы меню. Он описыва-
ет  ориентацию списка,  его видеоатрибуты,  выбранный в данный
момент элемент меню, некоторые служебные подпрограммы, введен-
ные пользователем,  также как и список объектов MenuItemNodes.
Вероятнее всего,  непосредственный доступ к этому  объекту  не
потребуется, поскольку это сделает сам объект Menu.
     Объект ScrollBar - это примитивный объект, который управ-
ляет преобразованием и изображением зон прокрутки,  используе-
мых мышью.  Он описывает визуальные характеристики зоны  прок-
рутки - расположение,  ориентацию, символы и атрибуты, а также
диапазон пользовательских величин, который соответствует всему
диапазону зоны.  Объект ScrollBar предоставляет методы, позво-
ляющие рисовать и удалять "слайдер" (который отмечает  относи-
тельное положение "текущего элемента" в окне;  например,  если
выделенная зона в списке указаний находилась на 50-ом элементе
из  100 имеющихся,  то слайдер появится на середине зоны прок-
рутки).  Доступ  к  объекту  ScrollBar  обычно  осуществляется
посредством методов объекта Frame.
     Объект ScreenRect реализует некоторые операции,  первона-
чально связанные с окнами,  особенно те, которые предназначены
сохранять и восстанавливать прямоугольные участки экрана,  из-
бегая  при этом появления "снежных хлопьев" на экране.  Каждый
объект RawWindow включает два объекта ScreenRect,  один из ко-
торых  предназначен  для управления участком экрана,  занятого
окном,  когда оно отображено на экране, а другой (дополнитель-
ный) - для сохранения содержимого самого окна.  Если не описы-
ваются совершенно новые категории  окон,  то  непосредственный
доступ к объекту ScreenRect не потребуется.
     Объект VirtScreen играет важную роль при поддержке многих
действий  над  экраном  в системе Object Professional.  Объект
VirtScreen управляет областью памяти  как  физическим  буфером
дисплея  платы  видеоадаптера.  Содержимое виртуального экрана
может быть инициализировано из физического экрана и скопирова-
но  в него обратно.  Все семейство подпрограмм записи на экран
типа FastWrite модуля OPCRT и все методы обновления  изображе-
ний объектов окон на экране могут быть использованы для работы
с  виртуальным  экраном  вместо  физического.  Система  Object
Professional   внутренне  использует  виртуальные  экраны  для
достижения потрясающих визуальных  эффектов  без  ослепляющего
мигания экрана, когда окна перемещаются или изменяют свои раз-
меры,  когда окно проталкивается в вершину стека, производится
запись  невидимого окна или прокручивается большой входной эк-
ран. Эти преимущества предоставляются автоматически; кроме то-
го,  объект VirtScreen можно использовать для получения других
специальных эффектов, таких как плавное прокручивание большого
экрана в меньшем по размеру окне.
     Объект AbstractFrame,  как следует из имени, представляет
собой абстрактный объект, и это подразумевает, что нельзя соз-
давать реальные экземпляры объекта этого типа.  Назначение та-
кого объекта - предоставить обобщенное описание свойств объек-
та без  учета  его  конкретной  реализации,  используя  только
основные  понятия.  Объект  AbstractFrame содержит поля данных
для координат рамки,  ее минимальных и  максимальных  размеров
(используются  при  изменении размеров) и границ ее размещения
(используются при перемещении).  Все координаты  записаны  как
переменные Words с тем,  чтобы не исключать возможности созда-
ния рамки в  графическом  режиме.  Объект  AbstractFrame  пре-
дусмотрен как добавочный блок для дальнейших объектно-ориенти-
рованных расширений иерархии окон, и поэтому нет необходимости
подробно обсуждать его в данной главе.
     Объект Frame детализирует  объект  AbstractFrame.  Как  и
остальные объекты системы Object Professional,  он оптимизиро-
ван для текстового режима и,  следовательно,  содержит символы
для  окантовки изображения и видеоатрибуты.  Он также содержит
три связных списка (для заголовков, теней и активных областей)
и один массив (указателей на зоны прокрутки).  Во многом вид и
восприятие прикладной  программы  определяются  внешним  видом
рамки каждого окна. Как таковые, методы объекта Frame, исполь-
зуемые для добавления и модификации элементов окантовки, заго-
ловка,  тени и активной области могут играть значительную роль
при разработке прикладной программы.  Объектно-ориентированное
программирование предоставляет для этого огромные возможности:
если вы изучите процесс создания рамки для одного типа объекта
окна, вы будете знать, как это делается для всех остальных ти-
пов,  независимо от того, работаете ли вы над созданием экрана
ввода данных, меню, редактора или своего собственного типа ок-
на.
     Вопреки создавшемуся об объекте Frame мнению,  не следует
думать,  что этот объект обязательно изображает окантовку вок-
руг окна.  Рамки могут быть как окантованными, так и неоканто-
ванными.  Рамки,  не имеющие окантовки,  могут,  при необходи-
мости, также содержать заголовки, тени и активные области.
     Объект AbstractWindow - это еще один абстрактный  объект,
описывающий  основные  свойства любого окна.  Он включает поля
для координат, минимального и максимального допустимого разме-
ра,  границ размещения и последнего состояния перед изменением
масштаба изображения. Как и в объекте AbstractFrame, координа-
ты сохранены в переменной Word с тем,  чтобы не препятствовать
реализации графического режима.  Большинство  методов  объекта
AbstractWindow можно опустить; однако, сам факт их существова-
ния предполагает, что потомки объекта AbstractWindow будут об-
ладать, среди прочих, способностями рисовать, удалять, переме-
щать, изменять свои размеры, очищать, выбирать и изменять свой
масштаб. Объект AbstractWindow также содержит добавочные блоки
для объекта AbstractFrame.  Каждый объект AbstractWindow может
иметь две рамки, одна из которых отображается, если окно явля-
ется текущим, а другая - если окно изображено на экране, но не
является текущим.
     Объект RawWindow представляет собой наиболее  примитивный
тип  окна,  с  которым вам фактически придется работать.  Этот
объект является окном текстового режима и обладает  следующими
характеристиками:

     экранные координаты;
     позиция и тип курсора;
     позиция и тип курсора мыши;
     видеоатрибуты, принимаемые по умолчанию;
     символ стандартного фона;
     объект ScreenRect  для  сохранения участка,  закрываемого
         окном;
     дополнительный объект ScreenRect для  содержимого
         окна;
     различные дополнительные флаги;
     основная рамка для текущего окна;
     подменяющая рамка для изображенного на экране,  но не те-
         кущего   окна.

     При изображении объекта RawWindow закрытый им участок эк-
рана сначала будет сохранен в объекте ScreenRect, куда записы-
вается  текущее  положение аппаратного курсора,  курсора мыши,
стандартные текстовые атрибуты  и  оконные  координаты  модуля
OPCRT.  При необходимости восстанавливается первоначальное со-
держимое окна или вызывается  метод  потомка,  чтобы  обновить
его.  Затем изображается основная рамка окна RawWindow.  Нако-
нец,  размещается курсор, задаются стандартные текстовые атри-
буты  и  определяются  оконные координаты модуля OPCRT и мыши.
Последующие записи, имеющие отношение к окну, (используя, нап-
ример,  оператор  WriteLn) будут,  таким образом,  размещены в
объекте RawWindow.
     При удалении  объекта RawWindow сохраняется положение его
курсора,  дополнительно копируется в объект ScreenRect текущее
содержимое окна, восстанавливается основной экран, а положение
курсора,  координаты окна и т.д. устанавливаются в их первона-
чальные значения.
     Объект RawWindow предоставляет множество  других  методов
для того, чтобы:

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

     Объект StackWindow работает подобно  RawWindow  и,  кроме
того,  каждый объект StackWindow при его отображении автомати-
чески  проталкивается  в  глобальную  переменную   WindowStack
(wStack).  Поскольку управление объектами StackWindow осущест-
вляется таким образом,  доступ к ним может быть  произвольным:
любое окно может заноситься в вершину стека или может быть за-
писано туда,  даже если оно не находится на вершине стека. До-
полнительное   пространство   данных,   используемое  объектом
StackWindow,  минимально по сравнению с объектом RawWindow (12
байт  на  один экземпляр окна).  Следовательно,  в большинстве
прикладных  программ  предпочтительнее   использовать   объект
StackWindow  вместо  объекта RawWindow.  Все типы окон системы
Object Professional более высокого уровня получены из  объекта
StackWindow.
     Объект SubMenu - это еще один тип объекта,  полученный из
объекта RawWindow. Он используется в объекте Menu, который уп-
равляет собственным стеком активных подменю системы меню. Объ-
ект SubMenu добавляет объект MenuItemList к обычным полям дан-
ных объекта RawWindow.
     Объект CommandWindow  привносит  новый аспект в поведение
объекта  StackWindow.   Он   связывает   командный   процессор
CommandProcessor с окном для того,  чтобы преобразовать после-
довательности ввода с клавиатуры и нажатия на клавиши  мыши  в
логические команды (см.  Главу 3). Объект CommandWindow хранит
последние команду и нажатие на клавишу,  введенные пользовате-
лем, для обращения к ним программы. Он также связывает окно со
стандартной процедурой обработки ошибок,  которая  вызывается,
как только в окне появляется ошибка. Объект CommandWindow наи-
более часто использует методы Process и ProcessAutoPilot.  Ме-
тод  Process  позволяет управлять окном с помощью клавиатуры и
мыши таким образом,  что этот метод будет интерпретировать ко-
манды,  пока  не  получит  команду на выход (или не произойдет
ошибка). Метод ProcessAutoPilot делает то же самое, но автома-
тически выполняет произвольную последовательность команд перед
возвращением управления клавиатуре.
     Вероятно, не  следует  объявлять  экземпляры объекта типа
CommandWindow,  поскольку он служит только ступенью для  полу-
ченных   из   него  полезных  разработок,  таких  как  объекты
PickList, Menu, EntryScreen и других. Если нужно получить дру-
гие специальные типы окон,  требующие ввода с клавиатуры (нап-
ример,  окно "кнопка радио"),  тогда необходимо ознакомиться с
объектом CommandWindow.
     С точки зрения объектно-ориентированного программирования
Menu представляет собой особенно интересный объект, полученный
из объекта CommandWindow. Если рассматривать систему одноуров-
невого меню,  соответствие очевидно: объект Menu просто связы-
вает объект MenuItemList с объектом CommandWindow и затем  уп-
равляет выбором элемента меню из списка. В системах многоуров-
невого меню ситуация более сложная,  по крайней мере  с  точки
зрения  объекта  Menu.  Объект  Menu  включает  в  себя объект
PointerStack,  который управляет стеком объектов SubMenus, ко-
торые  сами  получены  из объектов RawWindow.  Остальная часть
программы рассматривает эту совокупность окон как  одно  окно,
которое  можно  отобразить и переместить все целиком и которое
либо активно, либо нет.
     Поскольку описание  системы  меню требует много деталей -
координаты, имена элементов, символы окантовки, заголовки, ви-
деоатрибуты  и т.д.  для каждого субменю,  то была разработана
мощная утилита,  которая позволяет создавать меню, а затем за-
писывает  исходный  код.  Она  называется MAKEMENU и описана в
разделе Н данной главы (в части 2).
     Объект PickList  отображает произвольный список элементов
в объекте CommandWindow и управляет выбором одного  или  более
элементов из этого списка.  Сами строки элементов вводятся оп-
ределяемой пользователем подпрограммой (или с  помощью  вирту-
ального метода типа объекта, полученного из объекта PickList),
так что может использоваться изменяющееся количество элементов
любой предварительно заданной длины. Объект PickList изобража-
ет эти элементы в один или более столбцов,  используя любое из
трех  направлений.  Объект  PickList обеспечивает большую гиб-
кость посредством  поддержки  временно  защищенных  элементов,
многочисленных   видеоатрибутов,   элементов,  изображаемых  с
использованием процедур FlexWrite, добавочных блоков пользова-
теля в течение процесса выбора,  специальных рамочных заголов-
ков для указания большего  количества  элементов  вне  экрана,
буквенно-цифрового  поиска,  множественного выбора и поддержки
мыши.
     Объект PickList  представляет собой чрезвычайно расширяе-
мый объект.  Многие задачи интерфейса пользователя могут  быть
решены посредством выбора из списка.  В демонстрационной прог-
рамме DESKPOP, например, распорядитель файлов, календарь и те-
лефонная  книга  являются  объектами,  полученными  из объекта
PickList.  Утилиты MAKEMENU и MAKESCRN используют объекты, по-
лученные из объекта PickList,  и предназначены для выбора пра-
вильных рамок,  символов,  заголовков окна и некоторых  других
категорий элементов.
     В действительности,  представляется  возможным   получить
объект  Menu  из  объекта PickList.  Предпочтительно не делать
этого по меньшей мере по двум причинам:  во-первых, желательно
сохранить  некоторую  степень совместимости сверху вниз с меню
системы Turbo Professional;  во-вторых,  объект Menu более эф-
фективен  для  типичных  систем меню,  которые содержат стати-
ческие одномерные списки элементов. Конечно, Объект Menu также
включает  дополнительный  код  для  поддержки  многоуровневых,
гнездовых систем меню.  Напротив, объект PickList более приго-
ден для тех случаев,  когда элементы заранее неизвестны, когда
необходимы двумерные списки,  когда количество элементов боль-
ше,  чем  может  вместить одно окно (необходима прокрутка) или
когда требуется одновременно выбрать  более  одного  элемента.
При создании интерфейса на основе меню следует принять во вни-
мание все сравнительные достоинства и недостатки объектов Menu
и PickList.
     Объекты DirList и PathList получены из объекта PickList и
помогают управлять файловой системой DOS. Объект DirList отоб-
ражает списки файлов;  объект PathList - списки  подкаталогов.
Эти объекты оказывают конечному пользователю некоторую помощь,
помогая ввести имя файла  или  подкаталога.  Поскольку  объект
DirList  поддерживает  выборку нескольких файлов,  то написать
мощный распорядитель файлов также нетрудно; DESKPOP демонстри-
рует один из таких примеров.
     Последние три объекта,  описанные в этой главе -  объекты
AbstractHelpWindow,   PagedHelpWindow   и  ScrollingHelpWindow
тесно связаны друг с другом.  Каждый из них представляет собой
контекстно-зависимую подсказку во временном рабочем окне.  Мо-
жет удивить то, что все они получены из объекта PickList, а не
из  более общего объекта CommandWindow.  Дело в том,  что окно
для справочной информации может отображать индекс тем подсказ-
ки;  это  представляет  собой  еще одну возможность для списка
указаний. В сочетании со способностью отображать текст это оз-
начает, что окно для справочной информации является двухрежим-
ным объектом,  который ведет себя то как окно выбора,  то  как
программа ускоренного просмотра файла.
     Объект AbstractHelpWindow является объектом  абстрактного
типа, который реализует методы, используемые для чтения текста
подсказки из индексированного,  сжатого информационного файла,
но  не реализует способ отображения текста подсказки.  Объекты
PagedHelpWindow и ScrollingHelpWindow предоставляют  различные
наборы методов для отображения текста подсказки.  При странич-
ном методе клавиши <PgDn> и <PgUp> показывают совершенно новую
страницу  текста подсказки,  в то время как обычные клавиши со
стрелкой перемещают подсвеченную зону от одного звена обобщен-
ного текста к другому. (Более подробно такие звенья обобщенно-
го текста будут  описаны  позже).  Для  сравнения,  в  объекте
ScrollingHelpWindow  клавиши  со стрелками перемещают курсор в
окне для  справочной  информации  как  в  редакторе,  и  текст
подсказки  прокручивается вертикально и горизонтально по одной
строке или одному столбцу.  Объект  PagedHelpWindow  совместим
сверху  вниз  с системой подсказок системы Turbo Professional;
объект ScrollingHelpWindow  зачастую  более  предпочтителен  в
среде окон с изменяемыми размерами.
     Для того,  чтобы поддержать  создание  файлов  подсказок,
разработан компилятор подсказок MAKEHELP, который преобразовы-
вает текстовый файл,  описывающий различные темы подсказок,  в
сжатый  файл с произвольной выборкой,  который могут считывать
объекты окна.  Объекты PagedHelpWindow  и  ScrollingHelpWindow
используют одинаковый входной формат.
     На этом обзор объектов,  описанных в этой главе, заканчи-
вается.  Дальнейшая общая информация, примеры рабочих программ
и подробное описание типов данных и методов для каждого объек-
та представлены в следующих ниже разделах.
     Особенно важно помнить о  роли  наследования  в  иерархии
объектов окон.  Все индивидуальные свойства,  добавочные блоки
низкого уровня и общие методы самых примитивных объектов оста-
ются доступными для окон более высокого уровня.  В справочнике
Procedure and Function Reference и в базе данных  POPHELP  со-
держится  подробная  информация  обо всех имеющихся инструмен-
тальных средствах.

                   B. OPFRAME: ОБЪЕКТЫ РАМКИ

     Программный модуль OPFRAME описывает несколько важных ти-
пов  объектов,  но  вряд  ли когда-либо появится необходимость
объявлять переменную в явном виде,  используя один из них. Эти
типы образуют что-то вроде китайской головоломки, где один тип
объекта находится внутри второго, тот внутри следующего, и так
вплоть  до самого большого объекта,  собственно объекта Frame,
который находится внутри объекта RawWindow.  Объект Frame  без
связанного  с  ним окна будет на редкость бесполезен.  В любом
случае, создавая рамку окна, необходимо знать и уметь вызывать
методы объекта Frame. Эти методы описаны ниже.
     В модуль  OPFRAME  также   включен   объект   ScreenRect,
поскольку  он отвечает за построение теней.  Объект ScreenRect
представляет собой объект низкого уровня,  который, тем не ме-
нее,  является  настолько  важным,  что будет описан подробно.
Объект ScreenRect предоставляет все инструментальные средства,
необходимые  для  сохранения и восстановления участков экрана.
Этот объект широко используется в объекте RawWindow.
     Перед тем,  как продолжить описание,  необходимо уточнить
разницу  между  некоторыми  словами,  часто  встречающимися  в
тексте. Окантовка - это группа видимых символов, которые окру-
жают окно или рамку.  Рамка - это логическая структура данных,
связанная с окном. Рамка содержит символы, нужные для окантов-
ки,  а также содержит заголовки, тени, зоны прокрутки и актив-
ные  области.  Рамка может иметь или не иметь окантовку.  Окно
содержит одну или более рамок,  также как и структуры, необхо-
димые для сохранения основного экрана,  положения курсора, по-
ложения мыши и т.д.


                1. ПРЯМОУГОЛЬНЫЕ УЧАСТКИ ЭКРАНА

     Объект ScreenRect  является  довольно примитивным,  но не
настолько, как его объектно-неориентированные предшественники.
Способность сохранять и восстанавливать участки экрана, на ко-
торые будет накладываться окно,  была одним из важных добавле-
ний, внесенных разработчиками в первые системы временных окон.
ScreenRect сохраняет в скрытом виде данные и код для этих опе-
раций с тем,  чтобы те же самые возможности могли быть исполь-
зованы для окон,  а также для схожих структур типа  затененных
прямоугольников.  Объект ScreenRect также знает,  как изменять
свои размеры и пересылать любое предыдущее содержимое в  новый
буфер.  Это очень важно для создания объектов окна в современ-
ных системах, предусматривающих работу с мышью.
     Если требуется   разработать   новые  типы  окон,  объект
ScreenRect может оказаться очень полезным;  если этого не тре-
буется, вам просто не помешает знать о его существовании.

                              ТИПЫ

     ScreenBuffer      = array[0..65520] of Byte;
     ScreenBufferPtr   = ^ScreenBuffer;

     Используются для доступа к буферам,  в  которых  хранится
содержимое объекта ScreenRect.

     ScreenRect =
       object(Root)
          ...
       end;

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



     Adjust
     ------
     Объявление
     procedure Adjust(X1, Y1, X2, Y2, : Byte);

     Назначение
     Присваивает переменным Х1,  Y1, X2, Y2 значения координат
буфера.

     Описание
     Эту процедуру  можно использовать для изменения положения
объекта ScreenRect,  изменения его размеров,  либо для того  и
другого вместе.
     Если размеры остаются неизменными,  процедура  Adjust  не
выделяет нового буфера. (В частности, если буфер был записан в
какую-либо специальную,  а не в динамически распределяемую об-
ласть памяти, он там и останется). Если размер буфера все-таки
изменился,  процедура Adjust освобождает старый буфер (если он
предварительно  был  выделен)  и  выделяет новый в динамически
распределяемой области памяти. Если для нового буфера недоста-
точно динамически распределяемой области памяти,  то процедура
Adjust запоминает код  ошибки  epFatal+ecOutOfMemory,  который
можно проверить, вызвав srResult.
     Процедура Adjust не пересылает содержимое старого  буфера
в  новый  и  не  инициализирует  новый буфер каким-либо другим
способом.  Если это необходимо, следует использовать процедуру
Transfer.

     Пример

     SR.Alloc(1, 1, 10, 10);
     SR.Clear(' ', TextAttr);
     SR.Adjust(1, 1, 5, 5);

     Размеры 10*10 исходного блока экранного буфера объекта SR
изменяются на блок размером 5*5.  Содержимое исходного  буфера
SR потеряно.

     SR.Alloc(1, 1, 10, 10);
     SR.Clear(' ', TextAttr);
     SR.Adjust(20, 1, 29, 10);

     Объект SR перемещается на новые координаты. Поскольку его
размеры не изменились, содержимое буфера не теряется.

     См.также
     Alloc                               Transfer
     srResult


     Alloc
     -----
     Объявление
     constructor Alloc(X1, Y1, X2, Y2 : Byte);

     Назначение
     Инициализирует координаты и выделяет буфер экрана.

     Описание
     Конструктор Alloc использует вызов функции GetMem для вы-
деления  2*(X2-X1+1)*(Y2-Y1+1) байт в динамически распределяе-
мой области памяти.  Этот буфер будет использоваться для того,
чтобы  зафиксировать изображение (включая символы и видеоатри-
буты) прямоугольного  участка  экрана,  с  координатами  углов
(X1,Y1) и (X2,Y2),  включительно.  Координаты задаются в абсо-
лютных величинах, причем верхний левый угол экрана имеет коор-
динаты (X=1,  Y=1). Конструктор Alloc устанавливает внутренний
флаг,  означающий, что конструктор Alloc выделил буфер для то-
го,  чтобы деструктор Done знал, что этот буфер нужно освобож-
дать.
     Если конструктор Alloc откажет, то код ошибки сохраняется
в глобальной переменной InitStatus.
     Фактически конструктор  Alloc  не сохраняет образ экрана.
Экранный буфер остается неинициализированным.

     Пример

     uses
       OpCrt, OpFrame;
     var
       SR : ScreenRect;
       Row, Col : Integer;
     begin
       {Создается экранное изображение для демонстрации}
       FastFill(4000, #176, 1, 1, TextAttr);

       if not SR.Alloc(1, 1, 20, 3) then begin
         WriteLn('Failed to Allocate ScreenRect');
         Halt;
       end;

      {Сообщение пересылается до тех пор, пока нажата клавиша}
       repeat
         Row := 1+Random(21);
         Col := 1+Random(59);
         SR.Adjust(Col, Row, Col+20, Row+2);
         SR.CopyFromScreen;
         FastText(' Hello World ', Row+1, Col+1);
         Delay(200);
         SR.CopyToScreen;
       until KeyPressed;
       SR.Done;
     end.

     Выделяет объект  ScreenRect  размером 20*3.  Такой объект
используется для того, чтобы неоднократно сохранять содержимое
экрана  (с помощью процедуры CopyFromScreen),  а затем восста-
навливать его (с помощью процедуры CopyToScreen)  после  того,
как  на  экране  будет записано 'Hello World'.Процедура Adjust
изменяет координаты существующего объекта ScreenRect, не пере-
нося старое содержимое (которое в данном случае не нужно).

     См.также
     Init


     BufSize
     -------
     Объявление
     function BufSize : Word;

     Назначение
     Возвращает размер буфера в байтах.

     Описание
     Возвращает результат  вычислений   2*(X2-X1+1)*(Y2-Y1+1),
где  переменные  представляют собой текущие координаты объекта
ScreenRect.  Этот результат представляет собой количество байт
памяти, использующихся буфером экрана.

     Пример

     SR.Alloc(1, 1, ScreenWidth, ScreenHeight);
     WriteLn('This object  is  using a buffer of ',  SR.BufSize,
'bytes');

     Сообщается о  размере  буфера,  выделенного конструктором
Alloc. Для полного экрана размером 80*25 функция BufSize возв-
ращает размер буфера, равный 4000 байт.


     Clear
     -----
     Объявление
     procedure Clear(FChar : Char; FAttr ; Byte);

     Назначение
     Очищает буфер, используя символ и видеоатрибут.

     Описание
     Очищает буфер прямоугольного участка экрана,  делая с ок-
ном то же самое,  что и команда ClrScr.  Параметр FChar -  это
обычно символ пробела,  а параметр FAttr - какой-либо видеоат-
рибут.  Результат  процедуры   будет   виден,   когда   объект
ScreenRect будет скопирован обратно на экран.

     Пример

     SR.Clear(' ', TextAttr);

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

     SR.Clear(#178, $1E);

     Очищает экранный буфер объекта ScreenRect,  заполняя  его
символами фонового изображения в цвете,  определяемом видеоат-
рибутом (желтый на синем).


     Coordinates
     -----------
     Объявление
     procedure Coordinates(var X1, Y1, X2, Y2 : Byte);

     Назначение
     Возвращает координаты прямоугольного участка экрана.

     Описание
     Обеспечивает доступ к  внутренним  полям  данных  объекта
ScreenRect, в которых записаны его экранные координаты.

     Пример

     var
       Xlo, Ylo, Xhi, Yhi : Byte;
     ...
     SR.Coordinates(Xlo, Ylo, Xhi, Yhi);
     WriteLn('Upper left corner: ', Xlo, ',', Ylo);
     WriteLn('Lower right corner: ', Xhi, ',' Yhi);

     Отображает координаты физического экрана заданного прямо-
угольного участка экрана.


     CopyFromScreen
     --------------
     Объявление
     procedure CopyFromScreen;

     Назначение
     Копирует с экрана в буфер.

     Описание
     Инициализирует экранный буфер посредством копирования те-
кущего содержимого экрана. Последний набор координат, передан-
ный в объект ScreenRect, определяет, какой участок экрана ско-
пирован.
     Когда процедура  CopyFromScreen  считывает с экрана,  она
использует виртуальный видеосегмент. Следовательно, если в это
время  виртуальный экран активен,  то процедура CopyFromScreen
будет считывать содержимое виртуального  экрана,  а  не  физи-
ческого.

     Пример

     SR.Alloc(1, 10, 20, 12);
     SR.CopyFromScreen;
     FastText(' Hello World ', 11, 1);
     Delay(500);
     SR.CopyToScreen;

     Копирует участок физического экрана в буфер SR. Отобража-
ет сообщение в том же прямоугольнике,  через 1/2 секунды копи-
рует  буфер  SR  обратно  на  физический экран (восстанавливая
исходное содержимое).

     См.также
     CopyToScreen                      VirtScreen.Activate


     CopyPartToScreen
     ----------------
     Объявление
     procedure CopyPartToScreen(X1, Y1, X2, Y2 : Byte);

     Назначение
     Копирует часть буфера на экран.

     Описание
     Параметры X1,  Y1,  X2, Y2 являются абсолютными экранными
координатами. Они должны находиться в пределах текущих коорди-
нат    прямоугольного    участка   экрана,   иначе   процедура
CopyPartToScreen  будет  генерировать  сообщение   об   ошибке
(epNonFatal+ecWinCoordsBad) и прекратит свою работу.  Заданный
участок экранного буфера копируется обратно на физический  эк-
ран.

     Пример

     SR.Alloc(1, 1, 10, 10);
     SR.Clear(' ', TextAttr);
     SR.CopyPartToScreen(1, 1, 5, 5);

     Выделяет блок  размером  10*10  и  очищает  буфер объекта
ScreenRect;  копирует на физический экран только  часть  этого
буфера размером 5*5.

     См.также
     CopyToScreen


     CopyToScreen
     ------------
     Объявление
     procedure CopyToScreen;

     Назначение
     Копирует буфер на экран.

     Описание
     Весь прямоугольный участок записывается в  свое  исходное
положение на физическом экране.  Обычно в результате этого эк-
ран восстанавливается в то состояние,  которое было до  вызова
процедуры CopyFromScreen.
     Когда процедура CopyToScreen производит запись на  экран,
она использует виртуальный видеосегмент.  Следовательно,  если
виртуальный  экран  в  это   время   активен,   то   процедура
CopyToScreen  будет  записывать на виртуальный экран,  а не на
физический.

     Пример

     SR.Alloc(1, 10, 20, 12);
     SR.CopyFromScreen;
     FastText(' Hello World ', 11, 1);
     Delay(500);
     SR.CopyToScreen;

     Копирует содержимое физического экрана в буфер SR.  Отоб-
ражает сообщение на заданных координатах,  затем через 1/2 се-
кунды копирует буфер SR обратно на физический  экран,  восста-
навливая его исходное содержимое.

     См.также
     CopyPartToScreen


     Done
     ----
     Объявление
     destructor Done; virtual;

     Назначение
     Освобождает буфер.

     Описание
     Объект ScreenRect следит за тем,  кто выделяет его экран-
ный  буфер.  Если это делает сам объект ScreenRect (обычно при
помощи  конструктора  Alloc),  то  буфер  будет  освобождаться
посредством вызова деструктора Done.  В противном случае, если
это потребуется,  освобождать буфер придется самой  вызывающей
программе.

     Пример

     SR.Done;

     Освобождает прямоугольный участок экрана. Если была выде-
лена какая-либо динамически распределяемая область памяти,  то
такая область будет освобождена.

     См.также
     Alloc                           Init


     HaveContents
     ------------
     Объявление
     function HaveContents : Boolean;

     Назначение
     Возвращает значение True,  если содержимое было загружено
с помощью конструктора Load.

     Описание
     Этот метод  имеет  смысл  применять  только к абстрактным
последовательным файлам.  Если объект  ScreenRect  сохранен  в
абстрактном  последовательном файле,  то содержимое его буфера
дополнительно может быть также записано в абстрактный последо-
вательный  файл.  В случае,  если абстрактный последовательный
файл  будет  считан,  то  и  буфер  будет  инициализирован  из
абстрактного   последовательного   файла.   При  этом  функция
HaveContents возвратит значение True.

     Пример

     SRS.Init('SCRRECT.STM', SOpen, 1024); {Открывает абстракт-
                                 ный последовательный файл,
                                 содержащий объект ScreenRect}
     if not SR.Load(SRS) then    {Загружает объект ScreenRect}
       Halt;
     SRS.Done;                    {Закрывает абстрактный
                                   последовательный файл}
     if not SR.HaveContents then  {Проверяет содержимое}
       SR.Clear(' ', TextAttr);   {Очищает буфер, если
                                   ничего не было загружено}
     SR.CopyToScreen;             {Копирует буфер на экран}

     Если содержимое   только   что    загруженного    объекта
ScreenRect не записано в абстрактный последовательный файл, то
буфер очищается. Затем буфер копируется на физический экран.

     См.также
     StoreContents                 Load


     Init
     ----
     Объявление
     constructor Init(X1, Y1, X2, Y2 : Byte;
                                            BufPtr : Pointer);

     Назначение
     Инициализирует координаты и назначает предварительно  вы-
деленный буфер.

     Описание
     Работает подобно  конструктору Alloc за исключением того,
что адрес  буфера  передается  в  конструктор  Init.  Параметр
BufPtr  должен  указывать  на область размером по меньшей мере
2*(X2-X1+1)*(Y2-Y1+1) байт.
     Параметр BufPtr может указывать на блок в обычной динами-
чески распределяемой области памяти или на другую область, та-
кую как неиспользуемая видеостраница.  В последнем случае сле-
дует использовать подпрограмму GetPagePointer модуля OPCRT.
     Конструктор Init сбрасывает внутренний флаг с тем,  чтобы
деструктор Done не делал попыток освободить  пространство,  на
которое указывает параметр BufPtr.
     Фактически конструктор Init не хранит образ  экрана.  Эк-
ранный буфер остается неинициализированным.

     Пример

     var
       MyBuf : Pointer;
     ...
     GetMem(BufPtr, 2*ScreenWidth*ScreenHeight);
     SR.Init(1, 1, ScreenWidth, ScreenHeight, BufPtr);

     Выделяет буфер,  достаточный для сохранения полного экра-
на; создает экземпляр прямоугольного участка экрана, используя
этот буфер.

     См.также
     Alloc                 GetPagePointer(OPCRT)


     Load
     ----
     Объявление
     constructor Load(var S : IdStream);

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

     Описание
     Считывает координаты  прямоугольного  участка  экрана  из
абстрактного последовательного файла.  Затем считывает для эк-
ранного буфера код указателя. Если указатель был зарегистриро-
ван с абстрактным последовательным файлом,  то физический ука-
затель  назначается  в указатель буфера объекта ScreenRect,  а
динамически распределяемая область памяти не выделяется.  (Это
пригодится,  когда для буфера экрана будет использоваться под-
меняющая видеостраница). В других случаях конструктор Load вы-
деляет буфер в динамически распределяемой области памяти.
     Если содержимое объекта ScreenRect было сохранено  вместе
с самим объектом, то конструктор Load будет считывать и разме-
щать его в буфере.  В этом случае функция HaveContents возвра-
щает значение True.
     Процедурой регистрации   абстрактного   последовательного
файла    для    объекта    ScreenRect    является    процедура
ScreenRectStream.

     Примеры

     var
       SR : ScreenRect;
       SRS : BufIdStream;
       Status : Word;
     ...
     SRS.Init('SCRRECT.STM', SOpen, 1024);
     SRS.RegisterHier(ScreenRectStream);
     SRS.Get(SR);
     Status := SRS.GetStatus;
     if Status <> 0 then begin
       WriteLn('Load error ', Status);
       Halt;
     end;
     SRS.Done;

     Открывает абстрактный последовательный файл, регистрирует
тип объекта ScreenRect и инициализирует буфер  SR  посредством
вызова метода Get абстрактного последовательного файла,  кото-
рый  косвенно  вызывает  конструктор  Load.  Если  абстрактный
последовательный   файл  включал  в  себя  содержимое  объекта
ScreenRect,  то он может быть немедленно скопирован обратно на
экран с использованием процедуры CopyToScreen.

     ...
     SRS.Init(SCRRECT.STM', SOpen, 1024);
     SRS.RegisterHier(ScreenRectStream);
     SRS.RegisterPointer(2000, GetPagePointer(1));
     SRS.Get(SR);

     ...

     Использует вторую видеостраницу (адаптера CGA) для буфера
объекта ScreenRect,  предполагая,  что абстрактный  последова-
тельный файл был сохранен с использованием кода 2000 для этого
указателя.

     См.также
     GetPagePointer(OPCRT)                    Store
     HaveContents



     srResult
     --------
     Объявление
     function srResult : Word;

     Назначение
     Возвращает самый последний код состояния.

     Описание
     Функция srResult используется для проверки ошибок,  кото-
рые  могут  произойти в некоторых операциях объекта ScreenRect
(кроме структур).  Функция srResult возвращает нуль, если оши-
бок нет.
     Возможны следующие ошибки:
     epNonFatal+ecWinCoordsBad             CopyPartToScreen
     epFatal+ecOutOfMemory                 Adjust, Transfer

     Вызов функции srResult восстанавливает  внутреннюю  пере-
менную состояния.  Ее немедленный повторный вызов всегда будет
возвращать нуль.

     Пример

     SR.Transfer(11, 11, 15, 15, ' ', TextAttr);
     Status := SR.srResult;
     if Status <> 0 then begin
       WriteLn('Failed to Transfer, Status = ', Status);
       Halt;
     end;

     Проверяет ошибки после вызова процедуры Transfer.

     if srResult <> 0 then
       WriteLn('Out of memory ', srResult);

     Неправильно! Обращение к функции srResult также  устанав-
ливает ее в нуль.  Надо переслать значение в переменную,  если
необходимо обращаться к ней более одного раза.


     Store
     -----
     Объявление
     procedure Store(var S : IdStream);

     Назначение
     Записывает объект ScreenRect в абстрактный последователь-
ный файл.

     Описание
     Сначала записывает  координаты прямоугольного участка эк-
рана в абстрактный последовательный файл, затем записывает код
указателя  для  экранного  буфера.  Если объект ScreenRect был
инициализирован с помощью конструктора Init  (чтобы  использо-
вать предварительно выделенный буфер), то желательно зарегист-
рировать уникальный код для соответствующего указателя. В этом
случае  конструктор  Load сможет впоследствии определить,  что
буфер выделять не надо.  Если код указателя  не  зарегистриро-
вать,  то  процедура Store запишет код для нулевого указателя,
который конструктор Load потом будет интерпретировать как тре-
бование  выделить  буфер  в динамически распределяемой области
памяти.
     Для того,  чтобы записать содержимое объекта ScreenRect в
абстрактный последовательный файл, перед обращением к процеду-
ре  Store  нужно  вызвать процедуру StoreContents с параметром
True.  Процедура Store записывает это содержимое в сжатом фор-
мате  подобно тому,  какой используется объектом PackedWindow.
Символы и атрибуты  буфера  разделяются,  и  затем  происходит
групповое кодирование. Любой отрезок более чем из четырех рав-
ных байт уплотняется,  сохраняя количество  байт,  на  которое
этот   отрезок   превышает  четыре.  Процедура  Store  объекта
ScreenRect налагает,  в отличие от объекта PackedWindow,  одно
ограничение:  она  не  может уплотнять буфер,  содержащий байт
$FF,  поскольку этот байт зарезервирован как идентификатор уп-
лотняемой группы. Если встречается такой символ или видеоатри-
бут,  то процедура Store  генерирует  сообщение  об  ошибке  в
абстрактном последовательном файле (epNonFatal+ecInvalidData).

     Примеры

     var
       SR : ScreenRect;
       SRS : BufIdStream;
       Status : Word;
     ...
     SR.StoreContents(True);
     ...
     SRS.Init('SCRRECT.STM', SCreate, 1024);
     SRS.RegisterHier(ScreenRectStream);
     SRS.Put(SR);
     Status := SRS.GetStatus;
     if Status <> 0 then begin
       WriteLn('Store error ', Status);
       Halt;
     end;
     SRS.Done;

     Создается абстрактный последовательный файл,  регистриру-
ется  тип  объекта ScreenRect и в него записывается переменная
SR объекта ScreenRect, включая и его содержимое. (В результате
процесса  регистрации  метод  Put  косвенно вызывает процедуру
Store объекта ScreenRect).

     ...
   SR.Init(1, 1, ScreenWidth, ScreenHeight,
                                           GetPagePointer(1));
   ...
   SRS.Init('SCRRECT.STM', SCreate, 1024);
   SRS.RegisterHier(ScreenRectStream);
   SRS.RegisterPointer(2000, GetPagePointer(1));
   SRS.Put(SR);
   ...

     Регистрирует вторую видеостраницу (адаптера  CGA)  с  по-
мощью распорядителя абстрактных последовательных файлов с тем,
чтобы конструктор Load мог  впоследствии использовать для  за-
поминания ту же область памяти.

     См.также
     Load                       StoreContents


     StoreContents
     -------------
     Описание
     procedure StoreContents(On : Boolean);

     Назначение
     Определяет, должна ли процедура Store записывать содержи-
мое экранного буфера.

     Описание
     Вызов этой процедуры с параметром On,  равным True, уста-
навливает внутренний флаг;  процедура Store  будет  записывать
содержимое  экранного  буфера  в  абстрактный последовательный
файл, если флаг установлен.

     См.также
     Store


     Transfer
     --------
     Объявление
     procedure Transfer(X1,  Y1, X2, Y2 : Byte; FChar : Char;
                                 FAttr : Byte);

     Назначение
     Пересылает буфер в новый буфер с координатами X1, Y1, X2,
Y2.

     Описание
     Эта процедура  используется для перемещения или изменения
координат существующего объекта ScreenRect и для пересылки су-
ществующего содержимого на новую позицию.  Содержимое верхнего
левого угла на предыдущей позиции займет место в верхнем левом
углу на новой позиции.  Если стороны нового прямоугольника бу-
дут больше, чем стороны старого, то это пространство будет за-
полнено символами и видеоатрибутами рамки.
     Если новые координаты задают прямоугольник такого же раз-
мера, что и старый, существующий экранный буфер остается неиз-
менным (реальной пересылки не требуется).  В противном  случае
процедура  Transfer  должна выделить новый буфер и переслать в
него старое содержимое перед тем, как освободить старый буфер.
Следует отметить, что последнее действие несовместимо с сохра-
нением ранее выделенного экранного буфера.
     Если динамически  распределяемой  области памяти недоста-
точно для выделения нового буфера,  процедура Transfer запоми-
нает  код ошибки epFatal+ecOutOfMemory.  Состояние проверяется
посредством вызова функции srResult.

     Примеры

     SR.Alloc(1, 1, 10, 10);
     SR.Clear(' ', TextAttr);
     SR.Transfer(11, 11, 15, 15, ' ', TextAttr);

     Процедура Transfer выделяет новый блок размером 5*5 и ко-
пирует  в  него  содержимое исходного блока размером 10*10 (ту
часть, которая поместится в новом блоке).

     SR.Alloc(1, 1, 10, 10);
     SR.Clear(' ', TextAttr);
     SR.Transfer(1, 1, 20, 20, ' ', TextAttr);

     Выделяет новый блок размером 20*20 и копирует в него  со-
держимое исходного блока размером 10*10. Оставшаяся часть пря-
моугольного участка экрана заполняется пробелами в цвете,  оп-
ределяемом по умолчанию видеоатрибутом TextAttr.

     См.также
     Adjust                       srResult



                            2. РАМКИ

     Предлагается вниманию пример программы, который иллюстри-
рует использование рамок.

     program FrameExample;     {EXFRAME.PAS}
     uses
        OpCrt, OpString, OpRoot, OpWindow;
     var
       Win : RawWindow;
       WinOpts : LongInt;
       1, SliderPos : Byte;
       Finished : Boolean;
     begin
     {Создается объект RawWindow, имеющий рамку и обладающий
      способностью изменения размеров}
       WinOpts := wBordered+Clear;
     if not Win.InitCustom(30,  5,  50,  15,  DefaultColorSet,
                           WinOpts) then begin
       WriteLn('Failed to  Initialize  RawWindow, Status ',
               Inistatus);
       Halt;
     end;

     {Добавляются  некоторые элементы объекта Frame}
     with Win.wFrame do begin
       SetFrameType(DblWindowFrame);
       AddShadow(shBR, shOverWrite);
       AddHeader('Top Header', heTC);
       AddHeader('Bottom Header', heBC);
       AddScrollBar(frRR, 1, 9, DefaultColorSet);
     end;

     {Изображается окно, заполняется текстом}
     Win.Draw;
     for I := 2 to 10 do
       Win.wFastText('Hello Mars', I, 5);

     {Обновляются окно или слайдер,     используя    команды    курсора
      вверх или вниз}
     SliderPos := 1;
     Finished := False;
     repeat
       {Обновляются объекты Win и ScrollBar}
       Win.DrawsSlider(frRR, SliderPos);
       Win.wGoToXY(3, SliderPos+1);
       case ReadKeyWord of
         $4800 : if SliderPos > 1 then   {Стрелка вверх}
                   Dec(SliderPos);
         $5000 : if SliderPos < 9 then   {Стрелка вниз}
                   Inc(SliderPos);
         $0118 : Finished := True;       {Отмена команды}
     end;
   until Finished;
   Win.Done;
 end.

     Описанная ниже  рамка  фактически представляет собой поле
данных в объекте Win объекта RawWindow.  Приведенная в примере
программа  сначала инициализирует объект RawWindow с использо-
ванием конструктора InitCustom. Параметр LongInit этого метода
описывает  набор опций окна в побитовой форме.  Одной из таких
опций является wBordered,  которая указывает окну на необходи-
мость  резервирования  одной  дополнительной  строки  и одного
столбца для  окантовки.  Следует  запомнить,  как  описывается
система координат:  активное окно (где записано содержимое ок-
на) занимает на полном  экране  участок  от  столбца  Х=30  до
столбца  Х=50  и  от  строки Y=5 до строки Y=15,  как задано в
конструкторе InitCustom. Окантовка окна отображается со смеще-
нием на одну позицию: от Х=29 до Х=51 и от Y=4 до Y=116. Более
подробное описание конструктора InitCustom дано вместе с  объ-
ектом RawWindow.
     Наиболее важным является следующий блок примера  програм-
мы,  начинающийся  с "with Win.wFrame do begin".  wFrame - это
поле данных объекта типа Frame,  хранящееся в  каждом  объекте
RawWindow.  Оператор with, таким образом, разрешает обращаться
к методам объекта wFrame и создавать рамку  в  соответствии  с
индивидуальными требованиями.  (Каждый объект RawWindow содер-
жит  еще  один  объект  рамки,  называющийся  aFrame,  который
используется при других обстоятельствах. Различия между полями
wFrame и aFrame будут рассмотрены ниже, в разделе, посвященном
объекту RawWindow).
     В примере показаны четыре способа создания рамки в  соот-
ветствии с индивидаульными требованиями пользователя. В первом
из них процедура SetFrameType задает  символы,  использующиеся
для  окантовки.  DblWindowFrame  - это константа,  описанная в
программном модуле OPFRAME, обозначающая символы двойных линий
в ASCII- кодах фирмы IBM со старшими номерами.  Модуль OPFRAME
согласовывает дополнительные стандартные наборы символов окан-
товки,  которые описаны ниже. Каждый массив символов окантовки
содержит 8 элементов,  полностью обеспечивая,  таким  образом,
управление внешним видом окантовки. Если не вызывать процедуру
SetFrameType, окно получит стандартную окантовку, использующую
символы, хранящиеся в константе DefWindowFrame.
     Процедура AddShadow предоставляет возможность  изображать
тени вокруг рамки.  Тени придают изображению объемность и ста-
новятся все более популярными в современных  прикладных  прог-
раммах.  Тени  в  объекте  Frame  реализуются  в виде связного
списка прямоугольных участков (объект ShadowNodes).  При изоб-
ражении рамки содержимое экрана, расположенное под каждым пря-
моугольником, записывается в буфер, а каждый изображенный пря-
моугольник  представляет  собой  тень.  Благодаря  такому уни-
версальному методу тени в объекте Frame обладают большой  гиб-
костью  -  их даже можно нанести со всех четырех сторон рамки,
если есть желание.  Можно задавать такие нестандартные затене-
ния, хотя это довольно утомительно; процедура AddShadow облег-
чает нанесение наиболее общих типов затенений.
     Первый параметр процедуры AddShadow ( shBR) означает, что
тени будут появляться с нижней и с правой стороны окна.  Вари-
ант этого параметра (shBL) предусмотрен для теней с нижней и с
левой стороны окна.  Второй параметр  (shOverWrite)  означает,
что  тень будет накладываться на изображенные на экране симво-
лы,  используя другой символ и видеоатрибут.  Альтернативой  в
данном  случае является параметр shSeeThru,  который означает,
что  тень  изменяет  только  видеоатрибут,  оставляя  видимыми
сквозь нее основные символы.
     Заголовки представляют собой текстовые строки, отображен-
ные внутри рамки. Они также реализуются в виде связного списка
(объект HeadNodes). Вследствие этого для отдельной рамки можно
получить  любое  количество  заголовков  (до 255).  Существует
несколько способов задания заголовков; наиболее простой из них
заключается  в  использовании  процедура AddHeader.  Процедура
AddHeader в качестве первого параметра содержит  предназначен-
ную для отображения текстовую строку,  а указатель относитель-
ного положения - в качестве второго.  Параметр  heTC  означает
размещения заголовка в центре верхней стороны рамки;  параметр
heBC означает размещение заголовка  в  центре  нижней  стороны
рамки; другие варианты этих параметров позволяют размещать за-
головки слева или справа на верхней или нижней стороне рамки.
     Зоны прокрутки  обычно связаны с системой поддержки мыши,
но они также могут использоваться просто в качестве  индикато-
ров состояния,  как показано в примере. Зона прокрутки состоит
из четырех компонентов: фон зоны, который, будучи выбран с по-
мощью мыши,  обеспечивает просмотр окна в соответствии с пози-
цией мыши;  символ слайдера, который накладывается на одну по-
зицию  фона,  чтобы  отмечать текущее относительное положение;
стрелка убывания текущей позиции,  которая,  будучи выбрана  с
помощью   мыши,  производит  заданное  пользователем  действие
"уменьшения"; и стрелка возрастания текущей позиции. Символы и
видеоатрибуты,  связанные  с  каждым из этих элементов,  можно
корректировать.
     Каждая рамка может иметь до четырех зон прокрутки, по од-
ной на каждую сторону. Процедура AddScrollBar описывает каждую
сторону рамки:  параметр frRR обозначает правую сторону; пара-
метры frLL, frTT и frBB - остальные стороны.
     Каждая зона  прокрутки  связана  с  диапазоном  пользова-
тельских величин.  Например, верх зоны прокрутки может обозна-
чать  строку  1  текстового  файла,  а низ зоны - строку 1000,
последнюю в файле.  Когда текущей строкой текстового файла яв-
ляется строка 1, тогда символ слайдера будет расположен навер-
ху зоны прокрутки.  По мере возрастания номера текущей тексто-
вой  строки слайдер будет пропорционально перемещаться по зоне
прокрутки вниз,  пока не достигнет ее низа на строке 1000. Два
следующих  параметра процедуры AddScrollBar описывают диапазон
пользовательских значений,  который соответствует полному диа-
пазону  зоны  прокрутки.  Эти  параметры  принадлежат  к  типу
LongInt и,  следовательно,  предусматривают  любой  дискретный
числовой тип для пользовательского диапазона.
     ColorSet - это последний параметр процедуры AddScrollBar.
Процедура  AddScrollBar  выбирает из него и присваивает нужные
цвета фону зоны,  символу слайдера и стрелкам убывания и  воз-
растания.
     Процедура AddScrollBar внутренне использует пятый  компо-
нент рамки - активные области.  Каждая активная область описы-
вает невидимый прямоугольный участок экрана.  Каждой  активной
области соответствует уникальный цифровой код. Методы позволя-
ют классифицировать заданную экранную координату (обычно пози-
ции  мыши)  по отношению к активным областям и возвращают уни-
кальный код,  если координата попадает в активную область. Ак-
тивные области управляются в связном списке, поэтому количест-
во их в каждой рамке неограничено. К каждой зоне прокрутки ав-
томатически  прибавляются  три  активных области:  по одной на
стрелки убывания и возрастания и третья - для фоновой области.
В  этом  примере преимущества активных областей не использова-
лись.
     Пример программы изображает окно, записывает в него неко-
торый текст,  а затем работает с клавиатурой до тех пор,  пока
не  будет нажата клавиша <Esc>.  Наиболее важным из сказанного
выше является то,  что рамка изображается  автоматически.  Как
только  рамка будет дополнена описанными возможностями,  можно
больше ни о чем не беспокоиться.  Обращение к рамке будет  те-
перь   происходить   только   посредством   вызова   процедуры
DrawSlider.  В данном примере зона прокрутки обновлена с  тем,
чтобы  обозначить  новую позицию пользователя,  содержащуюся в
переменной SliderPos.
     Пример заканчивается обращением к деструктору Done объек-
та Win. Деструктор Done не только освобождает собственно окно,
а также содержащиеся в нем рамки.  После его вызова освобожда-
ются связные списки заголовков, теней, активных областей и зон
прокрутки.
     Далее подробно описываются некоторые аспекты рамок.


                      УСЛОВНЫЕ ОПИСАНИЯ

     Модуль OPFRAME  представляет  собой  программу управления
рамками,  обладающую  многочисленными  возможностями.  Высокая
гибкость  достигается за счет использования значительного объ-
ема памяти,  отводимого под объектный код (около 20000 байт на
весь  модуль OPFRAME).  Интеллектуальный редактор связей Turbo
Pascal может удалять из определенной программы  большую  часть
неиспользуемого  кода,  но  не весь код,  особенно при наличии
виртуальных методов.
     Контроль объема  кода (и в меньшей степени объема данных)
в системе Object Professional осуществляется с помощью  услов-
ных описаний,  которые управляются посредством исходного файла
OPDEFINE.INC. Некоторые из этих описаний применяются для моду-
ля OPFRAME и тех программных модулей, которые зависят от моду-
ля OPFRAME.  Можно заблокировать столько описаний, сколько по-
надобится, сообразно с требованиями программы пользователя. По
соглашению описания блокируются  посредством  помещения  точки
между левой фигурной скобкой и знаком доллара, например

     {.$DEFINE UseScrollBars}

     Следующие описания влияют на модуль OPFRAME:

     {$DEFINE UseMouse}
     {$DEFINE UseScrollBars}
     {$DEFINE UseSpots}
     {$SDEFINE UseShadows}
     {$DEFINE UseAdjustableWindows}

     Все они  активны по умолчанию.  Когда блокируется одно из
них, то из исходного кода исключаются определенные методы. Эти
описания  также влияют и на другие программные модули,  помимо
OPFRAME, особенно на модуль OPWINDOW.
     Не все возможные сочетания этих описаний имеют смысл, по-
этому нельзя ожидать от программы логического поведения,  если
выбрано необычное сочетание опций.  Обычно,  если не использу-
ется опция UseMouse,  то не используются и опции UseScrollBars
или   UseHotSpots.  Аналогично,  если  не  используется  опция
UseScrollBars,  то не используется и опция UseHotSpots.  Опция
UseShadows    не    зависит    от   других   описаний.   Опция
UseAdjustableWindows не зависит от остальных описаний, но наи-
более часто используется при наличии мыши.
     Далее методы и структуры данных,  чье  существование  за-
висит  от  конкретного описания,  предваряются записью {$IFDEF
TheDefine}.
     Блокирование всех этих описаний может уменьшить объем ко-
да прикладной программы,  использующей объекты окон, более чем
на  17  Кбайт (учитывая совокупное влияние на модули OPFRAME и
OPWINDOW).  С точки зрения окончательного объема кода тени за-
нимают приблизительно 2 Кбайта;  мышь, зоны прокрутки и актив-
ные зоны (вместе) занимают 8 Кбайт, а обновляемые окна стоят 7
Кбайт.
     Запись объекта Frame в абстрактный последовательный  файл
зависит  от того,  какие условные описания являются активными.
Когда абстрактный последовательный файл был записан с  исполь-
зованием какого-либо набора описаний, то он должен считываться
с использованием того же самого набора.

                 ИСПОЛЬЗОВАНИЕ ЗАГОЛОВКОВ ОКНА

     Наиболее часто заголовок окна используется для  образова-
ния заглавной строки в центре верхней стороны рамки окна.  Это
делается без труда с помощью модуля OPFRAME. Однако существует
много других способов использования заголовков.  Ниже описыва-
ются некоторые из них.
     Как уже упоминалось, объект Frame управляет заголовками с
использованием связного  списка  объекта  HeaderNodes.  Каждый
объект  HeaderNode  хранит  указатель на фактическую текстовую
строку,  а  также  на  цветной  и  монохромный  видеоатрибуты,
используемые  для  изображения заголовка.  Четыре поля данных,
содержащиеся в объекте HeaderNNode,  полностью описывают поло-
жение заголовка относительно рамки:

     heDX      : Integer;       {Координаты  заголовка отно-
                                 сительно рамки}
     heDY      : Integer;
     heType    : HeaderPosType; {Тип заголовка, использу-
                                 ющийся при изменении
                                 размеров}
     hePosn    : FrameCharType; {Часть рамки, к которой
                                 относится заголовок}

     HeaderPosType принадлежит к перечислимому  типу,  который
описывает различные категории расположения заголовка:

     HeaderPosType =  (heCustom,  heSpan,  heTL,  heTC,  heTR,
                       heBL, heBC, heBR);

     Следует описать опции размещения заголовка,  поскольку от
них зависит гибкость его использования. Наиболее часто исполь-
зуемыми опциями являются heTL..heBR.  Когда заголовок добавля-
ется с помощью процедур AddHeader или AddHeaderColor,  то объ-
ект HeaderNode инициализируется с помощью одного из таких зна-
чений  типа  HeaderPosType.  Они описывают заголовки,  которые
располагаются на стандартных позициях внутри рамки:  с  левого
края верхней стороны, в центре верхней стороны, с правого края
верхней стороны рамки и те же позиции для нижней стороны  рам-
ки.  Если  размеры  рамки будут изменяться (обычно посредством
вызова процедуры ResizeWindow),  программа  управления  рамкой
точно  установит координаты заголовка,  так что заголовок окна
останется на той же относительной позиции.
     Опция heCustom обеспечивает высокую гибкость при располо-
жении строки заголовка.  Обращение к опции heCustom происходит
с  помощью процедуры AddCustomHeader объекта Frame.  Остальная
информация,  описывающая положение строки,  хранится  в  полях
heDX, heDY и hePosn. Поле hePosn задает угол рамки, к которому
относится заголовок.  Оно может принимать значения frTL (верх-
ний левый),  frTR (верхний правый), frBL (нижний левый) и frBR
(нижний правый), которые задают четыре угла рамки. Поля heDX и
heDY  задают расстояния в столбцах и строках,  соответственно,
от заданного угла до начала строки заголовка.
     Из сказанного выше следует, что существует четыре различ-
ных способа задания любой позиции внутри рамки,  в зависимости
от  того,  какой  угол  из поля hePosn используется в качестве
основного.  Выбор угла оказывается важным при изменении разме-
ров  окна,  так как расстояние от заголовка до выбранного угла
остается неизменным.  Предположим, например, что нужен заголо-
вок, который выглядел бы так:

┌───── Colors ─────┐
│                  │
└──────────────────┘

и при изменении размеров окна,  нужно, чтобы строка Colors пе-
ремещалась вместе с верхним правым углом окна.  Для достижения
поставленной  цели  необходимо,  чтобы значения,  записанные в
объекте HeaderNode, были hePosn = frTR ,heDX = -9 и heDY = 0.
     Размещение заказного  заголовка  внутри фактической окан-
товки рамки ничем не ограничивается. Например, можно поместить
строку заголовков внутри окна.  Поскольку рамка окна изобража-
ется после того, как его содержимое очищено или восстановлено,
такие заголовки останутся видимыми до тех пор, пока код, кото-
рый записывает в окно, не перепишет их.
     Опция heSpan предоставляет особенно полезную способность,
называющуюся разделяющим заголовком (разделителем).  Такой за-
головок простирается от одного края рамки до другого, сливаясь
с окантовкой рамки с каждого края. Такие заголовки применяются
для  разделения меню или входных экранов на более мелкие рабо-
чие секции или для разделения заголовков столбцов таблиц. Ког-
да вызывается процедура AddSpanHeader объекта Frame,  то зада-
ется первый символ, заполняющий символ и последний символ раз-
деляющего заголовка. Первый и последний символы выбираются та-
ким образом, чтобы обеспечить плавное слияние рамки и разделя-
ющего заголовка.  Разделитель может быть как вертикальным, так
и горизонтальным;  это определяется выбором стороны рамки, ко-
торому  параллелен  разделитель  - frLL (левая сторона),  frRR
(правая сторона),  frTT (верхняя сторона), frBB (нижняя сторо-
на).  Это значение хранится в поле hePosn. Сочетание стороны и
расстояния смещения определяет точное положение разделителя  и
его поведение при изменении размеров окна.
     Любой из методов Add, применяющихся для заголовков, может
отказать,  превысив динамически распределяемую область памяти.
Этого можно  избежать,  проверяя  ошибки  при  помощи  функции
GetLastError объекта Frame.
     До сих  пор  заголовки  рассматривались  как  статический
текст; то есть, что-то добавлялось в процессе создания рамки и
она более не изменялась.  Помимо этого имеется возможность из-
менять   заголовки   в   процессе   работы.   Система   Object
Professional предусматривает это в различных окнах более высо-
кого уровня:  приглашение "Up/Down for More" в списке указаний
или заголовок pathname/wildcard в окне директория, например.
     Для обращения к существующему заголовку используется бай-
товая переменная,  называемая индексом заголовка. Он представ-
ляет собой просто последовательную позицию заголовка в связном
списке заголовков,  начиная с нуля.  Можно вычислить  его  са-
мостоятельно  или использовать функцию GetLastHeaderIndex объ-
екта Frame,  чтобы возвратить индекс  последнего  добавленного
заголовка.  Затем с помощью этого индекса можно вызвать проце-
дуры ChangeHeaderString или ChangeHeaderAttr объекта Frame или
процедуру ChangeHeader объекта RawWindow для того, чтобы моди-
фицировать текст заголовка или атрибуты и дополнительно  обно-
вить экран.  Все эти действия выполняются автоматически,  если
используются объекты PickList, DirList, PagedHelpWindow и дру-
гие.  Об  этом  следует  знать  при создании специальных типов
окон.
     Можно также  временно  блокировать  заданные  заголовки с
тем,  чтобы они не изображались вместе с остальными. Подробная
информация об этом дана в описании процедуры DisableHeader.


                     ИСПОЛЬЗОВАНИЕ ТЕНЕЙ

     Подобно заголовкам, тени увеличивают степень гибкости при
создании  рамки.  Тени рамки хранятся в связном списке объекта
ShadowNodes. Поскольку можно добавлять любое количество теней,
окна  могут иметь тени с одной стороны,  с обеих сторон или со
всех сторон.
     Наиболее удобным  методом для описания тени является про-
цедура AddShadow объекта Frame. Эта процедура позволяет задать
тени,  окружающие  нижнюю  и правую сторону или нижнюю и левую
сторону рамки. Тень может изображаться одним из двух способов:
посредством  использования  параметра  shSeeThru или параметра
shOverWrite  (которые   принадлежат   к   перечислимому   типу
ShadowDrawType).
     При задании   параметра   shSeeThru   тени   изображаются
посредством  простого  изменения  видеоатрибута затеняемой об-
ласти.  При тщательном выборе атрибутов через затенение  можно
будет  видеть основной текст.  Вертикальный участок такой тени
имеет два столбца в ширину,  а горизонтальный участок занимает
одну строку.  Атрибуты,  использующиеся для затенения, берутся
из полей frShadowColor и frShadowMono объекта  Frame,  которые
сами инициализируются из полей ShadowColor и ShadowMono объек-
та ColorSet при инициализации объекта Frame.
     Тень shOverWrite  изображается  посредством записи нового
символа и атрибута в затеняемый участок. Типизованные констан-
ты  DefShadowCharH и DefShadowCharV используются для инициали-
зации горизонтальных и вертикальных символов тени каждого объ-
екта ShadowNode при вызове процедуры AddShadow.  В этом случае
ширина вертикального участка тени составляет один столбец.
     Процедура AddShadowColor   работает   подобно   процедуре
AddShadow, но разрешает еще задавать нестандартный набор виде-
оатрибутов.
     Процедура AddCustomShadow является наиболее примитивной и
наиболее гибкой. С ее помощью за один вызов можно задать толь-
ко один прямоугольный участок тени.  Для того,  чтобы получить
тень, подобную созданной с помощью процедуры AddShadow, потре-
буется дважды вызывать процедуру AddCustomShadow.  Этот  метод
используется для задания теней на нестандартных сторонах рамки
или при нестандартных ширине и высоте рамки.
     Любой из  методов  Add для создания теней может отказать,
выйдя за пределы динамически  распределяемой  области  памяти.
Можно  избежать  этого,  проверяя  ошибки  с  помощью  функции
GetLastError объекта Frame.
     Заслуживает упоминания  и  еще  один аспект использования
теней.  Модуль OPFRAME содержит алгоритм для усечения теней на
тот случай,  если они выходят за пределы заданного участка эк-
рана. Таким образом, тени не ограничивают возможностей переме-
щения окна или изменения его размеров.



        ИСПОЛЬЗОВАНИЕ ЗОН ПРОКРУТКИ И АКТИВНЫХ ОБЛАСТЕЙ

     Эти объекты являются наиболее динамичными среди объектов,
имеющих отношение к рамке.  Всякий раз при изменении "текущего
положения"  внутри  соответствующего окна должно обновляться и
изображение зоны прокрутки на экране  дисплея.  При  попадании
курсора  мыши  в  зону  прокрутки  её  положение  должно  быть
представлено в величинах пользовательского диапазона,  связан-
ного с зоной прокрутки.  При попадании курсора мыши в активную
область может быть указано на другое действие.
     В основном эти объекты используются в тех случаях,  когда
система поддержки работы мыши  разработана  внутри  прикладной
программы.  Иногда  может оказаться полезным использование зон
прокрутки  в  качестве   индикаторов   состояния,   даже   при
отсутствии мыши.  Там,  где это необходимо,  система поддержки
работы зоны прокрутки уже встроена в объекты окна более  высо-
кого  уровня  системы  Objekt Professional.  Например,  объект
PickList автоматически поддерживает просмотр через зону  прок-
рутки  всякий раз,  как обнаруживает,  что зона прокрутки была
включена в его рамку.
     Процедура AdScrollBar является простейшим способом созда-
ния зоны прокрутки. Указывается, какую из четырех сторон рамки
использовать для зоны прокрутки, а процедура вычисляет для нее
соответствующие координаты экрана.  Стрелки направления  прок-
рутки  расположены  на  краях стороны рамки (без записи в сами
углы рамки),  а пространство между ними заполняется фоном рам-
ки.  Символы  стрелок  направления  прокрутки выбраны из соот-
ветствующих элементов массива типизованных констант  DefArrows
(в  зависимости  от того,  является ли зона горизонтальной или
вертикальной).  Символы для слайдера зоны прокрутки и ее  фона
выбраны из типизованных констант DefSliderChar и DefBarChar.
     Процедура AddCustomScrollBar  работает  несколько   более
гибко.  Требуемый  участок  стороны  рамки для размещения зоны
прокрутки также, как и символы, образующие зону и слайдер, мо-
гут быть точно определены пользователем.
     Независимо от используемого метода  Add,  зона  прокрутки
должна  состоять  по крайней мере из трех символов - по одному
символу для каждой стрелки направления прокрутки и один символ
для слайдера.  Любое меньшее пространство, выделенное для зоны
прокрутки,  вызывает отказ метода Add. Объект ScrollBar модуля
OPFRAME  всегда  требует присутствия стрелок направления прок-
рутки; они могут быть сделаны невидимыми (путем изображения их
теми же символами,  что и стрелки основной рамки) и могут быть
проигнорированы при выборе их мышью, но они всегда присутству-
ют.
     Любой из методов Add для зон прокрутки может отказать при
выходе  за  пределы динамически распределяемой области памяти.
Убедитесь в отсутствии ошибок,  используя функцию GetLastError
объекта Frame.
     Очень важно понять как зона прокрутки преобразует  содер-
жимое рамки (или окна).  Положение слайдера соответствует "те-
кущей позиции" внутри окна.  Значение текущей позиции меняется
в  зависимости  от вида окна.  Если,  например,  окно содержит
текстовый редактор, то текущая позиция, связанная с вертикаль-
ной зоной прокрутки,  может быть номером строки,  на которой в
данный момент находится курсор редактора.  Для  горизонтальной
зоны прокрутки текущая позиция может быть количеством колонок,
уже прокрученных редактором по  горизонтали,  либо,  возможно,
номером колонки,  на которой находится курсор редактора. Поло-
жение символа слайдера предусмотрено для того,  чтобы  обеспе-
чить быструю оценку относительного состояния окна.
     Объект ScrollBar линейно преобразует пользовательский ди-
апазон в видимый диапазон, используя следующее соотношение:

        CurPos-MinPos   CurUser-MinUser
        ------------- = ---------------
        MaxPos-MinPos   MaxUser-MinUser

     MinPos и MaxPos соответствуют абсолютным экранным коорди-
натам зоны прокрутки (строка для вертикальной зоны или колонка
- для горизонтальной);  CurPos соответствует положению слайде-
ра;  MinUser,  MaxUser и CurUser -  соответствующие  пользова-
тельские величины.
     Минимальная и максимальная величины определяются при  до-
бавлении  зоны прокрутки и могут быть при необходимости обнов-
лены.  Текущая пользовательская величина будет многократно об-
новляться,  возможно,  после каждой команды, введенной в окно.
Пример,  приведенный в  начале  этого  раздела,  демонстрирует
использование объекта ScrollBar.
     Активные области являются  специально  разработанной  ма-
ленькой хитростью,  так как они невидимы. На экране не появля-
ется никакой индикации активной  области,  поэтому  она  может
быть обнаружена только перемещением курсора мыши и пробным вы-
бором в  различных  точках.  Безусловно,  правильно  созданная
прикладная  программа  предусмотрит  наличие  видимого текста,
сопровождающего каждую активную область,  но принятие  решения
на  выбор текста и совмещение его с активной областью является
правом пользователя.
     Каждой активной  области  соответствует  однобайтовый код
распознавания.  Когда ваша прикладная программа  обнаруживает,
что мышь в настоящее время находится в активной области,  этот
код определит,  какое действие необходимо предпринять програм-
ме.  Определенные коды имеют предварительно установленное зна-
чение, а остальные находятся в распоряжении пользователя. Ниже
приведен список этих кодов:

     hsNone             = 0; {Отсутствие активной области}
     hsDecV             = 1; {Указатель убывания текущей
                              позиции в вертикальной зоне
                              прокрутки}
     hsIncV             = 2; {Указатель возрастания текущей
                              позици в вертикальной зоне
                              прокрутки}
     hsDecH             = 3; {Указатель убывания текущей
                              позиции в горизонтальной зоне
                              прокрутки}
     hsIncH             = 4; {Указатель возрастания текущей
                              позиции в горизонтальной зоне
                              прокрутки}
     hsBar              = 5; {Участок слайдера в зоне
                              прокрутки}
     hsSpot             = 6; {Активная область размером в один
                              символ}
     hsRegion0          = 7; {Область, определяемая
                              пользователем}
     ...
     hsRegion9         = 16;
     ...
     hsReservedForTP =  255; {Код, предназначенный для
                              внутреннего использования}

     Коды 1-5 всегда связаны  с  зоной  прокрутки.  Коды  7-16
предназначены для активных областей,  определяемых пользовате-
лем.  Коды 17-254 - для произвольного использования. Код 255 -
резервный.
     Существует четыре различных способа  добавления  активных
областей к рамке.  Эти методы различаются по гибкости и по по-
ведению полученных областей при изменении размеров рамки.
     Процедура AddHotSpot  добавляет активную область размером
в один символ к одному из четырех углов рамки.  Эта  процедура
удобна тем, что она также добавляет односимвольный заголовок к
тому же углу,  делая, таким образом, активную область видимой.
Такие односимвольные области часто используются для того, что-
бы показать,  что связанное с ней окно должно быть изменено  в
размерах  или  закрыто.  Кодом возврата такой активной области
всегда является константа hsSpot.  Кроме того,  код угла рамки
вычисляется процедурой EvaluateMousePos объекта RawWindow.
     Процедура AddHotBar добавляет активную область, покрываю-
щую всю сторону рамки.  Эта область невидима до тех пор,  пока
не будут обеспечены связанные с ней дополнительные  заголовки.
Если размеры рамки были изменены, то область увеличивается или
сокращается вместе с ней.  При вызове процедуры AddHotBar  код
области определяется пользователем.
     Процедура AddHotHeader определяет активную область,  сов-
падающую со стандартным заголовком окна. В сочетании с опреде-
ленной длиной, активная область может быть расположена в цент-
ре,  слева или справа на верхней или нижней стороне рамки. Де-
монстрационная программа DESKPOP имеет такую  область,  совме-
щенную с верхним названием каждого окна,  что использовано для
перемещения окна по экрану.
     Процедура AddHotRegion является наиболее общей. Она опре-
деляет активную область произвольных прямоугольных размеров на
произвольном  расстоянии  от любого угла рамки.  При изменении
размеров  рамки  эти  величины  остаются  фиксированными.  Де-
монстрационная  программа  DESKPOP использует эти активные об-
ласти для активатора  локального  меню,  расположенного  возле
верхнего левого угла каждого окна.
     Любая из процедур Add для активных областей  может  отка-
зать  при выходе за пределы динамически распределяемой области
памяти.  Убедитесь  в  отсутствии  ошибок,  используя  функцию
GetLastError объекта Frame.
     Подобно заголовку,  каждая активная область  имеет  соот-
ветствующее значение индекса. Используя этот индекс, можно об-
ратиться к существующей активной области и изменить ее размеры
или положение.

                           КОНСТАНТЫ

     hsNone           = 0; {Отсутствие активной области}
     hsDecV           = 1; {Стрелка, направленная вниз, в
                            вертикальной зоне прокрутки}
     hsIncV           = 2; {Стрелка, направленная вверх, в
                            вертикальной зоне прокрутки}
     hsDecH           = 3; {Стрелка, направленная вправо, в
                            горизонтальной зоне прокрутки}
     hsIncH           = 4; {Стрелка, направленная влево, в
                            горизонтальной зоне прокрутки}
     hsBar            = 5; {Участок слайдера в зоне
                                           прокрутки}
     hsSpot           = 6; {Активная область размером в
                                         один символ}
     hsRegion0        = 7; {Область, определяемая
                                       пользователем}
     ...
     hsRegion9        = 16;
     ...
     hsReservedForTP  = 255; {Код, предназначенный для
                              внутреннего использования}

     Эти величины  используются для распознавания активных об-
ластей.  Такие величины определяются при  добавлении  активной
области  и  возвращаются функцией PosResults объекта RawWindow
после вызова процедур EvaluateMousePos или EvaluatePos объекта
RawWindow.

     NoFrameChar      = #255;

     Использование этой константы в FrameArray означает, что в
эту позицию рамки не будет сделано никаких записей.. Константа
NoWindowFrame  (описанная  ниже)  является   полным   массивом
констант NoFrameChar.

     SeeThruChar      = #255;

     Символ обозначает прозрачное затенение,  когда он переда-
ется как параметр в процедуру AddCustomShadow.

     DefWindowFrame   : FrameArray = '╒╘╕╛══││';
     DblWindowFrame   : FrameArray = '╔╚╗╝══║║';
     SglWindowFrame   : FrameArray = '┌└┐┘──││';
     NoWindowFrame    : FrameArray = NoFrameChar+NoFrameChar+
                                     NoFrameChar+NoFrameChar+
                                     NoFrameChar+NoFrameChar+
                                     NoFrameChar+NoFrameChar;

     Используются для задания общих типов окантовки для проце-
дуры SetFrameType.  Константа DefWindowFrame является парамет-
ром,  используемым по умолчанию, при создании окантовки рамки.
Если должно быть создано много окон одинакового вида, то может
быть  удобным  перед  созданием   окон   присвоить   константе
DefWindowFrame новое значение.

     {$IFDEF UseScrollBars}
     DefArrows      : ArrowArray = #27#26#24#25; {Стрелки
                                     влево-вправо-вверх-вниз}
     TriangleArrows : ArrowArray = #17#16#30#31; {Треугольные
                             стрелки влево-вправо-вверх-вниз}
     {$ENDIF}

     Используются для определения внешнего вида  стрелок  нап-
равления  в  зонах  прокрутки.  Константа  DefArrows  содержит
стрелки, используемые по умолчанию, при создании зон прокрутки
процедурами  AddScrollBar  или  AddCustomScrollBar.  Константа
TriangleArrows является дополнительной группой  стрелок,  пре-
дусмотренной для удобства пользователя.

     {$IFDEF UseScrollBars}
     DefSliderChar   : Char = #178; {Символ для слайдера}
     DefBarChar      : Char = #176; {Символ для зоны прокрутки}
     {$ENDIF}

     Используются для определения внешнего вида слайдера и фо-
на  зоны прокрутки.  Эти значения принимаются по умолчанию при
создании   зон   прокрутки    с    использованием    процедуры
AddScrollBar.

     {$IFDEF UseShadows}
     DefShadowCharH : Char = #223; {Символ для горизонтальной
                                    тени}
     DefShadowCharV : Char = #219; {Символ для вертикальной
                                    тени}
     {$ENDIF}

     Используются для определения внешнего  вида  непрозрачных
(shOverWrite) теней. Эти значения принимаются по умолчанию при
создании  теней  посредством  вызова  процедур   AddShadow   и
AddShadowColor.

     frInsideActive = 8;
     frInsideFrame  = 9;
     frOutsideFrame = 10;

     Эти константы продолжают последовательность байтов, нача-
тую в модуле OPCRT.  Все константы описывают положение  экрана
относительно  рамки конкретного окна.  Величины в модуле OPCRT
описывали саму рамку - ее стороны и углы, а эти дополнительные
константы  описывают положения внутри и за пределами рамки,  а
также связанного с ней окна.  Для того, чтобы уяснить различие
между  константами frInsideActive и frInsideFrame,  необходимо
рассмотреть совместную работу рамки и окна.  Рамка и  окно  не
обязательно должны соприкасаться друг с другом. Координаты ок-
на определяют область активной работы,  например, где происхо-
дит прокрутка редактора или списка указаний.  В некоторых слу-
чаях рамка будет расширена,  для того, чтобы образовать допол-
нительный участок экрана, окружающий активное окно, что бывает
полезным при создании эффектов типа  непрокручивающихся  заго-
ловков колонок над списками указаний.Для этого дополнительного
участка  используется  константа  frInsideFrame,  а  константа
frInsideActive относится собственно к активному окну.
     Эти дополнительные   константы   возвращаются    функцией
PosResults объекта RawWindow.


                              ТИПЫ

     {$IFDEF UseScrollBars}
     ArrowDirections = (arrowLeft, arrowRight, arrowUp,
                                                 arrowDown);
     ArrowArray      = array[ArrowDirections] of Char;
     {$ENDIF}

     Структура данных,  описывающая стрелки,  применяемые  при
построении зон прокрутки.

     AbstractFramePtr = ^AbstractFrame;
     AbstractFrame    =
       object(Root)
         ...
     end;

     Абстрактный тип данных, описывающий рамку окна. Этот объ-
ект сохраняет координаты рамки (используя Words для того, что-
бы  не препятствовать реализации графического режима работы) и
определяет некоторые базовые методы  доступа  к  рамкам.  Этот
объект описан прежде всего для программистов,  желающих произ-
вести фундаментальные  изменения  и  расширения  системы  окон
Object Professional. Некоторые методы этого объекта рассмотре-
ны ниже, так как они не отвергаются более специфичной реализа-
цией объекта Frame.

     FramePosType     = frTL..frOutsideFrame;
     FrameCornerType  = frTL..frBR;
     FrameEdgeType    = frTT..frRR;

     Типы, определяющие различные относящиеся к рамке позиции.
Тип FramePosType охватывает все возможные позиции (см.  описа-
ние   константы   frInsideActive,   приведенное   выше).   Тип
FrameCornerType включает  только  четыре  угла  рамки,  а  тип
FrameEdgeType - только четыре стороны рамки.  Эти типы исполь-
зуются прежде всего  для  уточнения  параметров,  передаваемых
различным методам объекта Frame.

     HeaderPosType =  (heCustom,  heSpan,  heTL,  heTC,  heTR,
                                           heBL,  heBC,  heBR);

     Категории заголовков окна. Для дальнейшего обсуждения см.
описанный выше раздел "Использование заголовков окна".

     HeaderPtr = ^HeaderNode;
     HeaderNode =
       object(DoubleListNode)
         ...
       end;

     Тип данных,  описывающий  заголовок окна.  Связный список
этих узлов содержится внутри объекта Frame.  Вероятно не будет
необходимости  непосредственно  использовать  какие-либо  поля
данных или методы объекта HeaderNode,  поскольку объект  Frame
сам управляет ими.

     {$IFDEF UseShadows}
     ShadowPtr = ^ShadowNode;
     ShadowNode =
       object(DoubleListNode)
         ...
       end;
     {$ENDIF}

     Тип данных,  описывающий  тени окна.  Связный список этих
узлов  содержится  внутри   объекта   Frame.   Каждый   объект
ShadowNode  описывает  отдельный прямоугольный участок экрана;
следовательно, для стандартной двухсторонней тени в списке бу-
дет два узла.  Вероятно не будет необходимости непосредственно
использовать  какие-либо  поля  данных  или   методы   объекта
ShadowNode, поскольку объект Frame сам управляет ими.

     {$IFDEF UseShadows}
     ShadowDrawType = (shSeeThru, shOverWrite, shNone);
     ShadowPosType  = (shBR, shBL);
     {$ENDIF}

     Перечислимые типы, описывающие внешний вид теней на экра-
не.  Прозрачное  затенение  изображается посредством изменения
видеоатрибутов основного экрана,  но оставляя символы неизмен-
ными.  Непрозрачная тень заменяет все находящиеся под ней сим-
волы и видеоатрибуты на определенные  данным  типом  значения.
Константа  shNone возвращается определенными методами объектов
Frame и RawWindow в случаях, когда тени не используются.
     Тип ShadowPosType описывает две стандартных составных те-
ни,   имеющиеся   в   распоряжении   процедур   AddShadow    и
AddShadowColor.  Тип ShadowPosType определяет участки теней на
нижней и правой сторонах рамки или на нижней и левой  сторонах
соответственно.  Другие  комбинации  участков теней могут быть
созданы с помощью процедуры AddCustomShadow.

     {$IFDEF UseHotSpots}
     HotSpotPtr = ^HotNode;
     HotNode =
       object(DoubleListNode)
         ...
       end;
     {$ENDIF}

     Тип данных,  описывающий активную область. Связный список
этих узлов содержится внутри объекта Frame. Вероятно, не будет
необходимости  непосредственно  использовать  какие-либо  поля
данных или методы объекта HotNode,  поскольку объект Frame сам
управляет ими.  За более подробной информацией  обращайтесь  к
описанному  выше разделу "Использование зон прокрутки и актив-
ных областей".

     {$IFDEF UseScrollBars}
     ScrollBarPtr = ^ScrollBar;
     ScrollBar =
       object(Root)
         ...
       end;
     {$ENDIF}

     Тип данных, описывающий зону прокрутки. Массив из четырех
указателей  - по одному на каждую сторону рамки - для этих уз-
лов содержится внутри объекта Frame. Вероятно не будет необхо-
димости  непосредственно  использовать  какие-либо поля данных
или методы объекта ScrollBar,  поскольку объект Frame сам  уп-
равляет  ими.  За  более  подробной  информацией обращайтесь к
описанному выше разделу "Использование зон прокрутки и  актив-
ных областей".

     FramePtr = ^Frame;
     Frame =
       object(AbstractFrame)
         ...
       end;

     Основной тип объекта в модуле OPFRAME. Этот объект содер-
жит поля данных, описывающих всю рамку: координаты, видеоатри-
буты,  символы окантовки,  заголовки, тени, активные области и
зоны прокрутки.  Методы данного объекта  будут  широко  приме-
няться всякий раз,  как будут использоваться окна.  Все методы
объекта Frame описаны ниже.
     Следует отметить,  что  определенные поля данных и методы
объекта Frame "исчезают"  при  отсутствии  условных  описаний,
рассмотренных во введении к данному разделу. Очень важно, осо-
бенно при использовании  абстрактных  последовательных  файлов
или библиотек,  выбрать набор этих условных описаний и придер-
живаться их в дальнейшем.


     AddCustomHeader
     ---------------
     Объявление
      procedure AddCustomHeader(S : string;
                                Posn : FrameCornerType;
                                DX, DY : Integer;
                                AttrColor, AttrMono : Byte);

     Назначение
     Добавляет заказной заголовок.

     Описание
     Процедура AddCustomHeader  обеспечивает максимальную сте-
пень гибкости при размещении заголовка.  Параметр  S  является
строкой заголовка, которая будет отображаться на экране. Пара-
метр Posn определяет угол рамки,  относительно которого  зада-
ется  смещение  DX  и  DY.  Параметры DX и DY - это количество
столбцов и строк,  соответственно,  от данного угла  рамки  до
крайнего  левого символа строки заголовка.  (Следует отметить,
что параметры DX и DY могут быть при необходимости  нулем  или
отрицательными величинами). Параметры AttrColor и AttrMono яв-
ляются видеоатрибутами для использования в цветном и монохром-
ном режимах соответственно.
     Параметр Posn может принимать следующие  значения:  frTL,
frTR,  frBL и frBR. Если рамка, в которой находится заголовок,
перемещается или изменяются ее размеры,  то заголовок остается
фиксированным на определенном процедурой расстоянии от опреде-
ленного угла рамки.  При изображении заголовка с начальной ко-
ординатой X,  находящейся внутри границ рамки, заголовок будет
(при необходимости) усечен для того, чтобы он остался в преде-
лах  этих  границ.  Если  же начальная координата находится за
пределами рамки,  то он усекается только для того, чтобы избе-
жать  его выхода за пределы экрана.  Если начальная координата
попадет за пределы экрана,  то на экране не будет ничего отоб-
ражаться, даже если некоторая часть заголовка будет появляться
в других случаях.

     Примеры

     Win.wFrame.AddCustomHeader('Custom Header', frTL, 2, 0,
                                                 $02, $70);

     Добавляет заказной заголовок к основной рамке Win.  Поло-
жение заголовка будет вычислено относительно  верхнего  левого
угла (frTL) рамки, используя смещение в 2 столбца по оси X и в
0 строк по оси Y.  Таким образом,  заголовок будет  начинаться
двумя  символами  правее  верхнего  левого  угла рамки и будет
располагаться на ее верхней полосе.  Видеоатрибуты: зеленый на
черном фоне для цветных режимов, инверсное изображение для мо-
нохромного режима.

     Win.wFrame.AddCustomHeader('Custom Header', frBR, -20,
                                             -1, $02, $70);

     Добавляет заказной  заголовок  к  рамке  Win  левее на 20
столбцов и выше на 1 строку правого нижнего (frBR) угла рамки.

     См. также
     AddHeader                         AddSpanHeader


     AddCustomScrollBar
     ------------------
     Объявление
     {$IFDEF UseScrollBars}
     procedure AddCustomScrollBar(Posn : FrameEdgeType;
                                  MinUser, MaxUser : LongInt;
                                  DecOffset, IncOffset : Byte;
                                  SliChar, BarChar : Char;
                                  var Colors : ColorSet);

     Назначение
     Добавляет заказную зону прокрутки.

     Описание
     Процедура AddCustomScrollBar  обеспечивает   максимальную
степень гибкости при размещении зоны прокрутки.  Параметр Posn
- это сторона рамки,  на которой появится зона прокрутки. Каж-
дая сторона рамки может иметь только одну зону прокрутки.
     Параметры MinUser  и  MexUser  представляют  собой  соот-
ветствующие пользовательские величины на момент, когда слайдер
находится в предельных положениях зоны прокрутки. (Для получе-
ния  более  подробной информации о взаимосвязи между пользова-
тельскими величинами и величинами зоны прокрутки см.  введение
к данному разделу).  Во многих случаях пользовательский диапа-
зон динамично изменяется (например,  когда меняется количество
строк  в  текстовом  редакторе);  этот диапазон легко изменить
процедурой ChangeScrollBar.
     Параметр DecOffset  -  это количество символов от угла на
стороне рамки до указателя убывания  текущей  позиции  в  зоне
прокрутки.  Если  параметр DecOffset является 0,  то указатель
убывания появится в самом углу рамки; если он равен 1, то ука-
затель появится со смещением на один символ от угла рамки. Па-
раметр IncOffset обеспечивает аналогичную установку  указателя
возрастания  текущей  позиции.  Следует отметить,  что в обоих
случаях положительное значение смещения определяет  расстояние
от  угла  до указателя направления прокрутки.  По крайней мере
три символа должны остаться после того, как из всей длины сто-
роны  рамки будут вычтены параметры DecOffset и IncOffSet:  по
одному символу на каждый указатель направления и  один  символ
для слайдера. Если в наличии окажется меньшее пространство, то
процедура AddCustomScrollBar будет генерировать  сообщение  об
ошибке (epNonFatal+ecWinCoordsBad).
     Параметры SliChar и BarChar являются символами, изобража-
ющими слайдер и фон зоны прокрутки соответственно.  Если жела-
тельно иметь невидимую зону прокрутки (так,  как  это  было  в
случае  с  зонами прокрутки системы Turbo Professional),  наз-
начьте параметру BarChar тот же символ,  что  был  использован
для изображения окантовки рамки.
     Используемые символы указателей направления прокрутки ко-
пируются из типизованной константы DefArrows при вызове проце-
дуры AddCustomScrollBar.  Для использования указателей, отлич-
ных от принимаемых по умолчанию,  прежде всего нужно модифици-
ровать эту типизованную константу. Представленная ниже таблица
показывает соответствующий фрагмент массива (типа ArrowArray),
подлежащий модификации,  для вертикальных и горизонтальных зон
прокрутки.

                    Вертикальная зона    Горизонтальная зона

     Указатель         arrowUp              arrowLeft
     убывания

     Указатель         arrowDown            arrowRight
     возрастания

     Параметр Colors содержит атрибуты,  используемые для раз-
личных компонентов зоны прокрутки. Использованы следующие поля
ColorSet:

     Слайдер           SliderColor, SliderMono
     Зона прокрутки    ScrollBarColor, ScrollBarMono
     Указатели         HotSpotColor, HotSpotMono

     Помимо добавления  структур,  определенных для зоны прок-
рутки,  процедура AddCustomScrollBar добавляет к рамке три ак-
тивных области: по одной на каждый указатель направления прок-
рутки и одну для области слайдера. Эти активные области не так
давно начали использоваться для управления взаимодействием мы-
ши и зоны прокрутки.
     Если какая-либо  другая зона прокрутки была первоначально
добавлена к определенной стороне рамки,  то она  освобождается
перед добавлением новой зоны прокрутки. Если динамически расп-
ределяемой области памяти оказывается недостаточно,  то проце-
дура   AddCustomScrollBar   генерирует   сообщение  об  ошибке
(epFatal+ecOutOfMemory).

     Примеры

     Win.wFrame.AddCustomScrollBar(frRR, 0, 9, 1, 1, #7, #179,
                                   DefaultColorSet);

     Добавляет заказную  зону прокрутки к правой стороне окна,
используя заказные символы зоны прокрутки и слайдера. Указате-
ли  направления  прокрутки  расположены  со  смещением на одну
строку от верха и низа окна.

     DefArrows[arrowUp] := #30;
     DefArrows[arrowDown] := #31;
     Win.wFrame.AddCustomScrollBar(frRR, 0, 9, 1, 1, #7, #179,
                                   DefaultColorSet);

     Использует в  качестве  указателей  направления прокрутки
стрелки треугольной  формы  вместо  стрелок,  используемых  по
умолчанию.

     См. также
     AddScrollBar                      ChangeScrollBar


     AddCustomShadow
     ---------------
     Объявление
     {$IFDEF UseShadows}
     procedure AddCustomShadow(ShChar : Char;
                               Edge : FrameEdgeType;
                               DX, DY : Integer; W, H : Byte;
                               AttrColor, AttrMono : Byte);

     Назначение
     Добавление заказного  затененного прямоугольника.

     Описание
     Процедура AddCustomShadow обеспечивает максимальную  сте-
пень гибкости при создании теней. Вызывая эту процедуру вместо
процедуры AddShadow, можно создавать тени любого вида по жела-
нию пользователя.  Сложная тень составляется из одного или бо-
лее элементов тени,  где каждый элемент тени является  простым
прямоугольным    участком.   За   одно   обращение   процедура
AddCustomShadow добавляет один простой элемент тени.
     Параметр ShChar  определяет символ для заполнения прямоу-
гольного участка тени при его изображении на экране. Для проз-
рачного  затенения (когда затеняемые символы на изменяются,  а
меняются только их атрибуты) назначают  константу  SeeThruChar
(#255).  Параметр Edge - это сторона рамки, которой параллелен
прямоугольник тени.  Например, чтобы определить элемент тени с
правой стороны рамки,  назначают frRR. Параметры DX и DY опре-
деляют положение верхнего левого угла тени  относительно  угла
рамки, соответствующего параметру Edge. Использованы следующие
углы:

     Сторона       Угол
     frLL          frTL
     frRR          frTR
     frTT          frTL
     frBB          frBL

     Для стандартной тени шириной в один символ с правой  сто-
роны  рамки  параметр DX равен 1.  Параметр DY равен 1,  чтобы
расположить тень ступенькой относительно верхнего правого угла
рамки. Для стандартной тени с левой стороны рамки параметры DX
и DY равны, соответственно, -1 и 1.
     Параметры W  и H - это,  соответственно,  ширина и высота
прямоугольника тени.  Например, для вертикальной тени параметр
W обычно 1 или 2, а параметр H является высотой рамки.
     Параметры AttrColor и AttrMono являются  видеоатрибутами,
используемыми  для  изображения тени в цветном или монохромном
режимах.

     Пример

     Win.wFrame.AddCustomShadow(#178, frBB, 1, 1, Win.Width+2,
                                1, $02, $70);
     Win.wFrame.AddCustomShadow(#178, frRR, 1, 1, 1,
                                Win.Height+2, $02, $70);

     Добавляет участки  тени  внизу  и справа от окна (подобно
затенению shBR),  используя заполняющий символ фона. Для зада-
ния размеров участков тени используются функции Height и Width
из объекта RawWindow.

     См. также
     AddShadow



     AddHeader
     ---------
     Объявление
     procedure AddHeader(S : string; Posn : HeaderPosType);

     Назначение
     Добавляет стандартный заголовок.

     Описание
     Процедура AddHeader является  наиболее  удобным  способом
добавления заголовка к рамке. Параметр S - это строка, которая
будет отображена.  Объект Frame не позволяет каким-либо спосо-
бом  набрать  эту  строку с клавиатуры.  Эта строка может быть
позже изменена вызовом процедуры ChangeHeaderString.
     Параметр Posn  определяет  какое-либо  из шести возможных
положений заголовка:  heTL,  heTC,  heTR, heBL, heBC или heBR,
где первые три находятся на верхней стороне рамки, а последние
три - на нижней. Позиции заголовка heTL и heBL находятся в ле-
вой части рамки (по одной перед каждым углом), heTR и heBR - в
правой части рамки (по одной перед каждым углом);  heTC и heBC
находятся  в  центре  верхней или нижней стороны рамки,  соот-
ветственно.  Рамка автоматически поддерживает эти позиции  при
изменении ее размеров.
     Заголовок получает  стандартный  цвет,  определенный  при
создании рамки. Определение атрибута, отличного от принимаемо-
го по умолчанию, производится вызовом процедуры AddHeaderColor
вместо     AddHeader,    либо    позже    вызовом    процедуры
ChangeHeaderAttr.
     Процедура AddHeader может отказать с выдачей сообщения об
ошибке превышения памяти,  поскольку она сама выделяет динами-
ческую область памяти для узла связного списка и для строки.

     Пример

     Win.wFrame.AddHeader('Standard Header', heTC);

     Добавляет заголовок  к  рамке Win.  Заголовок будет нахо-
диться в центре верхней стороны рамки (heTC).

     Win.wFrame.AddHeader('Bottom Left', heBL);

     Добавляет заголовок в левую часть  нижней  стороны  рамки
Win.

     См. также
     AddCustomHeader


     AddHeaderColor
     --------------
     Объявление
     procedure AddHeaderColor(S : string;
                               0Posn : HeaderPosType;
                              AttrColor, AttrMono : Byte);

     Назначение
     Добавляет стандартный заголовок заказного цвета.

     Описание
     Работает подобно процедуре AddHeader,  но позволяет опре-
делять атрибуты,  отличные от принимаемых по умолчанию.  Пара-
метр AttrColor будет применяться, когда заголовок изображается
в цветном режиме;  параметр AttrMono - в монохромном режиме (2
или 7).

     Пример

     Win.wFrame.AddHeaderColor('Standard Header', heTC,
                               #02, #70);

     Добавляет заголовок  в  центр  верхней стороны рамки Win.
Цвет заголовка будет зеленым на черном фоне для цветных  мони-
торов и инверсным для монохромных мониторов.


     AddHotBar
     ---------
     Объявление
     {$IFDEF UseHotSpots}
     procedure AddHotBar(Posn : FrameEdgeType; Code : Byte);

     Назначение
     Добавляет активную область, полностью покрывающую сторону
рамки.

     Описание
     Параметр Posn  -  это  покрываемая  сторона рамки:  frLL,
frRR, frTT или frBB. Вертикальные активные области имеют шири-
ну  в  один столбец,  а горизонтальные - высоту в одну строку.
Полученная в результате активная область не включает углы рам-
ки, если, конечно, рамка не является неокантованной.
     При изменении размеров рамки положение активной области и
ее размер корректируются автоматически.
     Параметр Code  является  уникальной  байтовой  величиной,
используемой  для распознавания отдельной активной области для
данной рамки. Ей должно быть присвоено значение в диапазоне от
hsRegion0 до hsRegion254, включительно.

     Пример

     Win.wFrame.AddHotBar(frLL, hsRegion0);

     Добавляет вертикальную  активную  область к левой стороне
рамки окна с кодом пользователя hsRegion0.

     См. также
     AddHotSpot                        AddHotRegion


     AddHotHeader
     ------------
     Объявление
     {$IFDEF UseHotSpots}
     procedure AddHotHeader(hType : HeaderPosType;
                            Code : Byte;
                            Len : Byte);

     Назначение
     Добавляет активную область, совпадающую с заголовком.

     Описание
     Эта процедура полезна в случае,  когда  желательно  иметь
активную область,  полностью совпадающую с видимым заголовком.
Один общий пример: заголовок находится на верхней стороне рам-
ки и определяет файл внутри окна.  Выбор этого заголовка с по-
мощью мыши будет означать,  что будет производиться  установка
окна.  (Этот  метод  использован  в демонстрационной программе
DESKPOP,  которая имитирует Microsoft Windows  и  Presentation
Manager).  При изменении размеров рамки положение активной об-
ласти корректируется автоматически.
     Параметр hType  - это одно из стандартных положений заго-
ловка:  heTL,  heTC,  heTR, heBL, heBC или heBR. Для получения
более  подробной информации см.  описание процедуры AddHeader.
Параметр Len определяет длину строки заголовка, которому соот-
ветствует активная область.
     Параметр Code  является  уникальной  байтовой  величиной,
используемой  для распознавания отдельной активной области для
данной рамки. Ей должно быть присвоено значение в диапазоне от
hsRegion0 до hsRegion254, включительно.

     Пример
     
     Win.wFrame.AddHotHeader(heTC, hsRegion1,
                             Lenght(HeaderString));
     
     Делает верхний заголовок окна активной областью  с  кодом
пользователя hsRegion1. Ширина активной области заголовка рав-
на длине связанной с ней строки заголовка.

     См. также
     AddHotRegion


     AddHotRegion
     ------------
     Объявление
     {$IFDEF UseHotSpots}
     procedure AddHotRegion(Posn : FrameCharType; Code : Byte;
                            DX, DY : Integer;
                            Width, Height : Byte);

     Назначение
     Добавляет активную область фиксированных размеров в опре-
деленное относительно угла рамки место экрана.

     Описание
     Эта процедура предоставляет наиболее гибкий способ добав-
ления активной области.  Можно определить для активной области
любой  прямоугольник  фиксированных  размеров на фиксированном
расстоянии от определенного угла рамки.  Это соотношение оста-
ется в силе после изменения размеров рамки.
     Параметр Posn может быть любым углом или стороной  рамки.
Рекомендуется определять только углы рамки (frTL,  frTR, frBL,
frBR);  стороны рамки внутренне использованы в процедурах под-
держки других структур активных областей.
     Параметры DX и DY  являются  соответствующими  смещениями
верхнего  левого  угла  активной области от определенного угла
рамки. Следует отметить, что они могут быть положительными или
отрицательными.  Параметры  Width  и Heidht определяют размеры
области.
     Параметр Code  является  уникальной  байтовой  величиной,
используемой для распознавания отдельной активной области  для
данной рамки. Ей должно быть присвоено значение в диапазоне от
hsRegion0 до hsRegion254, включительно.

     Пример
     
     Win.wFrame.AddHotRegion(frTL, hsRegion2, 0, 0, 2, 2);
     
     Добавляет активную область размером два на два в  верхний
левый угол рамки. Область имеет код пользователя hsRegion2.

     См. также
     AddHotBar                         AddHotHeader


     AddHotSpot
     ----------
     Объявление
     {$IFDEF UseHotSpots}
     procedure AddHotSpot(Posn : FrameCornerType;
                          HotChar : Char;
                          var Colors : ColorSet);

     Назначение
     Добавляет активную область в угол рамки.

     Описание
     В отличие  от  других  процедур  добавления  активных об-
ластей,  эта процедура одновременно с добавлением активной об-
ласти   добавляет  и  заголовок.  Заголовок  в  данном  случае
представляет собой односимвольную строку со значением парамет-
ра HotChar. Заголовок может быть расположен в любом из четырех
углов рамки: frTL, frTR, frBL или frBR.
     Кодом для  данного  вида активной области всегда является
hsSpot. Каждая из четырех возможных активных областей различа-
ются по их положению на рамке.
     Процедура AddHotSpot извлекает из объекта ColorSet  уста-
новленные  там поля HotSpotColor и HotSpotMono.  Она назначает
эти цвета соответствующему заголовку.
     Если добавить  более  одной активной области в один угол,
то результаты использования рамки будут неоднозначными.

     Пример
     
     Win.wFrame.AddHotSpot(frTL, #10, DefaultColorSet);
     
     Добавляет активную область в верхний  левый  угол  рамки.
Она  будет  изображена  в  виде символа квадрата (#10) и будет
использовать цвета, принимаемые по умолчанию.

     См. также
     AddHotHeader


     AddScrollBar
     ------------
     Объявление
     {$IFDEF UseScrollBars}
     procedure AddScrollBar(Posn : FrameEdgeType;
                            MinUser, MaxUser : LongInt;
                            var Colors : ColorSet);

     Назначение
     Добавляет стандартную зону прокрутки.

     Описание
     Работает подобно процедуре AddCustomScrollBar,  за исклю-
чением того, что некоторые параметры принимают значения, уста-
навливаемые по умолчанию.Как параметр DecOffset,  так и  пара-
метр IncOffset имеют значения,  равные 1, чтобы зона прокрутки
занимала определенную сторону рамки,  без использования  углов
рамки. Параметры SliChar и BarChar берутся из глобальных типи-
зованных констант DefSliderChar и DefBarChar, соответственно.

     Пример
     
     Win.wFrame.AddScrollBar(frRR, 1, 100, DefaultColorSet);
     
     Добавляет зону прокрутки к правой стороне окна с  пользо-
вательским диапазоном от 0 до 100.

     См. также
     AddCustomScrollBar


     AddShadow
     ---------
     Объявление
     {$IFDEF UseShadows}
     procedure AddShadow(Posn : ShadowPosType;
                         DrawType : ShadowDrawType);

     Назначение
     Добавляет стандартную тень.

     Описание
     Добавляет какой-либо один из двух предварительно заданных
видов теней: затенение с правой и нижней стороны рамки (Posn =
shBR) и затенение с левой  и  нижней  стороны  рамки  (Posn  =
shBL).  Для  составления других требуемых видов теней применя-
ется процедура AddCustomShadow.
     Параметр DrawType  определяет,  будет  ли  тень закрывать
символы основного экрана или будет только изменять их  атрибу-
ты. Для непрозрачной тени определяется тип shOverWrite. В этом
случае символ,  используемый для  изображения  горизонтального
участка  тени  берется  из  глобальной  типизованной константы
DefShadowCharH,   а   для   вертикального   участка    -    из
DefShadowCharV. Ширина вертикального участка тени равна одному
символу.
     Для изменения только атрибутов символов (прозрачное зате-
нение) определяется тип shSeeThru. В этом случае ширина верти-
кального участка затенения равна двум символам.
     В обоих случаях связанный с тенью атрибут является задан-
ным  по  умолчанию  (из установленных в объекте ColorSet полей
ShadowColor и ShadowMono) при создании рамки.  Для  назначения
цвета,  отличного от заданного по умолчанию, используется про-
цедура AddShadowColor вместо процедуры AddShadow.

     Пример
     
     Win.wFrame.AddShadow(shBR, shOverWrite);
     
     Добавляет непрозрачную тень с  правой  и  нижней  стороны
рамки (тень окружает нижнюю и правую стороны окна).

     Win.wFrame.AddShadow(shBL, shSeeThru);
     
     Добавляет прозрачное  затенение  с левой и нижней стороны
рамки.

     См. также
     AddCustomShadow                   AddShadowColor


     AddShadowColor
     --------------
     Объявление
     {$IFDEF UseShados}
     procedure AddShadowColor(Posn : ShadowPosType;
                              DrawType : ShadowDrawType;
                              AttrColor, AttrMono : Byte);

     Назначение
     Добавляет стандартную тень с заказным цветом.

     Описание
     Работает подобно процедуре AddShadow за исключением того,
что  процедурой AddShadowCollor могут быть определены видеоат-
рибуты тени, отличные от принимаемых по умолчанию.

     Пример
     
     Win.wFrame.AddShadowColor(shBR, shOverWrite, #02, #70);
     
     Добавляет непрозрачную тень с  правой  и  нижней  стороны
рамки, используя зеленый цвет на черном фоне для цветных мони-
торов или инверсное изображение для монохромных мониторов.

     См. также
     AddCustomShadow                   AddShadow


     AddSpanHeader
     -------------
     Объявление
     procedure AddSpanHeader(FirstChar,  SpanChar,
                             LastChar : Char; Dpos : Integer;
                             Posn : FrameEdgeType);

     Назначение
     Добавляет разделяющий заголовок рамки.

     Описание
     Эта процедура применяется для того, чтобы добавить к окну
"разделяющие  полосы".  Этот  заголовок  полностью  пересекает
пространство  рамки  и сливается с ее окантовкой.  Разделяющий
заголовок (разделитель) может  быть  ориентирован  вертикально
или горизонтально и автоматически корректируется при изменении
размеров рамки.
     Параметр FirstChar - это символ, изображаемый первым сле-
ва (для горизонтального разделителя) или  первым  вверху  (для
вертикального разделителя).  Этот символ закрывает один символ
существующей окантовки и,  как правило, должен быть выбран та-
ким, чтобы разделитель аккуратно вписывался в окантовку рамки.
Параметр SpanChar - символ,  используемый для  основного  поля
разделителя. Параметр LastChar сливается с окантовкой рамки на
другом конце разделителя.
     Параметр Posn  определяет сторону рамки (frTT,  frBB,frLL
или frRR),  которой параллелен разделитель. Использование frTT
вместо frBB,  например, определяет характер поведения раздели-
теля при изменении размеров рамки.  При задании новых размеров
рамки  расстояние (устанавливаемое параметром DPos) между раз-
делителем и определенной стороной рамки  остается  фиксирован-
ным.
     Традиционным применением разделяющих заголовков  является
размещение  горизонтальной  линии  на одну строку ниже верхней
стороны рамки для того,  чтобы отделить строку  заголовков  от
колонок  информации.  В  этом случае параметр Posn должен быть
frTT, а DPos должен равняться 2.
     Цвета, используемые для разделяющих заголовков,  являются
такими же,  что и для рамки. Они берутся из полей FrameColor и
FrameMono объекта ColorSet для инициализации рамки.
     Разделяющие заголовки не будут  работать  в  сочетании  с
объектами  ScrollingEntryScreen  и  ScrollingSelector (которые
получены в конечном счете из RawWindow и,  следовательно, сами
содержат  объекты  Frame).  Для того,  чтобы произвести эффект
прокрутки, эти объекты постоянно переписывают область, в кото-
рой обычно расположены разделяющие заголовки,  посредством ко-
пирования в  окно  части  виртуального  экрана.  Взамен  можно
использовать  текстовое  поле  (часть экрана ввода данных) для
создания разделителя,  который будет прокручиваться  вместе  с
остальным экраном.  Единственным недостатком этого подхода яв-
ляется то,  что прокручиваемый разделитель плавно не  соединя-
ется с окантовкой окна.

     Примеры
     
     Win.wFrame.AddSpanHeader(#178, #178, #178, 0, frTT);
     Win.wFrame.AddHeader(' Header ', heTC);
     
     Добавляет разделяющий заголовок к рамке объекта Win,  за-
меняя  верхнюю полосу рамки на строку заполняющих символов фо-
на.  Эта строка используется в качестве фона  для  нормального
заголовка.

     Win.wFrame.AddSpanHeader(#195, #196, #180, 2, frTT);
     
     Добавляет горизонтальную разделяющую строку двумя строка-
ми ниже верхней стороны рамки.


     AddSpanHeaderColor
     ------------------
     Объявление
     procedure AddSpanHeaderColor(FirstChar, SpanChar,
                                  LastChar : Char;
                                  DPos : Integer;
                                  Posn : FrameEdgeType;
                                  AttrColor, AttrMono : Byte);

     Назначение
     Добавляет разделяющий рамку заголовок с заказным цветом.

     Описание
     Работает подобно процедуре AddSpanHeader,  за исключением
того, что для разделителя могут быть определены видеоатрибуты,
отличные от принимаемых по умолчанию.

     Пример
     
     Win.wFrame.AddSpanHeader(#195, #196, #180, 2, frTT,
                              $03, $70);
     
     Добавляет горизонтальную разделяющую строку двумя строка-
ми ниже верхней стороны рамки.  Этот разделитель  изображается
зеленым  цветом  на  черном фоне для цветных мониторов и в ин-
версном виде для монохромных.


     AdjustFrame
     -----------
     Объявление
     {$IFDEF UseAdjustableWindows}
     procedure AdjustFrame(X1, Y1, X2, Y2 : Byte);

     Назначение
     Устанавливает новые координаты рамки и корректирует  свя-
занные с ней структуры.

     Описание
     Рамке назначаются новые координаты.  Все заголовки, тени,
зоны прокрутки и активные области корректируются соответствую-
щим образом.
     Эта процедура    обычно    вызывается   только   объектом
RawWindow.  Процедура AdjustFrame не производит проверки  при-
надлежности к диапазону в назначенных координатах.  Эта проце-
дура может отказать с выдачей сообщения об  ошибке  превышения
памяти (epFatal+ecOutOfMemory),  если буферы динамически расп-
ределяемой области памяти, связанные с разделяющими заголовка-
ми или тенями не могут быть изменены в размерах.
     При необходимости корректировки рамки,  связанной с опре-
деленным     окном,    удобно    будет    вызвать    процедуру
AdjustFrameCoords объекта RawWindow,  которая сама  производит
проверку принадлежности к диапазону, а также корректирует дру-
гие структуры окна.

     См. также
     RawWindow.AdjustFrameCoords


     ChangeHeaderAttr
     ----------------
     Объявление
     procedure ChangeHeaderAttr(Index : Byte;
                                Color, Mono : Byte);

     Назначение
     Изменяет существующие цвета заголовка.

     Описание
     Параметр Index - это порядковый номер заголовка, подлежа-
щего изменению.  Первый добавленный заголовок имеет порядковый
номер 0, второй заголовок - 1 и т.д. Обычно, при использовании
функцию GetLastHeaderIndex номер определенного заголовка будет
сохранен в памяти при его добавлении к рамке.
     Если параметр  Index определяет несуществующий заголовок,
процедура  ChangeHeaderAttr  генерирует  сообщение  об  ошибке
(epNonFatal+ecWinBadIndex) и прекращает свое выполнение.
     Параметры Color и Mono определяют новые атрибуты заголов-
ка  для  использования  в  цветном и монохромном режимах соот-
ветственно.

     Пример
     
     Win.wFrame.SetHeaderAttr($02, $70, False);
     Win.wFrame.AddHeader('My Header', heTC);
     ...
     Win.wFrame.ChangeHeaderAttr(0, $03, $70);
     
     Заголовок первоначально добавляется с атрибутом цвета $02
(зеленый на черном фоне),  а затем атрибут изменен на #03 (си-
ний на черном фоне).

     Win.wFrame.ChangeHeaderAttr(1, $03, $70);
     
     Неправильно! (для примера,  приведенного выше) Номер пер-
вого (или единственного) заголовка равен 0, а не 1.

     См. также
     GetLastHeaderIndex                ChangeHeaderString


     ChangeHeaderString
     ------------------
     Объявление
     procedure ChangeHeaderString(Index : Byte; S : strjng;
                                  var Redraw : Boolean);

     Назначение
     Изменяет существующую строку заголовка и корректирует его
положение.

     Описание
     Параметр Index - это порядковый номер заголовка, подлежа-
щего изменению.  Первый добавленный заголовок имеет порядковый
номер 0, второй заголовок - 1 и т.д. Обычно, при использовании
функции GetLastHeaderIndex номер определенного заголовка будет
сохранен в памяти при его добавлении к рамке.
     Если параметр Index определяет несуществующий  заголовок,
то процедура ChangeHeaderString генерирует сообщение об ошибке
(epNonFatal+ecWinBadIndex) и прекращает свое выполнение.
     Параметр S - это новая строка заголовка. Если длина новой
строки отличается от старой и если  соответствующий  заголовок
не   является   заголовком   типа   heCustom,   то   процедура
ChangeHeaderString пересчитывает положение заголовка так,  что
он остается центрированным или выравненным, как это требуется.
     Если новая строка длиннее,  чем выделенный  буфер  строки
(который имеет размер самой длинной строки, использованной для
назначения заголовка), то старый буфер освобождается и выделя-
ется  новый.  Если  при  этом  происходит отказ,  то процедура
ChangeHeaderString    генерирует    сообщение    об     ошибке
(epFatal+ecOutOfMemory).
     Процедура ChangeHeaderString не  корректирует  содержимое
экрана,  чтобы  показать новый заголовок.  Если рамка является
уже видимой,  то данная корректировка может быть выполнена об-
ращением к процедуре DrawHeader, которая изображает только оп-
ределенный заголовок,  или же вызовом  процедуры  UpdateFrame,
которая  обновляет  изображение  всей рамки из рабочей области
памяти.  Параметр Redraw установлен  в  состояние  True  после
возврата из ChangeHeaderString, если необходимо вызвать проце-
дуру UpdateFrame вместо более быстрой  и  простой  DrawHeader.
Это происходит,  когда новая строка заголовка короче, чем ста-
рая и, следовательно, не полностью перекрывает ее.
     Объект RawWindow содержит процедуру несколько более высо-
кого уровня (ChangeHeader),  которая хранит в скрытом виде об-
ращения   к   процедурам   ChangeHeaderString,   DrawHeader  и
UpdateFrame. Обычно ее желательно использовать вместо процеду-
ры ChangeHeaderString.

     Пример
     
     var
       Redraw : Boolean;
     ...
     Win.wFrame.AddHeader('Top Header',  heTC);   {Заголовок с
                                                   номером 0}
     Win.wFrame.AddHeader('Bottom Header', heBC); {Заголовок с
                                                   номером 1}
     ...
     Win.wFrame.ChangeHeaderString(1, 'New Header', Redraw);
     
     Добавляет два заголовка (верхний и нижний), а затем изме-
няет нижний заголовок на 'New Header'.  Параметр Redraw  будет
установлен в состояние True, поскольку новый заголовок короче,
чем старый.

     См. также
     ChangeHeaderAttr                  RawWindaw.ChangeHeader
     DrawHeader                        UpdateFrame


     ChangeHotHeader
     ---------------
     Объявление
     {$IFDEF UseHotSpots}
     procedure ChangeHotHeader(Index : Byte; Len : Byte);

     Назначение
     Изменяет длину (и положение) активной области,  совпадаю-
щей с заголовком.

     Описание
     Эта процедура вызывается в случае, если существует актив-
ная  область  (добавленная  процедурой AddHotHeader),  которая
совпадает с заголовком, а длина этого заголовка изменена вызо-
вом  процедуры  ChangeHeaderString.  Процедура ChangeHotHeader
скорректирует длину и положение активной  области  так,  чтобы
она снова соответствовала заголовку.
     Параметр Index - это порядковый  номер  активной  области
(который,  вероятно,  будет отличным от номера заголовка, свя-
занного с данной активной областью).  Его можно вычислить  са-
мостоятельно  (начиная  с  0  для первой активной области) или
использовать функцию GetLastHotIndex для сохранения  в  памяти
номера активной области при ее добавлении.
     Параметр Len - это длина связанного с  активной  областью
заголовка.

     Пример
     
     Win.wFrame.AddHotHeader(heTC, 3, Win.Width);
     ...
     Win.wFrame.ChangeHotHeader(0, 20);
     
     Добавляет совпадающую с заголовком активную область, про-
тяженностью во всю ширину окна, а затем изменяет протяженность
этой активной области до 20 столбцов.

     См. также
     AddHotHeader                      GetLastHotIndex


     ClearErrors
     -----------
     Объявление
     procedure ClearErrors;

     Назначение
     Сбрасывает все необработанные  ошибки.

     Описание
     После вызова процедуры ClearErrors, следующее обращение к
функции GetLastError всегда возвратит ноль,  даже если сущест-
вовали  некоторые  другие  (помимо  последней)  необработанные
ошибки.  (Теперь  для  объекта Frame возможно появление только
одной ошибки в единицу времени,  но это можно в дальнейшем из-
менить).
     Процедура ClearErrors на самом деле реализована в объекте
AbstractFrame, из которого получен объект Frame.

     Пример
     
     Win.wFrame.ClearErrors;
     
     Сбрасывает все необработанные ошибки, связанные с wFrame.

     См. также
     GetLastError



     Coordinates
     -----------
     Объявление
     procedure Coordinates(var X1, Y1, X2, Y2 : Byte);

     Назначение
     Возвращает координаты рамки.

     Описание
     Координаты возвращаются в абсолютных  величинах  (верхний
левый угол экрана имеет координаты X=1, Y=1). Координаты вклю-
чают окантовку рамки, если она есть, но не включают какие-либо
заголовки или тени, которые выступают за пределы этой окантов-
ки.

     Пример
     
     var
       Xlo, Ylo, Xhi, Yhi : Byte;
     ...
     Win.wFrame.Coordinates(Xlo, Ylo, Xhi, Yhi);
     WriteLn('Upper left corner:  ', Xlo, ',', Ylo);
     WriteLn('Lower right corner: ', Xhi, ',', Yhi);
     
     Отображает на экране координаты рамки Win.

     См. также
     RawWindow.Extent                  WithinFrameCoords


     CurUserValue
     ------------
     Объявление
     {$IFDEF UseScrollBars}
     function CurUserValue(Posn : FrameEdgeType) : LongInt;

     Назначение
     Возвращает текущую пользовательскую величину для  опреде-
ленной зоны прокрутки.

     Описание
     Если пользовательская величина была назначена зоне  прок-
рутки (обычно посредством изображения слайдера),  то она возв-
ращается этой функцией.  Если же  не  было  назначено  никакой
пользовательской величины,  то функция CurUserValue возвращает
0.

     Пример
     
     var
       SliderPos : LongInt;
     ...
     Win.wFrame.AddScrollBar(frRR, 1, 100, DefaultColorSet);
     Win.Draw;
     Win.DrawSlider(frRR, 50);
     ...
     SliderPos := Win.wFrame.CurUserValue(frRR);
     
     Переменная принимает значение 50,  т.е.  текущее значение
слайдера правосторонней зоны прокрутки.

     См. также
     RawWindow.DrawSlider              SetSliderValue


     DisableHeader
     -------------
     Объявление
     procedure DisableHeader(Index : Byte; On : Boolean);

     Назначение
     Блокирует или разблокирует определенный заголовок.

     Описание
     Блокированные заголовки не изображаются процедурами Draw,
UpdateFrame или DrawHeader объекта Frame.  Такой режим  работы
полезен  в  случаях,  когда два заголовка совместно используют
одну и ту же область и в зависимости от обстоятельств  появля-
ется  один либо другой заголовок.  Например,  рассмотрим окно,
которое показывает имя файла в центре верхней  стороны  рамки.
Если  окно должно быть перемещено или изменено в размерах,  то
может оказаться полезной замена нормального заголовка на заго-
ловок,  предоставляющий инструкции по перемещению окна. В этом
случае можно временно блокировать нормальный  заголовок  имени
файла,  разблокировать  подробный  заголовок и обновить рамку.
После завершения перемещения необходимо поменять режим и снова
обновить рамку.
     Параметр Index - это порядковый номер заголовка, подлежа-
щего изменению.  Первый добавленный заголовок имеет порядковый
номер 0, второй заголовок - 1 и т.д. Обычно, при использовании
функции GetLastHeaderIndex номер определенного заголовка будет
сохранен в памяти при его добавлении к рамке.
     Параметр On имеет значение True для блокировки заголовка,
False - для его разблокирования. Не является ошибкой блокиров-
ка уже заблокированного заголовка.  Все заголовки по умолчанию
являются разблокированными.
     Если параметр  Index определяет несуществующий заголовок,
процедура   DrawHeader   генерирует   сообщение   об    ошибке
(epNonFatal+ecWinBadIndex) и прекращает свое выполнение.

     Пример
     
     ...
     Win.wFrame.AddHeader('Main Header', heTC);
     MainIndex := Win.wFrame.GetLastHeaderIndex;
     Win.wFrame.AddHeader('Alternate Header', heTC);
     AltIndex := Win.wFrame.GetLastHeaderIndex;
     Win.wFrame.DisableHeader(AltIndex, True);
     Win.Draw;
     ...
     Win.wFrame.DisableHeader(AltIndxe, False);
     Win.wFrame.DisableHeader(MainIndex,True);
     Win.wFrame.UpdateFrame;
     
     Добавляет два заголовка, оба в центр верхней стороны рам-
ки и сохраняет в памяти порядковые номера каждого из них. Бло-
кирует подменяющий заголовок и рисует окно. Позже разблокирует
подменяющий заголовок, блокирует основной заголовок и обновля-
ет рамку для изображения подменяющего заголовка.

     См. также
     GetLastHeaderIndex                UpdateFrame


     Done
     ----
     Объявление
     destructor Done; virtual;

     Назначение
     Уничтожает рамку.

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

     Пример
     
     Win.wFrame.Done;
     
     Освобождает всю область динамически распределяемой  памя-
ти, использованную главной рамкой Win.


     Draw
     ----
     Объявление
     procedure Draw; virtual;

     Назначение
     Рисует рамку, зоны прокрутки, заголовки и тени.

     Описание
     За исключением теней,  процедура Draw объекта Frame перед
записью не сохраняет содержимое основного  экрана.  Сохранение
экрана  и  его восстановление производится объектом RawWindow,
управляющим рамками.  Каждый прямоугольник тени сам  управляет
своим сохранением и восстановлением. Если какой-либо заголовок
попадает за пределы рамки,  то сохранение и восстановление пе-
рекрываемой  области  находится  под ответственностью програм-
миста;  даже объект RawWindow не пытается управлять данной си-
туацией.
     Блокированные заголовки  не  изображаются.
     Если текущая пользовательская величина зоны прокрутки бы-
ла  уже   установлена   (предварительным   вызовом   процедуры
SetSliderValue или DrawSlider),  то слайдер будет изображен во
время обращения к процедуре Draw объекта  Frame.  В  противном
случае, будет изображен только фон зоны прокрутки.

     Пример
     
     Win.wFrame.Draw;
     
     Рисует все  рамки,  заголовки,  слайдеры и зоны прокрутки
для Win.

     См. также
     UpdateFrame


     DrawHeader
     ----------
     Объявление
     procedure DrawHeader(Index : Byte);

     Назначение
     Рисует определенный заголовок.

     Описание
     Эта процедура полезна в том случае, когда заголовок изме-
няется после того,  как рамка уже нарисована. Если новый заго-
ловок  полностью закрывает старый,  процедура DrawHeader акку-
ратно обновит его. В противном случае, должна быть использова-
на  процедура  UpdateFrame для обновления рамки из рабочей об-
ласти памяти.
     Параметр Index - это порядковый номер заголовка, подлежа-
щего изменению.  Первый добавленный заголовок имеет порядковый
номер 0, второй заголовок - 1 и т.д. Обычно номер определенно-
го заголовка будет сохранен в памяти при его добавлении к рам-
ке при использовании функции GetLastHeaderIndex.
     Если параметр Index определяет несуществующий  заголовок,
то   процедура   DrawHeader  генерирует  сообщение  об  ошибке
(epNonFatal+ecWinBadIndex) и прекращает свое выполнение.  Если
определенный заголовок был блокирован, то процедура DrawHeader
прекращает свое выполнение без его изображения.
     Если заголовок  начинается  внутри  рамки,  то  процедура
DrawHeader автоматически усекает его ,  как это необходимо для
того, чтобы он оставался внутри рамки.

     Пример
     
     Win.wFrame.DrawHeader(0);
     
     Рисует первый заголовок объекта Win.

     См. также
     ChangeHeaderAttr                  ChangeHeaderString


     Error
     -----
     Объявление
     procedure Error(Code : Word); virtual;

     Назначение
     Сообщает о том, что произошла ошибка.

     Описание
     Методы объекта Frame вызывают эту процедуру  всякий  раз,
как ими обнаруживается ошибка. Процедура Error просто сохраня-
ет код ошибки во внутренней переменной  объекта,  откуда  этот
код  может  быть извлечен функцией GetLastError.  Пользователь
обычно не вызывает процедуру Error по своему собственному  ко-
ду.
     Для того,  чтобы обрабатывать ошибки иначе,  можно  отка-
заться  от процедуры Error в объекте,  образованном из объекта
Frame.

     См. также
     GetLastError


     fCopy
     -----
     Объявление
     constructor fCopy(var F : Frame);

     Назначение
     Инициализирует рамку из  другой,  делая  отдельную  копию
всех динамических структур.

     Описание
     Этот конструктор копирует один объект Frame (F) для того,
чтобы инициализировать другой (Self). Поскольку рамка содержит
динамические объекты,  такие,  как заголовки,  тени и т.д., то
дополнительные  копии каждого из этих объектов выделены и свя-
заны в новый объект. Таким образом, новая рамка может быть мо-
дифицирована без какого-либо влияния на старую.
     Конструктор полезен в случае,  когда  он  рассматривается
совместно  с  объектом RawWindow,  который включает в себя две
отдельные рамки. Одна рамка изображается на экране, когда окно
является  текущим,  а  другая - когда окно не является текущим
(при  условии,  что  установлена   опция   wAltFrame   объекта
RawWindow).  Например, при возникновении необходимости исполь-
зовать в рамке, не являющейся текущей, другой видеоатрибут для
ее  заголовков  и другой набор символов для ее окантовки.  Как
правило,  обе рамки скорее будут похожими, чем различными, и в
этом случае для инициализации подменяющей рамки удобно исполь-
зовать конструктор fCopy, чтобы получить копию основной рамки,
а затем модифицировать ее по своему усмотрению.
     Если для размещения структур  новой  рамки  окажется  не-
достаточно   динамически  распределяемой  области  памяти,  то
конструктор     fCopy      будет      генерировать      ошибку
(epFatal+ecOutOfMemory).  Поскольку fCopy является конструкто-
ром,  код ошибки возвращается  в  константу  глобального  типа
InitStatus.

     Пример
     
     Win.aFrame.fCopy(Win.wFrame);
     
     Копирует основную  рамку окна (поле wFrame) в подменяющую
ее рамку (поле aFrame).

     См. также
     Init                              RawWindow.wAltFrame


     GetLastError
     ------------
     Объявление
     function GetLastError : Word; virtual;

     Назначение
     Возвращает и сбрасывает код последней ошибки.

     Описание
     Функция GetLastError возвращает ноль,  если нет необрабо-
танных ошибок.  В противном случае, эта функция возвращает со-
четание   префикса  ошибки  (кратного  10000)  и  кода  ошибки
(1..9999).  Коды ошибок приведены в Приложении D.  Специфичные
ошибки,  которые  могут произойти в результате обращения к от-
дельным методам,  упомянуты в документации для каждого  такого
метода.
     Для объекта  Frame  особенно   важно   вызывать   функцию
GetLastError  после  каждого обращения (или последовательности
обращений) к процедуре типа Add.
     Подобно функции   IoResult   в   Turbo   Pascal,  функция
GetLastError очищает внутреннюю переменную ошибки после каждо-
го ее вызова. Немедленный повторный вызов функции GetLastError
возвратит ноль.
     
     Пример
     
     Win.wFrame.AddCustomScrollBar(frRR, 0, 9, 1, 1, #7,
                                   #179, DefaultColorSet);
     Win.wFrame.AddShadow(shBR, shOverWrite);
     Win.wFrame.AddHeader('My Header', heTC);
     Status := Win.wFrame.GetLastError;
     if Status <> 0 then begin
       WriteLn('Failed to add window features, Status =',
               Status);
       Halt;
     end;
     
     Осуществляет проверку  на предмет ошибок после добавления
трех элементов окна.

     См. также
     ClearErrors


     GetLastHeaderIndex
     ------------------
     Объявление
     function GetLastHeaderIndex : Byte;

     Назначение
     Возвращает порядковый  номер  последнего  добавленного  к
рамке заголовка.

     Описание
     Эта функция полезна в случаях,  когда добавляется заголо-
вок  и  предполагается  модификация цвета или строки заголовка
после инициализации окна. Функция GetLastHeaderIndex возвраща-
ет   номер   последнего   добавленного   (с  помощью  процедур
AddHeader,  AddSpanHeader и т.д.)  заголовка.  Если  присвоить
значение этого номера переменной, то позже ее можно передать в
качестве    параметра    в    процедуры    ChangeHeaderString,
ChangeHeaderAttr или DrawHeader.  Гораздо удобнее получить но-
мер заголовка  вызовом  функции  GetLastHeaderIndex,  чем  вы-
числять его вручную, особенно при изменении программы.
     Функция GetLastHeaderIndex возвращает номер 255,  если на
рамке нет заголовков.  Заголовок,  добавленный к рамке первым,
имеет нулевой порядковый номер.

     Пример
     
     Win.wFrame.AddHeader('Top Header', heTC);
     Win.wFrame.AddHeader('Bottom Header', heBC;
     BotIndex := Win.wFrame.GetLastHeaderIndex,;
     
     Переменная BotIndex принимает значение номера  последнего
добавленного заголовка, в данном случае - 1.

     См. также
        ChangeHeaderString                GetLastHotIndex


     GetLastHotIndex
     ------------------
     Объявление
     {$IFDEF UseHotSpots}
     function GetLastHotIndex : Byte;

     Назначение
     Возвращает порядковый номер последней добавленной  актив-
ной области.

     Описание
     Эта функция выполняет аналогичные действия по отношению к
активным областям, что и функция GetLastHeaderIndex по отноше-
нию к заголовкам. После добавления активных областей, их можно
модифицировать  с  целью совмещения со связанными с ними заго-
ловками.
     Надо отметить, что заголовки и активные области имеют не-
зависимые последовательные номера и никакой связи между  этими
номерами нет.

     Пример
     
     HotIndex := Win.wFrame.GetLastHotIndex;
     
     Возвращает номер  последней  добавленной к рамке активной
области (номер первой области - ноль).

     См. также
     GetLastHeaderIndex


     Init
     ----
     Объявление
     constructor Init(X1, Y1, X2, Y2 : Byte; FA : FrameArray;
                      var Colors : ColorSet);

     Назначение
     Инициализирует все поля и координаты рамки.

     Описание
     Если не используются новые типы данных, то не потребуется
непосредственного обращения к этому методу.  При инициализации
окна,  объект RawWindow и его производные вызывают конструктор
Init объекта Frame. Дальнейшее описание подробно поясняет это.
X1, Y1, X2 и Y2 являются абсолютными координатами углов рамки,
включая окантовку,  если она есть. Параметр FA определяет сим-
волы окантовки.В этот параметр могут входить следующие предва-
рительно определенные константы:
     
     DefWindowFrame     двойная горизонтальная линия,
                        простая вертикальная линия
     DblWindowFrame     двойная линия по всему периметру
     SglWindowFrame     простая линия по всему периметру
     NoWindowFrame      отсутствие окантовки

     Отсутствие окантовки  обозначается  помещением  константы
NoFrameChar (#255) в соответствующее место массива рамки. Сле-
дует  отметить,  что  вполне возможно иметь окантовку только с
некоторых сторон рамки,  при условии соответствующего заполне-
ния массива рамки.
     Объектом Frame фактически используются следующие  поля  в
объекте    ColorSet:   FrameColor,   FrameMono,   HeaderColor,
HeaderMono,  ShadowColor  и  ShadowMono.  Поля  FrameColor   и
FrameMono являются атрибутами изображения окантовки рамки. По-
ля HeaderColor и HeaderMono используются для каждого заголовка
(если они не были заданы другими атрибутами при добавлении за-
головка).  Поля ShadowColor и ShadowMono применяются к  теням,
если атрибуты не были заданы другими значениями.
     Конструктор Init,  кроме  того,  устанавливает  значения,
принимаемые по умолчанию, для пределов задания размеров и усе-
чения рамки.  Если окно имеет какие-либо видимые символы окан-
товки,  то  минимальными  пределами для задания размеров рамки
являются два символа в ширину и два символа в высоту;  неокан-
тованные рамки могут сжиматься до размеров один на один.  Пре-
делы усечения устанавливаются для того,  чтобы предоставить  в
текущем    режиме    возможность   записи   на   весь   экран,
X=1..ScreenWidth и Y=1..ScreenHeight. Для получения более пол-
ной   информации   следует   обратиться  к  описанию  процедур
SetSizeLimits и SetClipLimits.
     Конструктор Init  объекта Frame в процессе работы практи-
чески не может отказать. И все-таки неплохо проконтролировать,
что  инициализация  прошла  успешно  и обратиться к переменной
InitStatus в случае обнаружения ошибки.

     См. также
     SetClipLimits                     SetSizeLimits


     IsFramed
     --------
     Объявление
     function IsFramed : Boolean;

     Назначение
     Возвращает значение  True,  если   какое-либо   поле   из
FrameChars не является константой NoFrameChar.

     Описание
     Рамки могут быть как окантованными,  так и неокантованны-
ми. Функция IsFramed возвращает значение True , если какой-ли-
бо участок окантовки рамки  будет  видимым,  другими  словами,
если   он   содержит  любой  другой  символ,  кроме  константы
NoFrameChar.

     Пример
     
     if Win.wFrame.IsFramed then
       Win.wFrame.SetFrameType(DblWindowFrame);
     
     Если рамка Win в настоящее время имеет окантовку,  то она
изменяется на окантовку,  выполненную двойной линией по  всему
периметру рамки.


     Load
     ----
     Объявление
     constructor Load(var S : IdStream);

     Назначение
     Загружает из абстрактного последовательного файла.

     Описание
     Если не используются новые типы данных, то непосредствен-
ное обращение к этому методу не потребуется.  При загрузке ок-
на,  объект  RawWindow  и его производные вызывают конструктор
Load объекта Frame. Дальнейшее описание подробно поясняет это.
     Переменная S   -   это,   собственно,  инициализированный
абстрактный  последовательный  объект  (например,  абстрактный
последовательный файл, открытый для чтения). Следует отметить,
что переменная S может быть любым потомком типа IdStream,  ко-
торый   включает   в  себя  типы  DosIdStream,  BufIdStream  и
MemIdStream.
     Конструктор Load считывает из абстрактного последователь-
ного файла S байтовую  последовательность.  Эти  байты  должны
быть уже записаны предварительным вызовом процедуры Store объ-
екта Frame. Конструктор Load инициализирует координаты рамки и
добавляет любые заголовки, тени, зоны прокрутки и активные об-
ласти, которые были элементами рамки при ее сохранении в памя-
ти.
     Если конструктор Load отказывает,  то он возвратит значе-
ние False ,  а код ошибки будет сохранен в глобальной перемен-
ной InitStatus.
     Метод FrameStream    является    процедурой   регистрации
абстрактных последовательных файлов для объекта Frame.

     См. также
     RawWindow.Load                    Store

     
     SetClipLimits
     -------------
     Объявление
     procedure SetClipLimits(MinXL, MinYL, MaxXH,
                             MaxYH : Byte);

     Назначение
     Устанавливает границы для изображения рамки (тени на этих
границах отсекаются).

     Описание
     Границы отсечения  определяют прямоугольную область экра-
на,  вне которой тени изображаться не будут.  При обращении  к
демонстрационной  программе  DESRPOP можно заметить,  что тени
никогда не накладываются на строку состояния внизу  экрана,  а
также  то,  что окна могут изменяться в размерах до заполнения
всей ширины экрана, делая тени фактически невидимыми. Тени яв-
ляются необязательным элементом; они появляются в области, оп-
ределяемой границами отсечения.
     Границы отсечения  по умолчанию охватывают весь экран,  а
чтобы ограничить область для  изображения  рамки,  применяется
процедура SetClipLimits.

     Пример

     Win.wFrame.SetClipLimits(1, 1, 60, 20);

     Назначаются границы отсечения, определяющие прямоугольник
с координатами верхнего левого угла (1,1)  и  нижнего  правого
угла (60,20).

     См. также
     SetSizeLimits


     SetFrameAttr
     ------------
     Объявление
     procedure SetFrameAttr(Color, Mono : Byte); virtual;

     Назначение
     Устанавливает атрибуты для символов окантовки.

     Описание
     Эта процедура используется для  изменения  видеоатрибутов
окантовки рамки. Параметр Color является атрибутом, используе-
мым в цветном видеорежиме, а Mono - в монохромном.

     Пример

     Win.wFrame.SetFrameAttr($02, $70);

     Устанавливаются атрибуты окантовки объекта Win, позволяю-
щие  изображать  ее  символы зеленым цветом на черном фоне для
цветных мониторов и в инверсном виде - для монохромных монито-
ров.

     См. также
     Init                              SetHeaderAttr


     SetFrameType
     ------------
     Объявление
     procedure SetFrameType(FA : FrameArray);

     Назначение
     Изменяет тип окантовки.

     Описание
     Эта процедура  используется  для  замены  символов линий,
предназначенных для изображения окантовки рамки.  Параметр  FA
является массивом из восьми символов, определяющих внешний вид
четырех сторон  и  четырех  углов  рамки.  В  разделе  "Типы",
рассмотренном   выше   ,  представлена  информация  о  массиве
FrameArray.  Информация о некоторых стандартных значениях, ко-
торые может принимать параметр FA,  представлена в приведенном
выше разделе "Константы".

     Пример

     Win.wFrame.SetFrameType(DblWindowFrame);

     Задаются символы  двойных  линий для изображения основной
рамки объекта Win.


     SetHeaderAttr
     -------------
     Объявление
     procedure SetHeaderAttr(Color, Mono : Byte;
                             ChangeAll : Boolean);

     Назначение
     Устанавливает атрибуты для строк заголовков.

     Описание
     Первым действием,  выполняемым процедурой  SetHeaderAttr,
является  изменение  атрибута,  используемого по умолчанию для
заголовков, которые в дальнейшем будут добавляться к рамке.
     Если значением параметра ChangeAll является True, то вто-
рым действием,  выполняемым этой процедурой,  будет  изменение
атрибутов  всех заголовков,  уже добавленных к рамке на данный
момент. Следует аккуратно пользоваться данной опцией, посколь-
ку при этом изменяются даже те заголовки, которые по умолчанию
использовали атрибуты, отличные от стандартного атрибута заго-
ловка (например, разделяющие заголовки).
     Параметры Color и Mono являются видеоатрибутами,  исполь-
зуемыми, соответственно, в цветном и монохромном видеорежимах.

     Пример

     Win.wFrame.SetHeaderAttr($03, $70, False);

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


     SetShadowAttr
     -------------
     Объявление
     {$IFDEF UseShadows}
     procedure SetShadowAttr(Color, Mono : Byte;
                             ChangeAll : Boolean);

     Назначение
     Устанавливает атрибуты для символов тени.

     Описание
     Первым действием,  выполняемым  процедурой SetShadowAttr,
является изменение атрибута по умолчанию,  использующегося для
теней, которые в дальнейшем будут добавляться к рамке.
     Если значением параметра ChangeAll является True, то вто-
рым  действием,  выполняемым этой процедурой,  будет изменение
атрибутов всех теней,  уже добавленных к рамке на  данный  мо-
мент.
     Параметры Color и Mono являются видеоатрибутами,  исполь-
зуемыми, соответственно, в цветном и монохромном видеорежимах.

     Пример

     Win.wFrame.SetShadowAttr($03, $70, True);

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


     SetSizeLimits
     -------------
     Объявление
     {$IFDEF UseAdjustableWindows}
     procedure SetSizeLimits(MinW, MinH, MaxW, MaxH : Byte);

     Назначение
     Устанавливает границы для изменения размеров рамки.

     Описание
     Предусмотренные данной процедурой границы определяют диа-
пазон,  в  котором  может  действовать  процедура AdjustFrame.
Установка этих границ полезна в том случае, когда нужно гаран-
тировать,  что добавленное к рамке оформление - особенно заго-
ловки и зоны прокрутки - имеет достаточно пространства для вы-
полнения им своих полезных функций. Объект RawWindow обеспечи-
вает соблюдение установленных здесь  границ;  как  упоминалось
раньше,  сама  процедура  AdjustFrame не осуществляет проверку
попадания в диапазон.
     Параметры MinW  и  MinH  являются  минимальной  шириной и
высотой рамки,  соответственно;  именно их точное  определение
является, в основном, наиболее важным. Параметры MaxW и MaxH -
это максимальные значения ширины и высоты рамки.

     Пример

     Win.wFrame.SetSizeLimits(10, 10, 60, 20);

     Устанавливаются границы размеров рамки  для  поля  wFrame
объекта Win.  Наименьший размер рамки - (10*10);  наибольший -
(60*20).

     См.также
     AdjustFrame                       SetClipLimits


     SetSliderValue
     --------------
     Объявление
     {$IFDEF UseScrollBars}
     procedure SetSliderValue(Posn : FrameEdgeType;
                              UserVal : LongInt);

     Назначение
     Изменяет пользовательскую величину, не отображая ее.

     Описание
     Параметр Posn - это сторона рамки,  содержащая зону прок-
рутки:  frTT, frBB, frLL или frRR. Если на данной стороне зона
прокрутки отсутствует,  то процедура SetSliderValue немедленно
завершит свое выполнение. В противном случае эта процедура об-
новляет  внутренние  переменные,  хранящие  текущую  пользова-
тельскую величину и физическое положение  слайдера.  Процедура
SetSliderValue  не обновляет экран;  для этого необходимо выз-
вать процедуру DrawSlider объекта RawWindow.
     Эта процедура  полезна в случаях,  когда производится об-
новление слайдера на рамке,  не являющейся в данный момент те-
кущей.

     Пример

     Win.wFrame.SetSliderValue(frRR, CurRow);

     Устанавливается величина  для  положения слайдера,  соот-
ветствующая гипотетической текущей строке CurRow в списке ука-
заний.

     См. также
     CurUserValue                      RawWindow.DrawSlider


     Store
     -----
     Объявление
     procedure Store(var S : IdStream);

     Назначение
     Сохраняет рамку в абстрактном последовательном файле.

     Описание
     Непосредственного обращения к данной процедуре не  потре-
буется, если не вводятся новые типы данных. Объект RawWindow и
его потомки вызывают процедуру Store объекта Frame при  сохра-
нении окна. Дальнейшее описание подробно поясняет это.
     Переменная S  является   инициализированным   абстрактным
последовательным  объектом  (например,  абстрактный последова-
тельный файл,  открытый для записи). Следует отметить, что пе-
ременная S может быть любым из потомков типа IdStream, включа-
ющего типы DosIdStream, BufIdStream и MemIdStream.
     Процедура Store  записывает  координаты  рамки и вызывает
процедуры сохранения всех добавленных к рамке заголовков,  те-
ней, зон прокрутки и активных областей.
     В случае отказа процедуры  Store  функция  GetStatus  для
абстрактных  последовательных файлов возвратит ненулевую вели-
чину.

     См. также
     Load                              RawWindow.Store


     UpdateFrame
     -----------
     Объявление
     procedure UpdateFrame; virtual;

     Назначение
     Рисует рамку, зоны прокрутки и заголовки (тени не изобра-
жаются).

     Описание
     Эта процедура изображает окантовку рамки,  ее заголовки и
зоны прокрутки в указанном порядке.  Тени данной процедурой не
изображаются.  Процедура UpdateFrame предназначена для  ситуа-
ций, когда рамка уже однажды была нарисована, является видимой
на экране и претерпевает  какое-либо  существенное  изменение,
такое,  как модификация заголовка. Процедура UpdateFrame пока-
жет это изменение.
     Если рамка еще не нарисована,  то вместо данной процедуры
следует вызвать процедуру Draw объекта Frame.

     Пример

     Win.wFrame.UpdateFrame;

     Рисуется рамка, заголовки и зоны прокрутки объекта Win.

     См. также
     Draw                              DrawHeader


     WithinFrameCoords
     -----------------
     Объявление
     procedure WithinFrameCoords(var X1, Y1, X2, Y2 : Byte);

     Назначение
     Возвращает координаты области,  находящейся внутри  окан-
товки, не включая ее.

     Описание
     Для окантованных рамок данная процедура возвращает  коор-
динаты,   отличные   от   координат,  возвращаемых  процедурой
Coordinates,  которая включает  символы  окантовки.  Процедура
WithinFrameCoords  используется объектом RawWindow для опреде-
ления области,  подлежащей, помимо других действий, очищению с
помощью процедуры ClearContents.

     Пример

     var
       InX1, InY1, InX2, InY2, I : Byte;
     ...
     Win.wFrame.WithinFrameCoords(InX1, InY1, InX2, InY2);
     for I := InY1 to InY2 do
       FastText(CharStr(#9, InX2-InX1+1), I, InX1);

     Заполняется все пространство внутри  окантовки  символами
фона.

     См. также
     Coordinates



     C. ПРОГРАММНЫЙ МОДУЛЬ OPWINDOW: ОБЪЕКТЫ ОКОН

     Модуль OPWINDOW  используется в том случае,  когда модуль
OPFRAME исчерпал свои возможности,  и  занимает  следующий  по
сложности  уровень  в  иерархии  окон.  (Первоначально  модули
OPFRAME и OPWINDOW были объединены в один модуль,  однако  это
увеличивало  объем  компилятора Turbo Pascal,  вследствие чего
они и были разделены). Следующая иерархическая структура пока-
зывает объекты, содержащиеся в модуле OPWINDOW.

     [Root]
        LoadableColorSet
        PackedWindow
        [PointerStack]
          WindowStack
        VirtScreen
        AbstractWindow
          RawWindow
            StackWindow
              CommandWindow

     Среди этих объектов только  объект  StackWindow  является
наиболее подходящим для объявления в качестве переменной.  Для
получения информации о других объектах  следует  обратиться  к
введению к данной главе.  Позже в данном разделе будет продол-
жено  обсуждение  объектов  LoadableColorSet,  PackedWindow  и
VirtScreen.
     Об объекте AbstractWindow уже сказано  достаточно  много,
поэтому   здесь   он  будет  только  кратко  упомянут.  Объект
AbstractWindow описывает только наиболее общие свойства  окна.
Объект  AbstractWindow  предусмотрен для таких случаев,  когда
необходимо произвести фундаментальные расширения  существующих
возможностей  окон  в  системе Object Professional.  Например,
включение графического режима или многофорточных окон (подобно
окну CPU отладчика Turbo Debugger).  Предпочтительнее получать
подобные расширения из  предшественника,  также  используемого
объектом  RawWindow совместно с другими объектами окон системы
Object  Professional.  Таким  образом  можно  создать  связный
список  (или  другую  какую-либо  объединяющую структуру) всех
этих объектов, связанных с окнами.
     Если возникнут затруднения при реализации отдельных типов
визуальных или  логических  эффектов,  полученных  из  объекта
RawWindow,    то    потребуется   изучить   описание   объекта
AbstractWindow, содержащееся в файле OPWINDOW.PAS. Можно полу-
чить  новый  тип,  который  будет сочетать в себе спецификации
объекта AbstractWindow,  добавляя  необходимые  функциональные
возможности.
     Среди всех     методов,     предусмотренных      объектом
AbstractWindow,  только  три  метода - процедура ClearErrors и
функции Height и Width - не игнорируются  объектом  RawWindow.
Они  специально  описаны в разделе RawWindow для облегчения их
поиска.


                  ОКОННЫЕ КООРДИНАТЫ

     В первоначальном виде окно представляет собой прямоуголь-
ник на экране,  описываемый двумя наборами координат  (X,Y)  -
один  для  левого  верхнего угла окна,  а другой - для правого
нижнего.  Однако при полной реализации  возможностей  окна  (в
объекте RawWindow или его потомках) используется несколько на-
боров координат. Очень важно понять различие между ними.
     Начнем с  перечисления  различных  критических размеров и
методов, управляющих ими. Затем каждый из них будет описан де-
тально.

    - активная прямоугольная область окна (Init,InitCustom)
    - обрамленная прямоугольная область   (AdjustFrameCoords)
    - максимальная и минимальная
      активная ширина  и высота           (SetSizeLimits)
    - максимальная и минимальная ширина
      и высота рамки                      (SetFrameLimits)
    - прямоугольная область, ограничивающая
      положение рамки                     (SetPosLimits)
     
     Вероятно, пользователь достаточно хорошо знаком с  актив-
ной прямоугольной областью окна.Ее координаты эквивалентны ко-
ординатам, используемым процедурой Window модулей CRT и OPCRT.
Эти координаты определяют рабочую область для процедур Write и
WriteLn, а также область, в которой происходит прокрутка. Опе-
ратор  GotoXY(1,1) перемещает курсор в верхний левый угол дан-
ной активной прямоугольной области окна.  Относящиеся  к  окну
процедуры быстрой записи, такие как wFastWrite, используют ак-
тивную прямоугольную область окна в качестве своей системы ко-
ординат;  кроме того,  они отсекают текст,  который выходит за
пределы данного окна.
     Обрамленная прямоугольная  область  может быть равной ак-
тивному окну, но это совершенно необязательно. Обычно для окон
с  окантовкой обрамленная область окружает активное окно одной
символьной позицией по всему периметру.  Объект RawWindow пре-
доставляет  также  процедуру (AdjustFrameCoords),  позволяющую
произвольно увеличивать обрамленную область. Эта процедура по-
лезна в случаях,  когда желательно записать фиксированные наз-
вания вне прокручивающейся области окна,  но внутри  окантовки
рамки.  Для написания этих названий нельзя использовать опера-
торы процедуры WriteLn,  поскольку эти названия находятся  вне
активного окна, однако объект RawWindow предоставляет для этой
цели полный набор методов быстрой записи, относящихся к рамке.
     Когда объект RawWindow и его потомки сохраняют содержимое
области экрана,  закрываемой окном,  то используемые для этого
координаты являются координатами обрамленной прямоугольной об-
ласти.  Когда эти объекты сохраняют содержимое самого окна, то
для этой цели используются координаты прямоугольника, располо-
женного внутри окантовки (если она есть) обрамленной области.
     При вызове    конструктора    окна   (обычно   Init   или
InitCustom),  всегда необходимо задавать координаты  активного
окна.  Если окно имеет окантовку,  то для нее необходимо заре-
зервировать по крайней мере одну позицию с каждой стороны  ок-
на. Например, назначение на нормальном экране координат (1, 1,
80,  25) для окантованного окна является ошибочным. Последова-
тельное  использование  активных  координат  для инициализации
каждого окна в системе Object Professional является ее отличи-
ем от оконной системы в Turbo Professional.
     Оставшиеся три параметра управляют  поведением  окна  при
необходимости изменения его размеров или расположения. Если во
время работы координаты окна не изменяются, то следующие абза-
цы,  содержащие описания этих параметров,  можно не рассматри-
вать.
     Администратор окна  перед изменением размеров окна прове-
ряет минимальную и максимальную ширину и высоту активного  ок-
на. Эти пределы по умолчанию равны 1*1 и полному экрану, соот-
ветственно.  Когда содержимое окна оправдывает это,  их  можно
изменить вызовом процедуры SetSizeLimits.  Например, в случае,
когда окно должно содержать список  указаний  с  минимально  и
максимально  допустимой  шириной  в  10  и  30 позиций,  соот-
ветственно.
     Администратор окна перед изменением размеров рамок,  свя-
занных с каждым окном,  также проверяет минимальную  и  макси-
мальную  ширину  и высоту рамки.  Для окантованного окна мини-
мальные размеры по умолчанию равны 2*2,  а для неокантованного
1*1.  Эти  пределы обычно связаны с отдельными заголовками или
зонами прокрутки. Всякий раз, когда зона прокрутки добавляется
к рамке, ее минимальные размеры при необходимости будут увели-
чены.  Таким образом,  рамка никогда не сможет быть  сжата  до
размеров,  меньших,  чем  это  необходимо для сохранения рабо-
тоспособной зоны прокрутки.  Вызовом процедуры  SetFrameLimits
можно полностью изменить предельные размеры рамки.
     Наконец, прямоугольник,  ограничивающий положение  рамки,
управляет  областью  возможного  перемещения  окна  на экране.
Внешняя сторона рамки не может переместиться за пределы данно-
го прямоугольника.  Тот же прямоугольник служит, кроме того, в
качестве границы отсечения для теней и заголовков.  Он полезен
в случаях,  когда на текущем экране существуют строки меню или
состояния,  которые не должны закрываться окном (такой принцип
используется  в  демонстрационной программе DESKPOP).  Прямоу-
гольник,  ограничивающий положение рамки, можно корректировать
вызовом процедуры SetPosLimits.


                    УСЛОВНЫЕ ОПИСАНИЯ

     Объекты в модуле  OPWINDOW,  подобно  объектам  в  модуле
OPFRAME, подвержены воздействию следующих условных описаний:

     {$DEFINE UseMouse}
     {$DEFINE UseScrollBars}
     {$DEFINE UseHotSpots}
     {$DEFINE UseShadows}
     {$DEFINE UseAdjustableWindows}

     Посредством редактирования  исходного  файла OPDEFINE.INC
можно отключить ненужные условные описания.  Это сократит раз-
мер готовой к выполнению программы пользователя в машинных ко-
дах и позволит компилятору на входе работать с исходной  прог-
раммой большего размера.
     Для получения более полной информации следует  обратиться
к  разделу "Условные описания" в Разделе B.2 ("Программный мо-
дуль OPFRAME").


          ОКНА И АБСТРАКТНЫЕ ПОСЛЕДОВАТЕЛЬНЫЕ ФАЙЛЫ

     Все объекты  в  модуле  OPWINDOW  могут  быть  записаны в
абстрактные последовательные файлы и считаны из них. Следующие
процедуры  сопряжены  модулем OPWINDOW и выполняют функции ре-
гистрации типа. В Главе 8 дано их общее описание, а более под-
робная  информация  о  них содержится в описаниях конструктора
Load и процедуры Store каждого объекта.

    procedure RawWindowStream(SPtr : IdStreamPtr);
      {-Регистрирует все  типы,  необходимые  для абстрактных
        последовательных файлов,  содержащих  исходные   окна
        текстового  режима}

    procedure ExplodingWindowStream(SPtr : IdStreamPtr);
      {-Регистрирует процедуры, используемые для раскрывающих-
        ся окон}

    procedure StackWindowStream(SPtr : IdStreamPtr);
      {-Регистрирует все  типы,  необходимые  для абстрактных
        последовательных файлов,  содержащих заносимые в стек
        окна}

    procedure CommandWindowStream(SPtr : IdStreamPtr);
      {-Регистрирует все  типы,  необходимые  для абстрактных
        последовательных файлов, содержащих  командные  окна}

    procedure WindowStackStream(SPtr : IdStreamPtr);
      {-Регистрирует все  типы,  необходимые  для абстрактных
        последовательных файлов,  содержащих глобальные пере-
        менные (wStack)}

    procedure VirtScreenStream(SPtr : IdStreamPtr);
      {-Регистрирует все  типы,  необходимые  для абстрактных
        последовательных файлов, содержащих виртуальные экра-
        ны}

    procedure LoadableColorSetStream(SPtr : IdStreamPtr);
      {-Регистрирует все  типы,  необходимые  для абстрактных
        последовательных файлов, содержащих загружаемые виде-
        оатрибуты экранных объектов}

    procedure PackedWindowStream(SPtr : IdStreamPtr);
      {-Регистрирует все  типы,  необходимые  для абстрактных
        последовательных файлов,  содержащих  окна  в  сжатом
        формате}



                    1. ОБЪЕКТ RawWindow

     Объект RawWindow  реализует большинство функций,  которые
можно ожидать от текстового окна. Он предоставляет буферы, не-
обходимые  для  сохранения  закрываемой окном области экрана и
содержимого, находящегося внутри окна, логику, необходимую для
изображения  рамки окна и установки его активных координат,  а
также методы для очищения,  записи в окно и  прокрутки  внутри
окна.
     Объект RawWindow не представляет  возможности  управления
взаимосвязями  между  многочисленными окнами.  Эта возможность
добавляется  объектами  StackWindow  и   WindowStack.   Объект
RawWindow производит распознавание лишь того, является ли дан-
ное окно текущим (окно, изображенное последним), активным (ок-
но,  находящееся на экране, но не обязательно текущее) или не-
активным (инициализированное окно, отсутствующее на экране).
     Обладающий этим  ограничением  объект  RawWindow является
наиболее полезным в среде, где окна имеют мозаичное расположе-
ние  (неперекрывающиеся  окна)  и где управление передается от
одного окна к  другому  посредством  поочередного  изображения
каждого  из  них.  Поскольку объект StackWindow требует только
незначительных дополнительных затрат ресурсов, он является на-
иболее  подходящим  типом  окна для использования в прикладных
программах.  Однако объект StackWindow унаследовал многие свои
свойства  от  объекта  RawWindow,  поэтому возможности объекта
RawWindow достойны изучения.
     В следующем примере показано,  как использовать некоторые
свойства объекта RawWindow,  в том числе,  как производить пе-
реключение между двумя неперекрывающимися окнами.

     program RawWindow;    {файл EXRAWWIN.PAS}
     uses
       OpRoot, OpString, OpCrt, OpFrame, OpWindow;
     var
       W1, W2 : RawWindow;

     procedure Pause;
       {-Ждет нажатия клавиши}
     var
       KW : Word;
     begin
       KW := ReadKeyWord;
     end;

     begin
       ClrScr;

       {Инициализируется первое окно}
       W1.InitCustom(10, 5, 40, 20, DefaultColorSet,
                     wClear+wBordered+AltFrame);
       W1.EnableExplosions(20);
       W1.wFrame.AddHeader(` First Window ', heTL);
       W1.aFrame.AddHeader(` inactive now ', heTL);
       W1.aFrame.SetFrameType(SglWindowFrame);

       {Инициализируется второе, неперекрывающееся окно}
       W2.InitCustom(45, 10, 75, 15, DefaultColorSet,
                     wClear+wBordered);
       W2.wFrame.AddHeader(` Second Window ', heBC);
       W2.wFrame.AddShadow(shBR, shOverWrite);

       {Рисуется первое окно, осуществляется запись в него,
         курсор заменяется на прямоугольный}
       W1.Draw;
       WriteLn(`In the first window');
       WriteLn(`Change to block cursor');
       W1.SetCursor(cuBlock);
       Pause;

       {Рисуется второе окно, осуществляется запись в него}
       W2.Draw;
       WriteLn(`In the second window');
       W2.wFastText(`Text can be clipped when it is too long
                     to fit', W2.Height, 1);
       W2.wGotoXY(W2.Width, W2.Height);
       Pause;

       {Осуществляется переключение обратно на первое окно}
       W1.Draw;
       Pause;

       {Стираются оба окна, начиная со второго}
       W2.Erase;
       Pause;
       W1.Erase;

       {Освобождается от  окон блок динамически распределяемой
          памяти}
       W2.Done;
       W1.Done;
     end.

     Этот пример  объявляет два статических экземпляра объекта
RawWindow - W1 и W2.  Экземпляр W1 инициализирован как оканто-
ванное   окно   посредством   использования  опции  wBordered.
Поскольку задана опция wAltFrame,  то окно W1 управляет  двумя
отдельными  экземплярами  объекта  Frame:  оно отображает поле
wFrame (поле данных в объекте RawWindow) в случае,  когда окно
W1 является текущим;  а когда оно является активным, но не те-
кущим,  отображается другое поле данных -  aFrame.  Для  того,
чтобы  различие между рамками в данном примере сделать очевид-
ным, для подменяющей рамки использовался другой стиль заголов-
ка  и окантовки.  Окно W1 является также раскрывающимся.  Этот
специальный эффект достигается  посредством  вызова  процедуры
EnableExplosions. Раскрывающиеся окна представляют собой част-
ный случай  наиболее  общей  возможности  вызова  определенной
пользователем подпрограммы всякий раз,  когда окно открывается
или закрывается.
     Экземпляр W2 также инициализирован как окантованное окно,
но в нем не использована опция подменяющей рамки.  Рамка  окна
W2 имеет тень.  (Такие относящиеся к рамке свойства, как окан-
товки,  заголовки и тени,  аналогичны описанным  в  предыдущем
разделе).
     Затем программа  данного  примера  изображает   окно   W1
посредством  вызова  процедуры Draw.  Процедура Draw сохраняет
содержимое основного экрана и состояние курсора,  вызывает оп-
ределенный пользователем метод открывания (который создает эф-
фект раскрывания окна),  очищает  окно  (поскольку  установлен
флаг  опции  wClear),  устанавливает оконные координаты модуля
OPCRT и стандартный текстовый атрибут, а также вызывает проце-
дуру  Draw  поля wFrame объекта W1 для изображения окантовки и
заголовка.  Кроме того, процедура Draw объекта RawWindow вызы-
вает  виртуальную процедуру UpdateContents,  которая на данном
уровне ничего не выполняет,  но играет очень важную  роль  для
производных  типов  объектов.  Процедура  UpdateContents  пре-
доставляет производному  объекту  возможность  заполнять  окно
(например, списком указаний или с текстом редактора).
     После вызова процедуры Draw в окно можно записывать текст
посредством вызова объектно-неориентированных процедур. В этом
случае применяются процедуры Write и WriteLn;  они  используют
связанный с окном видеоатрибут, при необходимости заворачивают
текст и прокручивают окно при его заполнении. Процедура GotoXY
также  работает с координатами,  относящимися к активной части
окна.
     Далее изображается  окно W2 и в него записывается некото-
рый текст.  При выполнении программы данного примера  заметно,
как при изображении окна W2 рамка окна W1 заменяется на подме-
няющую ее рамку. Вызов процедуры wFastText иллюстрирует важное
различие между операторами процедуры WriteLn и объектно-ориен-
тированными методами записи:  варианты  методов  ООП  отсекают
текст,  который  заставил  бы процедуру WriteLn заворачивать и
прокручивать его;  кроме того, варианты методов ООП могут осу-
ществлять запись в любом месте внутри окна,  независимо от по-
ложения курсора.
     Повторное обращение  к  процедуре Draw окна W1 делает его
снова текущим. Во время данного обращения процедура Draw опре-
деляет,  что окно W1 уже является активным и не сохраняет пов-
торно содержимое основного экрана, а также не вызывает еще раз
определенную пользователем процедуру открывания окна.
     Наконец, оба окна стираются и освобождаются соответствую-
щие  динамически распределяемые области памяти.  Следует отме-
тить,  что окно W2,  которое в это время не является  текущим,
стирается первым. Процедура Erase объекта RawWindow будет про-
изводить данное действие,  даже если окна W1 и  W2  перекрыва-
ются, но результат будет неправильным. Стирание текущего окна,
т.е.  окна W1, в реальной программе приведет к непредсказуемым
последствиям,  поскольку объект RawWindow на знает, какое сле-
дующее окно сделать текущим.


                        КОНСТАНТЫ

    wBordered        = $00000001; {Выделить пространство  для
                                   окантовки окна}
    wClear           = $00000002; {Очистить окно при его пер-
                                   воначальном изображении}
    wSaveContents    = $00000004; {Сохранить содержимое  окна
                                   при его стирании}
    wUserContents    = $00000008; {Пользователь будет восста-
                                   навливать  содержимое   по
                                   запросу}
    wSoundEffects    = $00000010; {Использовать  звуковые эф-
                                   фекты во время раскрываний
                                   окон}
    wAltFrame        = $00000020; {Использовать тип подменяю-
                                   щей рамки,  когда  окно не
                                   является текущим}
    wSetMouse        = $00000040; {Установить  окно  мыши,
                                   причем курсор мыши устано-
                                   вить  на  точку  входа   в
                                   окно}
    wFullMouseWindow = $00000080; {Выставить полное окно мыши на
                                   точку  входа  в   основной
                                   экран}
    wResizeabl       = $00000100; {Окно  может  изменяться  в
                                   размерах и в масштабе}
    wAllMouseEvents  = $00000200; {Нажатие   клавиш   мыши  в
                                   любом положении ее курсора
                                   (константы frOutsideFrame и
                                   frInsideFrame)    вызывает
                                   завершение      выполнения
                                   процедуры}
    wStoreContents   = $00000400; {Сохранить содержимое  окна
                                   в  абстрактных  последова-
                                   тельных файлах}

     Данные опции воздействуют на поведение объекта RawWindow.
Комбинации этих опций в побитовом представлении передаются ме-
тодам InitCustom, wOptionsOn, wOptionsOff и др.
     Опция wBordered  выбирает  окантованное  окно.  Как  было
описано в приведенном выше разделе "Координаты окна",  эта оп-
ция увеличивает размеры рамки окна на одну символьную  позицию
по всему ее периметру; при этом активная область окна остается
неизменной.
     Если установлена  опция  wClear,  то окно будет автомати-
чески очищаться при первоначальном его изображении.  Оно будет
также  очищаться  при  последующих  его изображениях,  если не
установлен флаг опции wSaveContents.
     Опция wSaveContents  заставляет конструктор окна выделить
дополнительный экранный буфер,  достаточный для размещения там
всего  содержимого окна,  находящегося внутри окантовки (но не
включая ее).  Процедура Erase для окна будет сохранять его со-
держимое  в  этом  буфере  перед  восстановлением  содержимого
основного экрана.  Последующие обращения к процедуре Draw объ-
екта RawWindow будут восстанавливать содержимое окна,  исполь-
зуя этот буфер.
     Опция UserContents  означает,  что объект в состоянии сам
восстанавливать свое содержимое.  Это обычно происходит в слу-
чаях, когда объект, полученный из объекта RawWindow, игнориру-
ет виртуальную процедуру UpdateContents.  Например,  окно Memo
восстанавливает  свое  содержимое из буфера текста памятки,  а
объект PickList восстанавливает его из списка  элементов  дан-
ных. Типы объектов системы Object Professional в соответствую-
щих случаях сами устанавливают этот  флаг.  Когда  установлена
опция  wUserContents,  то  установка опции wSaveContents также
является излишним расходованием области динамически  распреде-
ляемой памяти.
     Опция wSoundEffects позволяет создавать звуковые  эффекты
во  время  раскрывания окна.  Установление этого флага уместно
только при вызове процедуры EnableExplosions.
     Опция wAltFrame определяет, что окно будет управлять дву-
мя независимыми рамками: одной (обращение к которой происходит
как  к  wFrame) в том случае,  когда окно является текущим,  и
другой (aFrame), когда окно является активным, но не текущим.
     Опция wSetMouse  означает,  что  окно мыши,  положение ее
курсора и видимость курсора должны быть обновлены при  изобра-
жении окна.  В этом случае мышь будет ограничена в своем пере-
мещении внутри окна окантовкой рамки  окна  (включительно),  а
курсор мыши вновь займет положение,  которое он занимал на мо-
мент,  когда  окно  было  в  последний  раз   текущим.   Опция
wFullMouseWindow отменяет опцию wSetMouse: при изображении ок-
на она выставляет окно мыши на полный экран,  но  не  изменяет
видимость или положение курсора мыши.
     Опция wResizeable определяет,  может ли окно изменяться в
размерах или в масштабе.
     Опция wAllMouseEvents  воздействует  только  на  потомков
объекта CommandWindow.  Когда задана эта опция,  нажатие любой
комбинации клавиш  мыши  заставит  процедуру  Process  объекта
CommandWindow немедленно завершить работу, независимо от того,
в каком положении находился в данный момент курсор  мыши.  При
отсутствии этой опции процедура Process будет игнорировать все
нажатия клавиш мыши вне окна.
     Опция wStoreContents   определяет,  что  содержимое  окна
должно  быть  записано  в  абстрактный  последовательный  файл
вместе со спецификациями для данного окна. Это возможно только
при наличии установленного флага опции wSaveContents.

     DefWindowOptions : LongInt = wClear+wSaveContents+
                                  wResizeable+wStoreContents;
     
     Опции окна,  используемые по умолчанию,  для конструктора
Init.  Следует отметить,  что по умолчанию окна не имеют окан-
товки.

     DefCursor        : CursorType = cuNormal; {Тип курсора}

     Форма курсора, используемая по умолчанию при первоначаль-
ной инициализации окна.  За более полной  информацией  следует
обратиться  к  описанию типа CursorType в модуле OPCRT.  После
инициализации окна форму его курсора можно изменить, используя
процедуру SetCursor.

     DefBackChar      : Char = ` '; {Символ фона}

     Символ фона, используемый по умолчанию (при очищении окна
либо при его прокрутке). Используя процедуру SetBackChar, мож-
но изменить символ фона.

     CurrentWindow    : RawWindowPtr = nil;

     Указатель на  текущее окно.  Если окно не отображается на
экране,  то указатель равен нулю.  Всякий раз при  изображении
окна  его  адрес  сохраняется  в константе CurrentWindow.  При
уничтожении текущего окна (являющегося объектом  RawWindow)  в
константу CurrentWindow записывается нуль.  При стирании теку-
щего окна,  являющегося объектом StackWindow (или  его  потом-
ком), текущим окном становится следующее окно из стека.


                           ТИПЫ

     AbstractWindowPtr = ^AbstractWindow;
     AbstractWindow    =
       object(Root)
         ...
       end;

     Типы данных, определяющие наиболее абстрактный тип окна.

     RawWindowPtr      = ^RawWindow;
     RawWindowProc     = procedure(WPtr : RawWindowPtr);
     RawWindow         =        {Окно без стековой поддержки}
       object(AbstractWindow)
         ...
         wFrame        : Frame;
         aFrame        : Frame;
         ...
       end;

     Тип RawWindowProc является типом процедуры,  используемым
для определяемых пользователем подпрограмм открывания и закры-
вания окон .  Подпрограммы ExplodeOpenProc и ExplodeCloseProc,
которые производят специальные эффекты раскрывания окна, явля-
ются примерами подпрограмм, совместимых с данным типом. Проце-
дуре  типа RawWindowProc передан указатель на объект RawWindow
(или на его потомка) так, что она может обращаться к методам и
полям  данных  окна  в процессе выполнения операции открывания
или закрывания.
     Поля wFrame и aFrame являются двумя рамками, связанными с
каждым  объектом  RawWindow.  Они  показаны  здесь  полностью,
поскольку код,  который создает каждую рамку, часто обращается
к ним непосредственно. Такой подход представляет собой не луч-
ший пример чистого ООП,  но он является эффективным и удобным.
Объект RawWindow также предоставляет методы доступа к этим по-
лям;  для  получения подробной информации следует обратиться к
описанию функций MainFramePtr и AltFramePtr.
     Объект RawWindow,  кроме  того,  содержит  два экземпляра
объекта ScreenRect.  Эти поля используются для сохранения  об-
ласти экрана, закрываемой окном и, при необходимости, содержи-
мого самого окна.


     ActiveFramePtr
     --------------
     Объявление
     function ActiveFramePtr : AbstractFramePtr; virtual;

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

     Описание
     Если окно  является  текущим,  то  функция ActiveFramePtr
возвращает адрес экземпляра  поля  данных  wFrame.  Если  окно
изображено на экране, но не является текущим, или был установ-
лен флаг опции wAltFrame, то функция ActiveFramePtr возвращает
адрес поля aFrame. Если же флаг опции wAltFrame не установлен,
то данная функция вместо адреса поля aFrame  возвращает  адрес
поля  wFrame.  Если  окно не изображено на экране,  то функция
ActiveFramePtr возвращает нуль.
     Для обеспечения     максимальной     гибкости     функция
ActiveFramePtr возвращает указатель типа  AbstractFramePtr.  А
для того, чтобы результат был интерпретирован как указатель на
объект Frame,  он должен быть представлен в виде, показанном в
следующем примере.

     Пример

     var
       Win : RawWindow;
     ...
       Win.Draw;
       FramePtr(Win.ActiveFramePtr)^.ChangeHeaderAttr(0,
                                               $1B, $07);

     Изменяется видеоатрибут первого заголовка основной  рамки
окна Win. Представление типа FramePtr необходимо для обращения
к методам объекта Frame.

     См. также
     AltFramePtr                       MainFramePtr


     AdjustFrameCoords
     -----------------
     Объявление
     procedure AdjustFrameCoords(X1, Y1, X2, Y2 : Byte);

     Назначение
     Изменяет координаты  рамки  неактивного  окна.  Полностью
очищает существующее описание рамки.

     Описание
     Данная процедура используется в случае,  когда необходимо
создать зазор между активной частью окна и его окантовкой. Это
пространство может быть использовано для изображения  дополни-
тельных  непрокручивающихся заголовков при прокрутке активного
окна.  Хорошим примером этого является окно  календаря  в  де-
монстрационной программе DESKPOP:  дни месяца в активной части
окна управляются списком указаний,  а названия месяца  и  дней
недели, изображенные в пространстве между активным окном и его
окантовкой, являются фиксированными.
     Параметры процедуры  AdjustFrameCoords определяют коорди-
наты,  устанавливаемые для обоих полей - wFrame и aFrame. Если
установлен флаг опции wBordered,  то координаты окантовки окна
будут совпадать с данными координатами. Объект ScreenRect, ко-
торый хранит в буфере закрываемую окном область экрана,  пере-
распределяется для приведения его в соответствие с новыми  ко-
ординатами. Если установлен флаг опции wSaveContents, то буфер
содержимого экрана также перераспределяется для приведения его
в соответствие с областью,  находящейся внутри новой окантовки
окна (если таковая существует).
     Активные координаты  окна  процедурой AdjutFrameCoords не
изменяются.
     Любые заголовки,  тени,  зоны  прокрутки или активные об-
ласти, связанные либо с полем wFrame, либо с полем aFrame, те-
ряются после вызова данной процедуры.  Однако, цвета и символы
окантовки, связанные с каждой рамкой, сохраняются. Лучше всего
вызывать  процедуру  AdjustFrameCoords  непосредственно  после
инициализации окна.
     На момент  вызова процедуры AdjustFrameCoords окно должно
быть неактивным (т.е.  инициализированным,  но не изображаемым
на экране). В противном случае процедура AdjustFrameCoords не-
медленно   прекратит    свою    работу    с    кодом    ошибки
epNonFatal+ecWinNotActive.  Если определяемые координаты явля-
ются некорректными (меньше одной позиции  или  больше  размера
экрана),  то  генерируется  код  ошибки epFatal+ecWinCoordsBad
(окно после этого не может быть использовано). При недостаточ-
ном объеме памяти,  доступной для размещения экранных буферов,
возвращается код ошибки epFatal+ecOutOfMemory.

     Пример

     Win.Init(30, 5, 50, 15);
     Win.wOptionsOn(wBordered);
     Win.AdjustFrameCoords(29, 3, 51, 17);
     Win.wFrame.AddHeader(`Standard Header', heTC);
     Win.Draw;
     Win.fFastCenter(`Fixed Top Heading', 1, TextAttr);
     Win.fFastCenter(`Fixed Bottom Hdr', 13, TextAttr);
     {...Используется окно...}
     Win.Done;

     Верхняя и нижняя полосы окантовки  раздвигаются  на  одну
строку (без изменения размеров активного окна).  Для написания
фиксированных заголовков в этом пространстве используются  от-
носящиеся к рамке процедуры записи (fFastXxx).

     Win.Init(30, 5, 50, 15);
     Win.wFrame.AddHeader(`Standard Header', heTC);
     Win.wFrame.AddShadow(shBR, shOverWrite);
     Win.AdjustFrameCoords(27, 3, 53, 17);
     ...

     Неправильно! Все свойства рамки теряются при корректиров-
ке ее координат. Всегда необходимо назначать сначала координа-
ты рамки, а затем добавлять ее свойства.

     См. также
     AdjustWindow                      DeltaAdjustFrame


     AdjutWindow
     -----------
     Объявление
     {$IFDEF UseAdjutableWindows}
     procedure AdjustWindow(X1, Y1, X2, Y2 : Word); virtual;

     Назначение
     Устанавливает новые координаты окна  и  корректирует  все
связанные с ним структуры.

     Описание
     С помощью данной процедуры изменяется размер или  положе-
ние окна (либо и то,  и другое). Она работает или с неактивным
окном, или с текущим. Назначаемые координаты определяют актив-
ную прямоугольную область окна. Процедура AdjustWindow автома-
тически корректирует положение окантовок,  заголовков,  теней,
зон  прокрутки  и активных областей в соответствии с правилами
применения каждой структуры.
     Когда процедура AdjustWindow применяется к текущему окну,
она, кроме того, обновляет экран во время ее вызова. Процедура
AdjustWindow  размещает в памяти временный виртуальный экран и
обновление производит на этом экране во избежание эффекта  ми-
гания. Следует отметить, что для виртуального экрана необходим
временный блок динамически распределяемой  памяти  размером  в
2*ScreenWidth*ScreenHeight байт. Для того, чтобы сохранить со-
держимое окна во время  изменения  его  размеров,  необходимо,
чтобы  был  установлен  флаг  опции wSaveContents,  либо нужно
воспользоваться виртуальной процедурой UpdateContents для  то-
го,  чтобы  вновь заполнить окно после изменения его размеров.
Окна  более  высокого  уровня  системы   Object   Professional
(PickList, EntryScreen и другие) предоставляют соответствующие
процедуры UpdateContents.
     Если окно  изображено на экране,  но не является текущим,
то  процедура  AdjustWindow  генерирует  сообщение  об  ошибке
epNonFatal+ecWinNotCurrent  и немедленно прекращает свою рабо-
ту.  Если определяемые процедурой координаты  некорректны,  то
она  генерирует сообщение об ошибке epNonFatal+ecWinCoordsBad.
Если же динамически распределяемой области памяти недостаточно
для перераспределения различных динамических структур, то дан-
ная процедура генерирует сообщение epFatal+ecOutOfMemory.
     Процедуры ResizeWindow, MoveWindow и функции Zoom, Unzoom
генерируют обращения к процедуре AdjustWindow.

     Пример

     var
       Xlo, Ylo, Xhi, Yhi : Byte;
     begin
       Win.Init(30, 5, 50, 15);
       Win.wOptionsOn(wBordered);
       Win.wFrame.AddScrollBar(frRR, 0, 100, DefaultColorSet);
       Win.Draw;
       Win.wFastText(`Sample Text', 1, 1);
       {...Используется окно...}
       Win.Coordinates(Xlo, Ylo, Xhi, Yhi);
       Win.AdjustWindow(Xlo-10, Ylo+5, Xhi+10, Yhi+5);
       Result := Win.GetLastError;
       if Result <> 0 then
         WriteLn(`Failed to adjust window, Result = ', Result)
       else
         {...Продолжает работу с окном...};
     end.

     Процедура Coordinates объекта Win возвращает активные ко-
ординаты  окна,  а  процедура AdjustWindow устанавливает новые
координаты, для того чтобы сделать окно на 20 символьных пози-
ций шире и на 10 выше.

     См. также
     MoveWindow                        Unzoom
     ResizeWindow                      Zoom



     AltFramePtr
     -----------
     Объявление
     function AltFramePtr : AbstractFramePtr; virtual;

     Назначение
     Возвращает указатель  на  рамку,  используемую  в случае,
когда окно является активным, но не текущим.

     Описание
     Функция AltFramePtr  возвращает  адрес поля данных aFrame
объекта RawWindow.  Эта рамка используется только при установ-
ленном флаге опции wAltFrame.
     Для извлечения в дальнейшем максимальной пользы  из  ООП,
рекомендуется   применять   функцию   AltFramePtr  вместо  не-
посредственной ссылки на поле aFrame. Однако в настоящее время
ссылка  на  поле aFrame дает тот же результат и является более
эффективной.
     Поскольку функция  AltFramePtr  возвращает указатель типа
AbstractFramePtr,  то она должна быть представлена в виде, по-
казанном в следующем примере.

     Пример

     FramePtr(Win.AltFramePtr)^.AddHeader(`Standard   Header',
                                          heTC);

     Добавляется заголовок для подменяющей рамки объекта  Win.
Заголовок будет расположен в центре верхней стороны рамки (па-
раметр heTC).  При отсутствии многообразия  форм  поля  данных
aFrame, этот оператор эквивалентен оператору

     Win.aFrame.AddHeader(`Standard Header', heTC);

     См. также
     MainFramePtr


     ChangeAllScrollBars
     -------------------
     Объявление
     {$IFDEF UseScrollBars}
     procedure ChangeAllScrollBars(MinHoriz, MaxHoriz
                                                   : LongInt;
                                  MinVert, MaxVert : LongInt);
                                  virtual;

     Назначение
     Изменяет пользовательские   диапазоны   существующих  зон
прокрутки.

     Описание
     Эта процедура  изменяет  все  зоны прокрутки как основной
рамки,  так и подменяющей (если она есть).  (При этом делается
допущение,  что  основная  и  подменяющая  рамки содержат зоны
прокрутки одинакового размера, если они вообще их имеют). Зоны
на  левой  и  на  правой сторонах рамки получают новые границы
MinVert и MaxVert,  а зоны на верхней и нижней сторонах - гра-
ницы MinHoriz и MaxHoriz. Не следует использовать эту процеду-
ру,  если независимые зоны прокрутки расположены на противопо-
ложных  сторонах  рамки.  Вместо данной процедуры используется
процедура ChangeScrollBar,  которая обновляет определенную от-
дельную зону прокрутки.
     Если окно     является     текущим,     то      процедура
ChangeAllScrollBars стирает каждый связанный с ним слайдер.  В
противном случае,  данная процедура  устанавливает  внутренний
флаг,  указывающий на то,  что пользовательская величина, свя-
занная со слайдером, больше не действует. Слайдеры можно снова
инициализировать    и    изобразить    посредством   процедуры
DrawAllSliders.
     Если в    окне    нет   зон   прокрутки,   то   процедура
ChangeAllScrollBars никаких действий не выполняет.

     Пример

     Win.Init(30, 5, 50, 15);
     Win.wOptionsOn(wBordered);
     Win.wFrame.AddScrollBar(frRR, 0, 100, DefaultColorSet);
     Win.aFrame.AddScrollBar(frBB, 0, 100, DefaultColorSet);
     Win.Draw;
     {...Используется окно...}
     Win.ChangeAllScrollBars(-100, 100, -100, 100);
     Win.DrawAllSliders(0, 0);
     {...Продолжает работу с окном...}

     Вначале определяются горизонтальная и  вертикальная  зоны
прокрутки с диапазонами от 0 до 100. Затем эти диапазоны изме-
няются на диапазоны от -100 до 100.  Старые слайдеры автомати-
чески  стираются,  а затем процедура DrawAllSliders изображает
новые слайдеры.

     См. также
     ActiveFramePtr                    DrawAllSliders
     ChangeScrollBar


     ChangeHeader
     ------------
     Объявление
     procedure ChangeHeader(Index : Byte; S : string);

     Назначение
     Изменяет строку заголовка и,  если окно является текущим,
обновляет экран.

     Описание
     Процедура ChangeHeader   модифицирует   заголовки  только
основной рамки (wFrame).  Для того, чтобы модифицировать заго-
ловок  на подменяющей рамке (aFrame),  необходимо использовать
процедуру ChangeHeaderString объекта Frame.
     Параметр Index  является  последовательным  номером  (ин-
дексом) заголовка, подлежащего изменению. Заголовок, добавлен-
ный к рамке первым, имеет последовательный номер 0, второй за-
головок - 1 и т.д.  Обычно индекс отдельного заголовка при его
добавлении    к    рамке   сохраняется   посредством   функции
GetLastHeaderIndex объекта Frame .  Параметр S является  новой
строкой заголовка.
     Если во время вызова данной процедуры  окно  не  является
текущим,  то измененный заголовок не появится до тех пор, пока
окно не станет текущим (посредством вызова процедуры Draw  или
обращения к процедуре Select объекта StackWindow).
     Процедура ChangeHeader может возвращать те же самые  коды
ошибок, что и процедура ChangeHaederString объекта Frame.

     Пример

     Win.Init(30, 5, 50, 15);
     Win.wOptionsOn(wBordered);
     Win.wFrame.AddHeader(`Standard Header',heTC);
     Win.wFrame.AddHeader(`Bottom Header',heBC);
     Win.Draw;
     {...Используется окно...}
     Win.ChangeHeader(1, `New Bottom Header');
     {...Продолжает работу с окном...}

     Когда окно является текущим,  заголовок  `Bottom  Header'
заменяется на `New Bottom Header', и экран обновляется для то-
го, чтобы показать произведенное изменение.

     Win.Init(30, 5, 50, 15);
     Win.wOptionsOn(wBordered);
     Win.aFrame.AddHeader(`Standard Header',heTC);
     Win.Draw;
     {...Используется окно...}
     Win.ChangeHeader(0, `New Header');
     ...

     Неправильно! Данное окно содержит  назначенные  заголовки
только  для  подменяющей рамки aFrame.  Процедура ChangeHeader
воздействует только на заголовки основной рамки wFrame.  Функ-
ция  GetLastError  объекта  Win  возвратит сообщение об ошибке
epNonFatal+ecWinBadIndex.

     См. также
     Frame.ChangeHeaderString


     ChangeScrollBar
     ---------------
     Объявление
     {$IFDEF UseScrollBars}
     procedure ChangeScrollBar(Posn : FrameEdgeType;
                               MinUser, MaxUser : LongInt);

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

     Описание
     Эта процедура изменяет зону прокрутки на указанной в  па-
раметре  Posn  стороне как основной,  так и подменяющей рамки.
(При этом делается допущение, что основная и подменяющая рамки
содержат  зоны прокрутки одинакового размера,  если они вообще
их имеют). Для зоны прокрутки назначаются новые максимальная и
минимальная  границы,  а также стирается связанный с ней слай-
дер,  если окно является текущим.  В противном случае,  данная
процедура  устанавливает  внутренний флаг,  указывающий на то,
что пользовательская величина,  связанная со слайдером, больше
не действует. Слайдер может быть снова инициализирован и изоб-
ражен посредством вызова процедуры DrawSlider.
     Если в  окне  на заданной стороне нет зоны прокрутки,  то
процедура ChandeScrollBar никаких действий не выполняет.

     Пример

     Win.Init(30, 5, 50, 15);
     Win.wOptionsOn(wBordered);
     Win.wFrame.AddScrollBar(frRR, 0, 100, DefaultColorSet);
     Win.Draw;
     {...Используется окно...}
     Win.ChangeScrollBars(frRR, -100, 100);
     Win.DrawSlider(frRR, 0);
     {...Продолжает работу с окном...}

     Изменяется диапазон зоны прокрутки с первоначального диа-
пазона от 0 до 100 на новый диапазон от -100 до  100.  Текущий
слайдер автоматически стирается,  а затем процедура DrawSlider
изображает новый слайдер.

     См. также
     ChangeAllScrollBars               DrawSlider


     Clear
     -----
     Объявление
     procedure Clear; virtual:

     Назначение
     Очищает активную область окна с  использованием  констант
wTextXxx и wBackChar.

     Описание
     Для заполнения  активной   прямоугольной   области   окна
используется  символ  wBackChar  и видеоатрибут wTextColor или
wTextMono (в зависимости от видеорежима).  Кроме того,  курсор
перемещается в левый верхний угол окна.
     Во время вызова процедуры Clear окно должно быть текущим,
в  противном  случае процедура будет генерировать сообщение об
ошибке (epNonFatal+ecWinNotCurrent).
     По умолчанию символ wBackChar является символом пробела и
данная процедура работает подобно процедуре  ClrScr  в  модуле
OPCRT. Для выбора другого символа фона необходимо использовать
процедуру SetBackChar.

     Пример

     Win.SetBackChar($178);
     Win.Clear;

     Очищается активное  окно  объекта  Win  с  использованием
"основного" заполняющего символа фона,  а курсор  устанавлива-
ется в исходное положение.

     См. также
     ClearContents                     SetBackChar


     ClearContents
     -------------
     Объявление
     procedure ClearContents;

     Назначение
     Очищает область  внутри  рамки  с использованием констант
wTextXxx и wBackChar.

     Описание
     Данная процедура  работает  подобно  процедуре Clear,  за
исключением того,  что очищаемый прямоугольник является  самой
большой  областью,  которую  можно разместить внутри окантовки
окна. Эта прямоугольная область отличается от активной прямоу-
гольной  области окна только в случае,  если была использована
процедура AdjustFrameCoords.
     Как и процедура Clear, процедура ClearContents перемещает
курсор в левый верхний угол активной прямоугольной области ок-
на.

     Пример

     Win.Init(30, 5, 50, 15);
     Win.wOptionsOn(wBordered);
     Win.AdjustFrameCoords(25, 3, 55, 17);
     Win.Draw;
     Win.ClearContents;

     Очищается прямоугольник (26,  4, 54, 16) и курсор переме-
щается в положение с абсолютными (X,Y) координатами  (30,  5).
Процедура Clear объекта Win очистила бы прямоугольник (30,  5,
50, 15) и переместила бы курсор в то же самое положение.

     См. также
     Clear


     ClearErrors
     -----------
     Объявление
     procedure ClearErrors;

     Назначение
     Сбрасывает все необработанные ошибки.

     Описание
     Данная процедура     вызывает     виртуальную     функцию
GetLastError до тех пор, пока она не возвратит нуль. Это явля-
ется особенно полезным при работе с объектами,  полученными из
объекта AbstractWindow, поскольку некоторые из них накапливают
ошибки от нескольких источников:  это прежде всего относится к
объектам типа Frame и ScreenRect, объекту RawWindow и к объек-
ту CommandWindow.
     На самом деле процедура ClearErrors реализована в объекте
AbstractWindow.

     Пример

     Win.ClearErrors;

     Сбрасывает все необработанные коды ошибок для объекта Win
и его оконных компонентов.

     См. также
     GetLastError


     Coordinates
     -----------
     Объявление
     procedure Coordinates(var X1, Y1, X2, Y2 :Byte);

     Назначение
     Возвращает активные координаты окна.

     Описание
     Возвращаемые величины  являются абсолютными экранными ко-
ординатами активной прямоугольной области окна.  Они  являются
теми же величинами,  что и величины, передаваемые конструктору
окна; они, кроме того, будут сопровождать обращения к процеду-
рам AdjustWindow, ResizeWindow, MoveWindow и к функциям Zoom и
Unzoom.

     Пример

     var Xlo, Ylo, Xhi, Yhi : Byte;
     ...
     Win.Coordinates(Xlo, Ylo, Xhi, Yhi);

     Возвращает абсолютные экранные координаты активной прямо-
угольной области окна объекта Win.

     См. также
     Extent                            Frame.WithinFrameCoords


     CursorInWindow
     --------------
     Объявление
     function CursorInWindow : Boolean;

     Назначение
     Возвращает значение True,  если курсор находится в данный
момент внутри активного окна.

     Описание
     Данная функция вызывает метод WhereXYAbs модуля OPCRT для
считывания текущего положения курсора,  затем вызывает функцию
InWindow  для  определения факта попадания данного положения в
активную прямоугольную область окна.

     Пример

     Win.Init(30, 5, 50, 15);
     Win.Draw;
     {...Используется окно...}
        WriteLn(`in window')
     else
        WriteLn(`not in window');

     Сообщается о том, находится ли  курсор в текущем окне.

     См. также
     InWindow                          WhereXYAbs(OPCRT)


     DeltaAdjustFrame
     ----------------
     Объявление
     procedure DeltaAdjustFrame(dX1, dY1, dX2, dY2 : Integer);

     Назначение
     Изменяет координаты рамки неактивного окна. Перераспреде-
ляет буфер wCovers, не производя более никаких изменений.

     Описание
     Существующие координаты  рамки  корректируются  с помощью
определенных относительных величин:  нижняя граница  рамки  по
оси  Х  - величиной dX1,  верхняя граница по оси Х - величиной
dX2 и т.д. Внутренним координатам рамки (как рамки wFrame, так
и   рамки   aFrame)  присваиваются  новые  значения  и  объект
ScreenRect,  который сохраняет закрываемую окном область экра-
на,  перераспределяется. Никакие другие свойства рамки - поло-
жения заголовков, размеры зон прокрутки, тени - не корректиру-
ются.
     Окно не должно быть изображено  на  экране.  В  противном
случае,  процедура  DeltaAdjustFrame  генерирует  сообщение об
ошибке (epNonFatal+ecWinIsActive) и немедленно прекращает свою
работу.  Другие возможные ошибки: (epNonFatal+ecWinCoorsBad) и
(epFatal+ecOutOfMemory).
     Данная процедура  предоставляет  добавочный  блок низкого
уровня,  который полезен для разработки администратора "окна с
форточками"  (подобно  окнам,  используемым  отладчиком  Turbo
Debugger).  Этот тип администратора окна размещает без наложе-
ния  неокантованные  форточки  в  охватывающем их окантованном
прямоугольнике,  который,  кроме того,  управляет нерегулярной
рамкой, разделяющей форточки. Если подобные расширения не про-
изводятся, то процедура DeltaAdjustFrame вряд ли понадобится.

     См.также
     AdjustFrameCoords                 AdjustWindow


     Done
     ----
     Объявление
     destructor Done; virtual;

     Назначение
     Уничтожает окно.

     Описание
     Если во  время обращения к деструктору Done окно является
активным,  то оно стирается первым.  Затем  освобождаются  все
связанные с окном буферы и компоненты рамки.

     Пример

     Win.Done;

     Освобождает все компоненты объекта Win.

     См. также
     Erase


     Draw
     ----
     Объявление
     procedure Draw; virtual;

     Назначение
     Рисует или обновляет окно.

     Описание
     Поведение процедуры Draw зависит от того, является ли ок-
но уже активным на момент ее вызова.  Если окно является неак-
тивным,  то процедура Draw последовательно выполняет следующие
действия:

     - сохраняет в памяти текущее положение курсора и его фор-
         му;
     - сохраняет оконные координаты модуля OPCRT  и  текстовый
         атрибут, используемый по умолчанию;
     - сохраняет координаты  окна  мыши, положение ее  курсора
         и его видимость, если установлены опции wSetMouse или
         wFullMouseWindow;
     - отменяет текущее окно,  если оно было.  Данное действие
         включает в себя:  сохранение положения курсора  этого
         окна;  обновление содержимого его буфера, если задана
         опция wSaveContents и изображение  подменяющей  рамки
         этого окна, если установлен флаг опции wAltFrame;
     - устанавливает новые оконные координаты модуля  OPCRT  и
         текстовый атрибут, используемый по умолчанию;
     - устанавливает    указатель    глобальной     переменной
         CurrentWindow на окно (посредством вызова виртуальной
         процедуры MarkCurrent);
     - размещает курсор;
     - сохраняет область основного экрана;
     - отмечает активность окна;
     - вызывает процедуру открывания окна;
     - восстанавливает предыдущее содержимое  окна,  если  оно
         имелось, или очищает окно, если задана опция wClear;
     - вызывает процедуру Draw основной рамки (wFrame);
     - если задана опция wUserContents,  то вызывает виртуаль-
         ную процедуру UpdateContents;
     - устанавливает    окно   мыши,   если   включена   опция
         wFullMouseWindow, или устанавливает окно мыши,  поло-
         жение ее курсора и видимость мыши,  если задана опция
         wSetMouse.

     Если окно уже является активным, но не текущим, то проце-
дура Draw выполняет только следующие действия:

     - отменяет текущее окно,  если оно было.  Данное действие
         включает в себя:  сохранение положения курсора  этого
         окна;  обновление содержимого его буфера, если задана
         опция wSaveContents и изображение  подменяющей  рамки
         этого окна, если установлен флаг опции wAltFrame;
     - устанавливает новые оконные координаты модуля  OPCRT  и
         текстовый атрибут, используемый по умолчанию;
     - устанавливает    указатель    глобальной     переменной
         CurrentWindow на окно (посредством вызова виртуальной
         процедуры  MarkCurrent);
     - размещает курсор;
     - при установленном флаге опции wAltFrame,  стирает  тени
         подменяющей рамки (если они есть);
     - если задана опция wUserContents,  то вызывает виртуаль-
         ную процедуру UpdateContents;
     - устанавливает    окно   мыши,   если   включена   опция
         wFullMouseWindow, или устанавливает окно мыши,  поло-
         жение ее курсора и видимость мыши,  если задана опция
         wSetMouse.

     Иными словами,  процедура Draw делает окно видимым на эк-
ране,  размещает курсор и устанавливает оконные координаты мо-
дуля OPCRT так, что в окне будут появляться операторы процеду-
ры Write.

     Пример

     Win.Init(30, 5, 50, 15);
     Win.wOptionsOn(wBordered);
     Win.Draw;
     WriteLn(`In upper left corner of window');
     Win.Done;

     Изображается небольшое окантованное  окно,  в  его  левый
верхний угол записывается некоторый текст, а затем окно стира-
ется.

     См. также
     Erase                             StackWindow.Draw


     DrawAllSliders
     --------------
     Объявление
     {$IFDEF UseScrollBars}
     procedure DrawAllSliders(HorizVal, VertVal : LongInt);
                                        virtual;

     Назначение
     Рисует или обновляет все слайдеры.

     Описание
     Эта процедура  вновь  рисует все слайдеры основной рамки,
если окно является текущим;  в противном случае она  обновляет
их значения.  Значения слайдеров подменяющей рамки обновляются
только при установленном флаге опции wAltFrame.  (При этом де-
лается  допущение,  что  основная и подменяющая рамки содержат
зоны прокрутки одинакового размера, если они вообще их имеют).
Если  произведенные изменения не были изображены сразу же,  то
они будут показаны при последующем изображении рамки.
     Параметр HorizVal  определяет  пользовательскую  величину
для горизонтальных зон прокрутки как на верхней, так и на ниж-
ней  сторонах  рамки.  Параметр  VertVal  определяет пользова-
тельскую величину для зон прокрутки на левой и правой сторонах
рамки. Если назначаемые величины совпадают с уже существующими
величинами, то никаких действий не производится.
     Не следует использовать данную процедуру,  если независи-
мые зоны прокрутки  расположены  на  противоположных  сторонах
рамки.  Вместо нее используется процедура DrawSlider,  которая
обновляет определенную отдельную зону прокрутки.
     Если в    окне    нет   зон   прокрутки,   то   процедура
DrawAllSliders никаких действий не выполняет.

     Пример

     Win.ChangeScrollBars(-100, 100, -100, 100);
     Win.DrawAllSliders(0,0);

     Изменяется диапазон  горизонтальных  и  вертикальных  зон
прокрутки на диапазон от -100 до 100,  затем изображаются  все
слайдеры.  Слайдеры  будут  находиться  в центре каждой из зон
прокрутки.

     См. также
     ChangeAllScrollBars               DrawSlider


     DrawSlider
     ----------
     Объявление
     {$IFDEF UseScrollBars}
     procedure DrawSlider(Posn : FrameEdgeType;
                          UserVal : LongInt);

     Назначение
     Рисует или обновляет слайдер.

     Описание
     Эта процедура вновь рисует слайдер на определенной сторо-
не основной рамки,  если окно является  текущим;  в  противном
случае она обновляет значение слайдера. Значение слайдера под-
меняющей рамки обновляется только при установленном флаге  оп-
ции  wAltFrame.  (При этом делается допущение,  что основная и
подменяющая рамки содержат зоны прокрутки одинакового размера,
если они вообще их имеют). Если произведенные изменения не бы-
ли изображены сразу же,  то они будут показаны при последующем
изображении рамки.
     Если слайдер уже изображен и назначаемый параметр UserVal
совпадает с предыдущей величиной,  то никаких действий не про-
изводится.
     Если в  окне  нет зоны прокрутки на заданной стороне,  то
процедура DrawSlider никаких действий не выполняет.

     Пример

     SliderPos := 1;
     Finished := False;
     repeat
       {...Ждет нажатия клавиш мыши...}
       Win.EvaluateMousePos;
       UserValue := Win.PosResults(FramePos, HotCode);
       case FramePos of
         frOutsideFrame : {Мышь находится с внешней стороны
                           рамки};
         frInsideFctive : {Мышь находится внутри окна};
       else
         case HotCode of
           hsDecV :  begin {Мышь находится на указателе убыва-
                            ния зоны прокрутки}
                      if SliderPos > 1 then
                        Dec(SliderPos);
                      Win.DrawSlider(frRR, SliderPos);
                    end;
           hsIncV : begin {Мышь находится на указателе
                           возрастания зоны прокрутки}
                      if SliderPos < 100 then
                        Inc(SliderPos);
                      Win.DrawSlider(frRR, SliderPos);
                    end;
         end;
       end;
     until Finished;

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


     EnableAlternateOpen
     -------------------
     Объявление
     procedure EnableAlternateOpen(OpenProc,
                                   CloseProc : RawWindowProc;
                                   StageDelay : Word);

     Назначение
     Предоставляет возможность   использовния    нестандартных
подпрограмм рисования и стирания окна.

     Описание
     Процедура EnableAlternateOpen   назначает    определенные
пользователем процедуры,  которые должны вызываться при откры-
вании и закрывании окна.  Модуль OPWINDOW определяет две таких
процедуры,   которые   создают   эффект   раскрывания  окна  -
ExplodeOpenProc и ExplodeCloseProc - а также третью процедуру,
которая  не  выполняет  никаких действий - EmptyOpenCloseProc.
Пользователь может  определять  дополнительные  процедуры  для
создания других специальных эффектов.
     Процедуры, передаваемые в качестве  параметров  в  данную
подпрограмму должны быть глобальными по области действия, объ-
явленными с использованием модели FAR,  а также  должны  соот-
ветствовать  типу RawWindowProc.  Эти процедуры не могут вызы-
вать подпрограммы Draw и Erase объекта RawWindow;  обращение к
ним  приведет к неуправляемой рекурсии и фатальному сбою прог-
раммы.  Вместо этих подпрограмм следует вызвать более  простые
подпрограммы объекта Frame или модуля OPCRT. Подпрограммам пе-
редается указатель на объект RawWindow, подлежащий изображению
или стиранию, который они могут использовать для получения не-
обходимой информации об окне. В качестве примера можно посмот-
реть процедуру ExplodeOpenProc в файле OPWINDOW.IN1.
     Параметр StageDelay     интерпретируется      процедурами
ExplodeOpenProc  и  ExplodeCloseProc как время задержки в мил-
лисекундах между стадиями раскрывания.  Данная величина, пере-
даваемая  процедуре  EnableAlternateOpen,  сохраняется  в поле
wStageDelay окна.
     Наиболее частым          использованием         процедуры
EnableAlternateOpen является создание раскрывающихся окон, ко-
торые  закрываются нормальным образом,  а не всплывающих окон.
Представленный ниже второй пример иллюстрирует такой случай.
     Если используются   нестандартные  подпрограммы  открыва-
ния/закрывания, а объект окна должен быть сохранен в абстракт-
ном последовательном файле, то необходимо зарегистрировать оп-
ределенные пользователем процедуры  с  помощью  администратора
абстрактного  последовательного файла.  Для этих целей следует
использовать    коды    указателей     ptExplodeOpenProc     и
ptExplodeCloseProc.  В  качестве  специального  примера  можно
посмотреть    процедуру    ExplodingWindowStream    в    файле
OPWINDOW.IN1.

     Примеры

     uses
       OpCrt, OpFrame, OpWindow;
     var
       Win : RawWindow;

       {$F+}
       procedure MyOpenProc(WPtr : RawWindowPtr);
         {-на экране последовательно изображаются несколько
           рисунков фона}
       const
         FillChar : array[1..4] of char = (#178, #177,
                                           #176, ` ');
       var
         I : Byte;
       begin
         with WPtr^ do begin
           wFrame.DrawBorder;
           for I := 1 to 4 do begin
             ClearWindow(wXL, wYL, wXH, wYH, FillChar[I],
                         TextAttr);
             Delay(wStageDelay);
           end;
         end;
       end;

       procedure MyCloseProc(WPtr : RawWindowPtr);
         {-на экране последовательно изображаются несколько
           рисунков фона}
       const
         FillChar : array[1..4] of char = (#178, #177,
                                           #176, ` ');
       var
         I : Byte;
       begin
         with WPtr^ do begin
           for I := 4 downto 1 do begin
             ClearWindow(wXL, wYL, wXH, wYH, FillChar[I],
                         TextAttr);
             Delay(wStageDelay);
           end;
         end;
       end;
       {$F-}

     begin
       Win.InitCustom(30, 5, 50, 15, DefaultColorSet,
                      DefWindowOptions or wBordered);
       Win.EnableAlternateOpen(MyOpenProc, MyCloseProc, 100);
       Win.Draw;
       Delay(1000);
       Win.Erase;
     end.

     Для создания специального эффекта  используются  заказные
процедуры открывания/закрывания окна. Эти процедуры в процессе
открывания и закрывания окон  просто  изображают  изменяющийся
фон.

     Win.EnableAlternateOpen(ExplodeOpenProc,
                             EmptyOpenCloseProc, 25);

     Задается раскрывающееся  окно,  закрывающееся  нормальным
образом.

     См.также
     Draw                              EnableExplosions



     EnableExplosions
     ----------------
     Объявление
     procedure EnableExplosions(StageDelay : Word);

     Назначение
     Создает раскрывающиеся окна с задержкой на каждой стадии,
определяемой параметром StageDelay, в миллисекундах.

     Описание
     Эта процедура   назначает   процедуры  ExplodeOpenProc  и
ExplodeCloseProc в качестве соответствующих переменных в  объ-
екте  RawWindow.  Параметр StageDelay также сохраняется в поле
данных для того,  чтобы две эти процедуры могли  обращаться  к
нему в процессе раскрывания или закрывания окна.
     Алгоритм, использующийся для достижения эффекта раскрыва-
ния окна, легче показать на практическом примере, чем описать.
Достаточно сказать,  что изображается серия рамок,  начиная  с
прямоугольника минимальных размеров, который плавно увеличива-
ется до размеров основной рамки. Если имеется буфер содержимо-
го окна и он инициализирован, то это содержимое восстанавлива-
ется на каждой стадии раскрывания окна.  После  каждой  стадии
раскрывания  генерируется  задержка  StageDelay,  составляющая
несколько миллисекунд. Окончательные элементы рамки - заголов-
ки,  тени  и др.  не изображаются,  пока не завершится процесс
раскрывания окна.  Обратный процесс выполняется в том  случае,
когда окно закрывается.
     Раскрывание окна будет сопровождаться звуковыми  эффекта-
ми, если установлен флаг опции окна wSoundEffects.
     Если создана возможность раскрывания окна,  и объект окна
должен  быть  записан в абстрактный последовательный файл,  то
процедуры, связанные с раскрыванием окна, необходимо зарегист-
рировать  с помощью администратора абстрактного последователь-
ного файла.  Для этого процедуру  ExplodingWindowStream  нужно
передать   в   качестве  параметра  в  процедуру  RegisterHier
абстрактного последовательного файла:
     S.RegisterHier(ExplodingWindowStream);

     Пример
     
     Win.InitCustom(30, 5, 50, 15, DefaultColorSet,
                    DefWindowOptions or wBordered);
     Win.EnableExplosions(20);
     Win.Draw;

     Создается раскрывающееся окно с задержкой 20  миллисекунд
между стадиями раскрывания.

     См.также
     EnableAlternateOpen          IdStream.RegisterHier

     EnableNormalOpen
     ----------------
     Объявление
     procedure EnableNormalOpen;

     Назначение
     Блокирует раскрывающиеся окна или нестандартные  подпрог-
раммы изображения.

     Описание
     Устанавливает указатели процедуры объекта  RawWindow  об-
ратно на процедуру EmptyOpenCloseProc,  блокируя тем самым все
специальные эффекты.

     Пример

     Win.EnableExplosions(20);
     Win.Draw;
     {... Используется окно ...}
     Win.Erase;
     Win.EnableNormalOpen;
     Win.Draw;
     {...Окно используется снова...}

     Сначала это окно предусматривало использование раскрываю-
щихся окон. Затем признак раскрывающегося окна был исключен.

     См.также
     EnableAlternateOpen

     Erase
     -----
     Объявление
     procedure Erase; virtual;

     Назначение
     Стирает окно.

     Описание
     Если на время вызова окно не является активным, то проце-
дура Erase не производит никаких действий.  В противном случае
эта процедура выполняет следующие действия:
     - сохраняет положение и форму текущего курсора;
     - если  установлена  опция wSetMouse,  то сохраняет окно,
         положение и видимость курсора мыши;
     - сохраняет   содержимое  окна,  если  установлена  опция
         wSaveContents;
     - стирает тени вокруг окна, если они имеются;
     - вызывает процедуру закрывания окна;
     - восстанавливает основной экран;
     - отмечает окно как неактивное;
     - устанавливает   указатель   на   глобальную  переменную
       CurrentWindow в нуль, если эта переменная стирается;
     - восстанавливает окно, положение и видимость курсора мы-
       ши,    если    установлены    опции    wSetMouse    или
       wFullMouseWindow;
     - восстанавливает положение и форму курсора.
     Иными словами,   процедура  Erase  восстанавливает  такое
состояние экрана, которое было до изображения окна.
     Следует отметить,  что  процедура  Erase не удаляет окно.
Динамически распределяемая область памяти остается  выделенной
для  различных  структур  данных этого окна.  Окно легко может
быть отображено снова при помощи вызова процедуры Draw.

     Пример

     Win.Draw;
     {...Используется окно ...}
     Win.Erase;

     Стирает окно после его использования. Окно продолжает су-
ществовать и позже может быть снова изображено.

     См.также
     Done               Draw

     EraseSlider
     -----------
     Объявление
     {$IFDEF UseScrollBars}
     procedure EraseSlider(Posn : FrameEdgeType);

     Назначение
     Стирает слайдер.

     Описание
     Эта процедура стирает  слайдер  на  определенной  стороне
основной рамки, если окно является текущим, а в противном слу-
чае отмечает его как невидимый. Флаг слайдера подменяющей рам-
ки  также  обновляется,  если установлен флаг опции wAltFrame.
(При этом делается допущение, что основная и подменяющая рамки
содержат  зоны прокрутки одинакового размера,  если они вообще
их имеют).  Если  изменения не были изображены сразу  же,  они
будут показаны при последующем отображении рамки.
     Если на  определенной   стороне   окна   зона   прокрутки
отсутствует,  то  процедура  EraseSlider не производит никаких
действий. Обычно не возникает необходимости вызывать процедуру
EraseSlider. Метод DrawSlider автоматически стирает предыдущий
слайдер перед тем, как изобразить новый.

     Пример

     Win.EraseSlider(frRR); Win.EraseSlider(frBB);

     Стирает слайдеры текущего окна, не изображая новых.

     См.также
     DrawAllSliders                 DrawSlider

     Error
     -----
     Объявление
     procedure Error(Code : Word); virtual;

     Назначение
     Сообщает об ошибке.

     Описание
     Прикладные программы  не  вызывают  эту   процедуру   не-
посредственно.  Когда  метод  объекта  RawWindow  обнаруживает
ошибку,  он вызывает процедуру Error,  которая сообщает о ней.
Эта процедура,  реализуемая по умолчанию, просто назначает код
ошибки во внутреннюю переменную состояния.  Объект, полученный
из  объекта RawWindow,  может игнорировать процедуру Error для
того,  чтобы обеспечить другое поведение при обработке ошибок,
либо может вызывать процедуру Error, чтобы сохранить код ошиб-
ки.

     Пример

     Win.Error(MyErrorCode);

     Вставляет код ошибки прикладной программы в  поле  ошибок
объекта Win.

     См.также
     GetLastError

     EvaluateMousePos
     ----------------
     Описание
     {$IFDEF UseMouse}
     procedure EvaluateMousePos;

     Назначение
     Оценивает текущее   положение   мыши   подобно  процедуре
EvaluatePos.

     Описание
     Если мышь  инсталирована,  то  процедура EvaluateMousePos
вызывает метод MouseWhereXYabs программного модуля OPMOUSE для
того,  чтобы получить положение курсора мыши, а затем вызывает
процедуру EvaluatePos для того,  чтобы оценить  это  положение
относительно рамки окна.  Для получения более подробной инфор-
мации следует обратиться к описанию процедуры EvaluatePos.
     Следует отметить,  что процедура EvaluateMousePos не про-
веряет, являются ли видимыми курсор мыши и окно.

     Пример

     var
       UserVal : LongInt;
       FramePos : FramePosType;
       HotCode : Byte;
     ...
     {...Окно Init/Draw...}
     Finished := False;
     repeat
       Win.EvaluateMousePos;
       UserVal := Win.PosResults(FramePos, HotCode);
       Fastwrite(CharStr(' ', ScreenWidth), 25, 1, $07);
       Fastwrite(FPName[FramePos], 25, 1, $07);
       Fastwrite(Long2Str(HotCode), 25, 20, $07);
       Fastwrite(Long2Str(UserVal), 25, 40, $07);
     until Finished;
     Win.Done;

     При перемещении  мыши  по  экрану процедура сообщает о ее
положении  относительно  рамки  окна.  В  описании   процедуры
EvaluatePos подобная программа рассмотрена полностью.

     См.также
     EvaluatePos                              PosResults

     EvaluatePos
     -----------
     Объявление
     procedure EvaluatePos(X, Y : Byte);

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

     Описание
     Процедура EvaluatePos выполняет серию сравнений для того,
чтобы  определить,  где находится заданное положение точки от-
носительно окна. Она сохраняет в объекте до трех различных ин-
дикаторов  в  виде  полей;  доступ к этим полям осуществляется
посредством метода PosResult.  Этими тремя индикаторами  явля-
ются:  во-первых,  положение  относительно рамки (находится ли
эта точка вне рамки, внутри рамки или на самой рамке); во-вто-
рых, код активной области, если эта точка находится внутри ак-
тивной  области;  в-третьих,  пользовательская  величина  зоны
прокрутки, если эта точка находится внутри зоны прокрутки.
     Если окно является текущим или не имеет подменяющей  рам-
ки,  то  процедура EvaluatePos использует основную рамку в ка-
честве начала отсчета координат. В противном случае эта проце-
дура использует подменяющую рамку.  Следует отметить, что про-
цедура EvaluatePos не производит проверку того,  активно  окно
или нет;  она возвращает одинаковые результаты, даже если окно
невидимо.

     Пример

     const FPName : array[FramePosType] of string[14] =
             ('frTL', 'frBL', 'frTR', 'frBR', 'frTT', 'frBB',
              'frLL', 'frRR', 'frInsideActive', 'frInsideFrame',
              'frOutsideFrame');
     var Win : RawWindow;
         X, Y, HotCode : Byte;
         FramePos : FramePosType;
         UserCode : LongInt;
         Finished : Boolean;
     begin
       Win.InitCustom(30, 5, 50, 15, DefaultColorSet,
                      DefWinOptions or wBordered);
       Win.wFrame.AddScrollBar(frRR, 0, 1000, DefaultColorSet);
       Win.wFrame.AddScrollBar(frBB, - 100, 100,
                               DefaultColorSet);
       Win.wFrame.AddHotSpot(frTL, #254, DefaultColorSet);
       Win.wFrame.AddHotBar(frTT, hsRegion0);
       Win.Draw;
       X := 1; Y := 1; Finished := False;
       repeat
         GotoXYAbs(X, Y);
         Win.EvaluatePos(Y, Y);
         UserCode := Win.PosResults(FramePos, HotCode);
         Fastwrite(CharStr(' ', ScreenWidth), 25, 1, $07);
         Fastwrite(FPName[FramePos], 25, 1, $07);
         Fastwrite(Long2Str(HotCode), 25, 20, $07);
         Fastwrite(Long2Str(UserCode), 25, 40, $07);
         case ReadKeyWord of
           $4800 : if Y > 1 then Dec(Y);
           $4B00 : if X > 1 then Dec(X);
           $4D00 : if X < ScreenWidth then Inc(X);
           $5000 : if Y < ScreenHeight then Inc(Y);
           $011B : Finished := True;
         end;
       until Finished;
       Win.Done;
     end.

     Демонстрируется совместная работа процедур EvaluatePos  и
PosResults Эта программа постоянно отображает взаимосвязь меж-
ду положением курсора и рамкой объекта Win.

     См.также
     EvaluateMousePos           WindowStack.EvaluateStackPos
     PosResults

     Extent
     ------
     Объявление
     procedure Extent(var X1,  Y1, X2, Y2 : Byte;
                      IncludeShadows :Boolean);

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

     Описание
     "Размер" означает координаты прямоугольника,  который ох-
ватывает все компоненты окна.  Проверяемые структуры  содержат
область активного окна, рамку (основную и подменяющую), окайм-
ление и заголовки и, дополнительно, тени. Такая информация по-
лезна  при  определении правильности установки координат конк-
ретного окна.
     Обычно тени  не  определяют  фактических  границ окна при
изображении  или  задании  его  размеров,   поскольку   модуль
OPWINDOW будет автоматически отсекать их.

     Пример

     var Xlo, Ylo, Xhi, Yhi : Byte;
     ...
     Win.Extent(Xlo, Ylo, Xhi Yhi, True);

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

     См.также
     Coordinates

     Frame-relative Writing
     ----------------------
     Объявления
     procedure fFastWrite(St : string; Row, Col, Attr : Byte);
       {-Записывает строку}

     procedure fFastText(St : string; Row, Col : Byte);
       {-Записывает строку,  определенную параметром St, в по-
         ложение,  устанавливаемое параметрами Row и Col,  без
         изменения основного видеоатрибута}

     procedure fFastVert(St : string; Row, Col, Attr : Byte);
       {-Записывает строку вертикально}
     
     procedure fFastFill(Number :  Word;  Ch : Char; Row, Col,
                         Attr : Byte);
       {-Заполняет область внутри рамки таким количеством сим-
         волов (код символа определяется параметром Ch), кото-
         рое  задано  параметром Number,  начиная с положения,
         устанавливаемого параметрами Row и Col, используя ви-
         деоатрибут параметра Attr}

     procedure fChangeAttribute(Number :  Word; Row, Col, Attr
                                : Byte);
       {-Изменяет видеоатрибуты  символов,  количество которых
         задано параметром Number, на видеоатрибут, определяе-
         мый параметром Attr,  начиная с положения,  заданного
         параметрами Row и Col}

     procedure fFastCenter(St : string; Row, Attr : Byte);
       {-Записывает строку,   определенную  параметром  St,  в
         центре  строки,   устанавливаемой   параметром   Row,
         используя видеоатрибут, определяемый параметром Attr}

     procedure fFastFlush(St : string; Row, Attr : Byte);
       {-Записывает мигающую строку,  определенную  параметром
         St,  начиная  со  строки,  устанавливаемой параметром
         Row,  используя видеоатрибут, определяемый параметром
         Attr}
     procedure fFastRead(Number,  Row,  Col :  Byte;  var St :
                         string);
       {-Считывает с экрана определенное параметром Number ко-
         личество символов в строковую переменную St,  начиная
         с  положения, устанавливаемого параметрами Row и Col}

     procedure fReadAttribute(Number, Row, Col : Byte; var St :
                              string);
       {-Считывает с экрана атрибуты символов,  количество ко-
         торых определено параметром Number, в строковую пере-
         менную St,  начиная с положения, устанавливаемого па-
         раметраетрами  Row и Col}

     procedure fWriteAttribute(St : String; Row, Col : Byte);
       {-Записывает строку атрибутов,  определенную параметром
         St, начиная с положения, устанавливаемого параметрами
         Row и Col, без изменения символов}

     procedure fFlexWrite(St :  string;  Row,  Col : Byte; var
                          FAttrs : FlexAttrs);
       {-Записывает строку,  определяемую параметром St, гибко
         используя связанные с окном координаты}
     
     procedure fFastWriteCtrl(St :  String;  Row,  Col,  Attr,
                              Ctrl : Byte);
       {-Записывает строку,  определяемую параметром St, начи-
         ная с положения,  устанавливаемого параметрами Row  и
         Col, используя видеоатрибут,  определяемый параметром
         Attr, без эффекта "снежных хлопьев" на экране. Управ-
         ляющие символы, задаваемые параметром Ctrl, отобража-
         ются в виде заглавных букв}

     Назначение
     Делает записи, используя координаты, связанные с границей
рамки.

     Описание
     Эти подпрограммы  отличаются  от подпрограмм записи,  от-
носящихся к окну (wFastWrite и т.д.),  только  в  том  случае,
если  был произведен вызов процедуры AdjustFrameCoords для то-
го, чтобы задать координаты рамки, отличные от устанавливаемых
по  умолчанию.  В  таком случае эти подпрограммы предоставляют
удобные методы для доступа к  экрану,  связанные  с  границами
рамки, а не окна.
     Если рамка имеет окантовку, то для этих подпрограмм пози-
ция  (1,  1)  находится  точно в верхнем левом углу окантовки.
Если рамка не имеет окантовки,  то позиция (1,  1) совпадает с
верхним левым углом рамки.
     Строки, записываемые операторами этих подпрограмм,  отсе-
каются в соответствии с границами рамки,  если это необходимо.
Данные подпрограммы не предоставляют  возможности  записи  или
считывания вне рамки.
     Каждый из этих методов  подробно  рассмотрен  в  описании
процедур Window-relative Writing.

     GetCursor
     ---------
     Объявление
     function GetCursor : CursorType;

     Назначение
     Возвращает  форму текущего курсора.

     Описание
     Функция GetCursor обращается к  внутреннему  полю  данных
объекта для того, чтобы возвратить текущую форму курсора окна.
Это поле данных инициализировано в  константу  DefCursor  (как
правило, обычный подчеркивающий курсор, cuNormal), при инициа-
лизации окна.  Оно обновляется при вызове процедуры SetCursor,
когда  окно  стирается и вместо него изображается другое окно.
Следует отметить, что при вызове процедуры SetCursorSize моду-
ля OPCRT это поле данных непосредственно не обновляется.
     Тип CursorType  представляет  собой   перечислимый   тип,
описывающий   типичные   формы,  которые  может  иметь  курсор
(cuNormal,  cuBlock и т.д.). Если форма курсора установлена не
по умолчанию, то функция GetCursor возвратит cuUnknown.

     Пример

     var
       SaveCursor : CursorTypr;
     ...
       Win.Init(30, 5, 50, 15);
       SaveCursor := Win.GetCursor;
       Win.SetCursor(cuBlock);
       Win.Draw;
       {...Используется окно...}
       Win.SetCursor(SaveCursor);

     Сохраняется форма текущего курсора, изменяется на прямоу-
гольную, затем восстанавливается первоначальная форма курсора.

     См.также
     CursorType(модуль OPCRT)              SetCursor

     GetLastError
     ------------
     Объявление
     function GetLastError : Word; virtual;

     Назначение
     Возвращает и сбрасывает код последней ошибки.

     Описание
     Возвращает нуль,  если ошибка  отсутствует,  в  противном
случае возвращает один из кодов ошибок, приведенных в Приложе-
нии D.
     Функция GetLastError имеет доступ к полям ошибок несколь-
ких объектов:  собственно объекта RawWindow,  а также содержа-
щихся в нем объектов. Одновременно может зависнуть более одной
ошибки, хотя это маловероятно. Функция GetLastError сбрасывает
только одну ошибку за один вызов, поэтому ее последующий вызов
может возвратить ненулевую величину.  Для того, чтобы гаранти-
ровать,  что функция GetLastError возвратит нуль, следует выз-
вать метод ClearErrors.
     Совсем не обязательно вызывать функцию GetLastError после
каждого обращения к подпрограмме RawWindow, хотя это и не пов-
редит. Описание каждого метода показывает случаи возникновения
ошибок.
     Функция GetLastError не возвращает коды ошибок, относящи-
еся к окну,  только в  одном  особом  случае  -  после  отказа
конструктора.  На такой случай не предусмотрено даже прекраще-
ние работы функции GetLastError (а также поля данных,  к кото-
рым эта функция обращалась бы).  Вместо данной функции следует
использовать  глобальную  переменную  InitStatus  (из   модуля
OPROOT).

     Примеры

     Win.wFrame.AddScrollBar(frRR, 0, 1000, DefaultColorSet);
     Result := Win.GetLastError;
     if Result <> 0 then
       WriteLn('Failed to  add  window  feature,  Result  =   ',
               Result);

     Производит проверку ошибок после добавления зоны прокрут-
ки. Такая проверка особенно важна после вызова различных мето-
дов Add из объекта Frame, поскольку они обычно должны выделять
динамически распределяемые области памяти и проверять значения
координат.

     if Win.GetLastError <> 0 then
       WriteLn('Failed to  add  window  feature,  Result  =   ',
               Win.GetLastError);

     Неправильно! Обращение  к функции GetLastError устанавли-
вает ее в нуль.

     Cм.также

     ClearErrors                 Error

     Height
     ------

     Объявление

     function Height : Word;

     Назначение

     Возвращает активную высоту окна.

     Описание

     Возвращает количество  строк в активной прямоугольной об-
ласти окна.
     Эта функция практически реализуется в объекте AbstractWindow.

     Примеры

     Win.wFrame.AddCutsomShadow(#178, frBB,  1,  1, Win.Width+2,
                                1, $02, $70);
     Win.wFrame.AddCustomShadow(#178, frRR, 1, 1, 1,
                                Win.Height+2, $02, $70);

     Функция Height используется для того, чтобы добавить тень
такой же высоты, как и рамка (на 2 строки больше, чем окно).

     Win.wFastText('bottom of window', Win.Height, 1);

     В нижнюю строку окна записывается строка текста.

     См.также
     Coordinates               Width

     Init
     ----
     Объявление
     constructor Init(X1, Y1, X2, Y2 : Byte);

     Назначение
     Создает окно,  используя опции и  цвета,  принимаемые  по
умолчанию.

     Описание
     Конструктор Init  создает  экземпляр  объекта  RawWindow,
используя  опции окна,  принимаемые по умолчанию (из константы
DefWindowOptions),  и набор цветов, также принимаемый по умол-
чанию (из константы DefaultColorSet). Для получения более под-
робной информации следует обратиться к  описанию  конструктора
InitCustom.

     Пример

     if not Win.Init(30, 5, 50, 15) then begin
       WriteLn('Failed to  Init   RawWindow,   Status   =   ',
                InitStatus); Halt;
     end;

     Верхний левый угол окна будет занимать на экране  позицию
(30,5);  нижний  правый  угол будет занимать на экране позицию
(50,15).  Опции, принимаемые по умолчанию (если они не изменя-
лись), не содержат флаг, который создает окантовку окна.

     InitCustom
     ----------
     Объявление
     constructor InitCustom(X1,  Y1, X2, Y2 : Byte; var Colors
                            : ColorSet; Options : LongInt);

     Назначение
     Создает окно с заказными опциями.

     Описание
     Этот конструктор  создает  экземпляр  объекта  RawWindow,
используя заданные для окна параметры Opions и  Colors.  Пара-
метры X1,  Y1, X2 и Y2 являются абсолютными координатами внут-
ренней части окна,  где будет  записываться  и  прокручиваться
текст.
     Конструктор InitCustom  выделяет  буфер  для   сохранения
участка   экрана,   который  будет  занят  окном.  Если  опция
wBordered не установлена,  то этот  буфер  будет  использовать
2*(X2-X1+1)*(Y2-Y1+1) байт памяти.  Если опция wBordered уста-
новлена,  то буфер  будет  использовать  2*(X2-X1+3)*(Y2-Y!+3)
байт.  Если установлен флаг опции wSaveContents, то выделяется
еще один буфер, приблизительно такого же размера, для сохране-
ния содержимого самого окна.
     Конструктор InitCustom   считывает   поля   TextMono    и
TextColor типа ColorSet,  а также поля,  используемые объектом
Frame.
     Если конструктор InitCustom откажет,  то код ошибки будет
сохранен в глобальной переменной InitStatus. Возможными причи-
нами  отказа  могут  быть неправильно заданные координаты окна
(epFatal+ecWinCoordsBad)   и   недостаточный   объем    памяти
(epFatal+ecOutOfMemory).
     Более подробная информация об опциях окна приведена в на-
чале данного раздела.

     Пример

     var
       Win : RawWindow;
       WinOpts : LongInt;
     begin
       WinOpts := wBordered+wClear+wSaveContents+wResizeable;
       if not Win.InitCustom(30,  5,  50,  15,  DefaultColorSet,
                             WinOpts) then begin
         WriteLn('Failed to   Init   RawWindow,   Status   =    ',
                 InitStatus);
         Halt;
       end;

     Создается экземпляр окна, имеющего рамку и способного из-
менять свои размеры.  При первоначальном  изображении  данного
окна экран очищается. При стирании данного окна его содержимое
будет сохранено. Окно будет использовать цвета, принимаемые по
умолчанию.

     См.также
     Frame.InitCustom                      Init



     InWindow
     --------
     Объявление
     function InWindow(AX, AY : Byte) : Boolean;

     Назначение
    Возвращает значение True, если заданная абсолютная позиция
находится внутри активного окна.

     Описание
     Функция InWindow сравнивает параметры AX и AY с координа-
тами активного окна и возвращает значение True, если эта пози-
ция  находится  внутри  окна.  Следует  отметить,  что функция
InWindow не проверяет,  является ли окно видимым в данный  мо-
мент.

     Пример

     if Win.InWindow(MouseWhereXabs, MouseWhereYabs) then
       WriteLn('mouse cursor in window')
     else
       WriteLn('mouse cursor not in window');

     Сообщает, находится ли в данный момент курсор мыши в окне
Win.

     См.также
     CursorInWindow                  EvaluatePos


     IsActive
     --------
     Объявление
     function IsActive : Boolean; virtual;

     Назначение
     Возвращает значение True, если окно отображено на экране.

     Описание
     Проверяет внутренний флаг,  который  устанавливается  при
изображении окна и сбрасывается при его стирании.

     Пример

     if not Win.IsActive then
       Win.Draw;

     Если в данный момент окно Win отсутствует на  экране,  то
оно изображается посредством вызова процедуры Draw.


     IsCurrent
     ---------
     Объявление
     function IsCurrent : Boolean; virtual;

     Назначение
     Возвращает значение True, если окно является текущим.

     Описание
     Текущим является окно, изображенное последним. Глобальная
переменная  CurrentWindow всегда содержит указатель на текущее
окно.  Функция IsCurrent сравнивает адрес объекта окна с  гло-
бальной переменной CurrentWindow и,  если они совпадают, возв-
ращает значение True.

     Пример

     if not Win.IsCurrent then
       Win.Draw;
     WriteLn('this output appears within Win');

     Если окно Win не является текущим,  то использование про-
цедуры  Draw  делает его текущим.  Для объекта RawWindow вызов
процедуры Draw является самым подходящим способом,  чтобы сде-
лать окно текущим,  даже если оно уже изображено на экране, но
не является текущим.  После того, как окно будет сделано теку-
щим,  в нем появятся результаты выполнения операторов процедур
Write и WriteLn.


     IsZoomed
     --------
     Объявление
     {$IFDEF UseAdjustableWindows}
     function IsZoomed : Boolean; virtual;

     Назначение
     Возвращает значение True, если масштаб окна увеличен.

     Описание
     Проверяет внутренний флаг,  который  устанавливается  при
вызове  функции  Zoom  и  сбрасывается  при выполнении функции
Unzoom. При увеличении масштаба окна его размеры будут измене-
ны на максимальные.
     Функция IsZoomed часто используется для того, чтобы опре-
делить, какую из двух функций (Zoom или Unzoom) следует  вызы-
вать при нажатии клавиши переключения  режима увеличения масш-
таба.

     Примеры

     Win.Init(30, 5, 50, 15);
     Win.wOptionsOn(wBordered);
     Win.Draw;
     Win.Zoom;
     if Win.IsZoomed then
       Win.wFastText('This line is  too  long  for  an  unzoomed
                    window', 1, 1)
     else
       Win.wFastText('This line just fits', 1, 1);

     Осуществляется проверка того, в каком состоянии находится
режим увеличения масштаба окна  Win  перед  тем,  как  решить,
строку какой длины можно записать в это окно.

     if Win.IsZoomed then
       Win.Unzoom
     else
       Win.Zoom;

     Осуществляется переключение состояния  режима  увеличения
масштаба окна.

     См.также
     Zoom


     Load
     ----
     Объявление
     constructor Load(var S : IdStream);

     Назначение
     Загружает объект RawWindow из абстрактного последователь-
ного файла.

     Описание
     Переменная S представляет собой инициализированный  соот-
ветствующим  образом абстрактный последовательный объект (нап-
ример,  абстрактный последовательный файл,  открытый для  чте-
ния).  Следует отметить, что переменная S может быть любым по-
током  типа  IdStream,   который   включает   в   себя   типы
DosIdStream, BufIdStream и MemIdStream.
     Конструктор Load считывает последовательность  байтов  из
абстрактного последовательного файла S.  Эти байты должны быть
уже предварительно записаны посредством обращения к  процедуре
Store  объекта RawWindow.  Конструктор Load считывает фиксиро-
ванные поля данных объекта RawWindow и  вызывает  методы  Load
объектов, входящих в окно, включая объекты Frame и ScreenRect.
Если установлен флаг опции wStoreContents окна,  а прямоуголь-
ник содержимого окна был уже инициализирован на момент,  когда
производилась запись в абстрактный последовательный  файл,  то
конструктор Load будет также считывать и содержимое окна.
     Процедурой регистрации   абстрактного   последовательного
файла     для    объекта    RawWindow    является    процедура
RawWindowStream.  Если  окно  использует  специальные  эффекты
раскрывания,  то для регистрации соответствующего абстрактного
последовательного файла должна быть  также  вызвана  процедура
ExplodingWindowStream.

     Пример

     uses
       OpCrt, OpRoot, OpFrame, OpWindow;
     var
       Win : RawWindow;
       S : BufIdStream;
     begin
       S.Init('RAWWIN.STM', SOpen, 1024);
       S.RegisterHier(RawWindowStream);
       S.Get(Win);
       if S.GetStatus <> 0 then
         Halt;
       S.Done;

       Win.Draw;
       Delay(1000);
       Win.Done;
     end.

     Загружает объект  Win  из  абстрактного последовательного
файла,  созданного  в  примере  к  описанию  процедуры  Store,
используя метод Get абстрактного последовательного файла,  ко-
торый косвенно вызывает конструктор Load объекта RawWindow.
     Вероятно, может возникнуть необходимость включить в прог-
рамму большее количество проверок кода ошибки,  чем показано в
данном  примере.  Для правильного осуществления таких проверок
при чтении и записи абстрактных последовательных файлов следу-
ет обратиться к примеру из описания типа BufIdStream.

     См.также
     Frame.Load                               Store
     ScreenRect.Load


     MainFramePtr
     ------------
     Объявление
     function MainFramePtr : AbstractFramePtr; virtual;

     Назначение
     Возвращает указатель на рамку, используемую в том случае,
когда окно является текущим.

     Описание
     Функция MainFramePtr возвращает адрес поля wFrame объекта
RawWindow.  Для извлечения в дальнейшем максимальной пользы из
ООП рекомендуется использовать функцию MainFramePtr вместо не-
посредственной ссылки на поле wFrame. Однако в настоящее время
ссылка  на  поле wFrame дает тот же результат и является более
эффективной.
     Поскольку функция  MainFramePtr возвращает указатель типа
AbstractFramePtr,  то она должна быть представлена в виде, по-
казанном в следующем примере.

     Пример

     FramePtr(Win.MainFramePtr)^.AddHeader('Standard  Header',
              heTC);

     Добавляется заголовок к основной рамке объекта Win. Заго-
ловок  будет  расположен в центре верхней стороны рамки (пара-
метр heTC).  При  отсутствии  многообразия  форм  поля  данных
wFrame этот оператор эквивалентен оператору:

     Win.wFrame.AddHeader('Standard Header', heTC);

     См.также
     ActiveFramePtr            AltFramePtr


     MarkCurrent
     -----------
     Объявление
     procedure MarkCurrent; virtual;

     Назначение
     Вызывается, когда окно становится текущим.

     Описание
     Прикладные программы не обращаются непосредственно к дан-
ной  процедуре.  Процедура Draw объекта RawWindow вызывает эту
процедуру,  а она только присваивает по умолчанию  адрес  окна
глобальной  переменной  CurrentWindow.  Объект,  полученный из
объекта RawWindow,  может игнорировать процедуру  MarkCurrent,
чтобы  выполнить дополнительные действия,  либо может вызывать
ее в соответствующих случаях для того, чтобы обновить перемен-
ную CurrentWindow.


     MarkNotCurrent
     --------------
     Объявление
     procedure MarkNotCurrent; virtual;

     Назначение
     Вызывается, когда отменяется выбор окна.

     Описание
     Прикладные программы не обращаются непосредственно к дан-
ной процедуре.  Ее вызывают процедуры Draw и Erase,  а она  не
производит никакого действия по умолчанию. (Процедура Draw вы-
зывает ее только в том случае,  если уже существующее  текущее
окно заменяется изображением нового окна).  Объект, полученный
из   объекта   RawWindow,   может    игнорировать    процедуру
MarkNotCurrent   для   того,  чтобы  выполнить  дополнительные
действия.


     MoveWindow
     ----------
     Объявление
     {$IFDEF UseAdjustableWindows}
     procedure MoveWindow(DX, DY : Integer); virtual;

     Назначение
     Перемещает окно.

     Описание
     Процедура MoveWindow сначала убеждается в том,  что масш-
таб окна не был увеличен;  если же масштаб окна изменялся,  то
она    генерирует    предупреждающее   сообщение   об   ошибке
(epWarning+ecWinIsZoomed) и завершает свою  работу.  Если  обе
координаты  DX и DY равны нулю,  то процедура MoveWindow сразу
же завершает свою работу в целях экономии времени. В противном
случае процедура MoveWindow вызывает метод AdjustWindow следу-
ющим образом:

     var X1, Y1, X2, Y2 : Byte;
     ...
     Coordinates(X1, Y1, X2, Y2);
     AdjustWindow(X1+DX, Y1+DY, X2+DX, Y2+DY);

     Следует отметить,  что  установка  координат производится
относительно активной прямоугольной области окна, а не относи-
тельно рамки. Для получения более подробной информации следует
обратиться к описанию процедуры AdjustWindow.

     Пример

     uses
       OpCrt, OpFrame, OpWindow;
     var
       Win : RawWindow;
       Finished : Boolean;
     begin
       Win.Init(30, 5, 50, 15);
       Win.wOptionsOn(wBordered);
       Win.Draw;
       Finished := False;
       repeat
         case ReadKeyWord of
           $4800 : Win.MoveWindow(0, -1); {Стрелка вверх}
           $4B00 : Win.MoveWindow(-1, 0); {Стрелка влево}
           $4D00 : Win.MoveWindow(1, 0);  {Стрелка вправо}
           $5000 : Win.MoveWindow(0, 1);  {Стрелка вниз}
           $011B : Finished := True;      {Выход}
         end;
       until Finished;
       Win.Done;
     end.

     Демонстрируется способ перемещения окна в соответствии  с
командами курсора.

     См.также
     AdjustWindow                      Zoom
     ResizeWindow


     PosResults
     ----------
     function PosResults(var  FramePos  :  FramePosType;   var
                         HotCode : Byte) : LongInt;

     Назначение
     Возвращает величины из самого последнего обращения к про-
цедурам EvaluatePos или EvaluateMousePos.

     Описание
     Функция PosResults просто обращается к трем полям данных,
записанным  внутри объекта RawWindow.  Эти поля данных сначала
должны  быть  инициализированы  посредством  вызова   процедур
EvaluatePos,    EvaluateMousePos,   EvaluateStackPos   объекта
WindowStack или EvaluateStackMousePos объекта WindowStack. Эти
процедуры сравнивают заданное (X,  Y) положение с координатами
окна.
     Переменная FramePos возвращает величину,  означающую, где
находится эта позиция относительно рамки. Она возвращает любую
из следующих величин:

     frOutsideFrame         - вне рамки
     frInsideFrame          - внутри рамки, но вне активного
                              окна
     frInsideActive         - внутри активного окна
     frTL, frTR, frBL, frBR - в углу рамки
     frTT, frBB, frLL, frRR - на стороне рамки

     Переменная HotCode возвращает код соответствующей  актив-
ной  области,  если позиция находится внутри активной области.
Этот метод  возвращает  константу  hsNone,  если  эта  позиция
расположена вне активной области. Дополнительная информация об
этих константах приведена в разделе В.2 (OPFRAME).
     Результат функции  возвращает  пользовательскую  величину
зоны прокрутки только в том случае,  если позиция находится  в
зоне  прокрутки.  В  противном  случае  эта функция возвращает
нуль.  Например, если позиция находится на расстоянии 1/4 про-
тяженности  вертикальной зоны прокрутки относительно ее нижней
границы,  а пределы зоны прокрутки составляют от -100 до  100,
то  функция  PosResults возвратит величину -50.  Следует отме-
тить, что метод HotCode всегда возвращает величину hsBar, тог-
да как функция PosResults возвращает значимую величину.

     Пример

     См. процедуру EvaluatePos.

     См.также
     EvaluateMousePos                   EvaluatePos
     WindowStack.EvaluateStackPos


     ResizeWindow
     ------------
     Объявление
     {$IFDEF UseAdjustableWindows}
     procedure ResizeWindow(DX, DY : Integer); virtual;

     Назначение
     Изменяет размеры окна.

     Описание
     Процедура ResizeWindow  сначала  убеждается  в  том,  что
масштаб окна не увеличивался;  если же масштаб окна изменялся,
то эта процедура генерирует предупреждающее сообщение об ошиб-
ке (epWarning+ecWinIsZoomed) и завершает свое выполнение.  За-
тем она проверяет,  установлен ли флаг опции wResizeable; если
нет,   то   эта   процедура  генерирует  сообщение  об  ошибке
(epNonFatal+ecWinNotSizeable)  и  завершает  свое  выполнение.
Если   обе  координаты  DX  и  DY  равны  нулю,  то  процедура
ResizeWindow немедленно завершает свое выполнение с целью эко-
номии времени. В противном случае процедура ResizeWindow вызы-
вает процедуру AdjusrWindow следующим образом:

     var
       X1, Y1, X2, Y2 : Byte;
     ...
       Coordinates(X1, Y1, X2, Y2);
       AdjustWindow(X1, Y1, X2+DX, Y2+DY);

     Следует отметить,  что установка  координат  производится
относительно активной прямоугольной области окна, а не относи-
тельно рамки.  Более подробная информация  об  этой  процедуре
приведена в описании процедуры AdjustWindow.

     Пример

     uses
       OpCrt, OpFrame, OpWindow;
     var
       Win : RawWindow;
       Finished : Boolean;
     begin
       Win.Init(30, 5, 50, 15);
       Win.wOptionsOn(wBordered);
       Win.Draw;
       Finished := False;
       repeat
         case ReadKeyWord of
           $4800 : Win.ResizeWindow(0, -1); {Стрелка вверх}
           $4B00 : Win.ResizeWindow(-1, 0); {Стрелка влево}
           $4D00 : Win.ResizeWindow(1, 0);  {Стрелка вправо}
           $5000 : Win.ResizeWindow(0, 1);  {Стрелка вниз}
           $011B : Finished := True;        {Выход}
         end;
       until Finished;
       Win.Done;
     end.

     Демонстрируется способ  изменения  размеров  окна в соот-
ветствии с командами курсора.

     См.также
     AdjustWindow                 Zoom
     MoveWindow


     SaveContents
     ------------
     Объявление
     procedure SaveContents; virtual;

     Назначение
     Сохраняет содержимое текущего окна в буфер содержимого.

     Описание
     Эта процедура используется для того, чтобы обновить буфер
содержимого окна, не стирая его. В частности, это удобно, ког-
да установлен флаг опции wStoreContents,  и окно  должно  быть
сохранено в абстрактный последовательный файл. Обычно содержи-
мое окна сохраняется в буфер содержимого только  при  стирании
окна.
     Окно должно быть  активным,  иначе  будет  генерироваться
сообщение  об ошибке epNonFatal+ecWinNotActive.  Если не уста-
новлен флаг опции wSaveContents, то процедура SaveContents за-
вершит свое выполнение, не произведя никакого действия.

     Пример

     Win.wOptionsOn(wSaveContents);
     Win.Draw;
     Win.wFastWrite('New stuff', 1, 1, TextAttr);
     Win.SaveContents;

     Текущее содержимое окна сохраняется в буфер содержимого.

     См.также
     Erase


     ScrollHoriz
     -----------
     Объявление
     procedure ScrollHoriz(Cols : Integer); virtual;

     Назначение
     Прокручивает содержимое окна в  горизонтальном  направле-
нии.

     Описание
     Если параметр Cols больше нуля,  то существующий  в  окне
текст смещается влево на заданное данным параметром количество
столбцов,  а крайние справа столбцы заполняются символом и ат-
рибутом фона окна.  Если параметр Cols меньше нуля, то сущест-
вующий в окне текст смещается вправо на заданное данным  пара-
метром количество столбцов и осуществляется аналогичное запол-
нение фоном крайних слева столбцов.
     Процедура ScrollHoriz  временно не отображает курсор мыши
(если мышь инсталирована) для того,  чтобы избежать его отбра-
сываний.

     Пример

     uses
       OpCrt, OpFrame, OpWindow;
     var
       Win : RawWindow;
       Finished : Boolean;
       I : Byte;
     begin
       Win.Init(30, 5, 50, 15);
       Win.wOptionsOn(wBordered);
       Win.Draw;
       for I := 2 to 8 do
         wFastText('Sample Text', I, 3);
       Finished := False;
       repeat
         case ReadKeyWord of
           $4B00 : Win.ScrollHoriz(-1); {Стрелка влево}
           $4D00 : Win.ScrollHoriz(1);  {Стрелка вправо}
           $4800 : Win.ScrollVert(-1);  {Стрелка вверх}
           $5000 : Win.ScrollVert(1);   {Стрелка вниз}
           $011B : Finished := True;    {Выход}
         end;
       until Finished;
       Win.Done;
     end.

     Содержимое окна Win прокручивается в соответствии  с  ко-
мандами курсора.  Следует отметить,  что если какой-либо текст
при его прокрутке выйдет за сторону окна, то он будет потерян.
Для того,  чтобы восстановить этот текст, его нужно будет соз-
дать заново.


     ScrollVert
     ----------
     Объявление
     procedure ScrollVert(Rows : Integer); virtual;

     Назначение
     Прокручивает содержимое окна в вертикальном направлении.

     Описание
     Если параметр Rows больше нуля,  то существующий  в  окне
текст смещается вверх на заданное данным параметром количество
строк,  а самые нижние строки заполняются символом и атрибутом
фона  окна.  Если  параметр Rows меньше нуля,  то существующий
текст смещается вниз на заданное данным параметром  количество
строк  и  осуществляется  аналогичное  заполнение  фоном самых
верхних строк.
     Процедура ScrollVert  временно  не отображает курсор мыши
(если мышь инсталирована), чтобы избежать его отбрасываний.

     Пример

     См. процедуру ScrollHoriz



     SetBackChar
     -----------
     Объявление
     procedure SetBackChar(BackChar : Char); virtual;

     Назначение
     Устанавливает символ фона.

     Описание
     Сохраняет заданный символ в  поле  данных  объекта.  Этот
символ будет использоваться при очищении или прокрутке окна.

     Пример

     Win.SetBackChar(#178);

     В качестве   стандартного   фона  текста  устанавливается
"основной" заполняющий символ.

     См.также
     SetTextAttr
     
     
     SetCursor
     ---------
     Объявление
     procedure SetCursor(CT : CursorType);

     Назначение
     Устанавливает форму курсора.

     Описание
     Параметр CT  -  это  логическая  форма курсора (cuNormal,
cuBlock,  cuHidden и т.д.),  а не физические строки  развертки
экрана.  Если  на момент вызова данной процедуры окно является
текущим,  то форма фактического курсора изменяется сразу же; в
противном  случае обновляется соответствующее поле данных объ-
екта,  которое будет использоваться,  когда окно снова  станет
текущим.

     Примеры

     Win.SetCursor(cuBlock);

     Устанавливается прямоугольный курсор.

     Win.SetCursor(cuHidden);

     Курсор становится невидимым.

     См.также
     CursorType(OPCRT)               SetCursor
     
     
     SetFrameLimits
     --------------
     Объявление
     {$IFDEF UseAdjustableWindows}
     procedure SetFrameLimits(MinW, MinH, MaxW, MaxH : Byte);

     Назначение
     Устанавливает границы для задания размеров рамки.

     Описание
     Параметры MinW  и MinH устанавливают минимальные ширину и
высоту рамки, а параметры MaxW и MaxH - максимальные. Эти гра-
ницы относятся как к основной,  так и к подменяющей рамке. По-
пытки изменить размеры окна с нарушением этих границ не  увен-
чаются  успехом.  Если на момент вызова данной процедуры рамка
выходит за устанавливаемые границы,  то ошибка не  обнаружива-
ется.
     Наиболее общее применение этой  процедуры  заключается  в
изменении минимальной ширины таким образом, чтобы строка заго-
ловка полностью помещалась в рамке.
     Доступ к   границам   существующей  рамки  осуществляется
посредством обращения к полям данных frMinW,  frMinH, frMaxW и
frMaxH, содержащимся в поле wFrame окна.

     Примеры

     Win.SetFrameLimits(10, 5, ScreenWidth, ScreenHeight);

     Устанавливаются минимальные границы (для изменения разме-
ра рамки), составляющие 10 столбцов и 5 строк. Устанавливаются
максимальные границы, равные размеру полного экрана.

     Win.SetFrameLimits(10, Win.wFrame.frMinH,
                        Win.wFrame.frMaxW, Win.wFrame.frMaxH);

     Минимальная ширина рамки изменяется  до  10  столбцов,  а
остальные границы остаются неизменными.
     
     
     SetPosLimits
     ------------
     Объявление
     {$IFDEF UseAdjustbleWindows}
     procedure SetPosLimits(MinX, MinY, MaxX, MaxY : Byte);

     Назначение
     Устанавливает границы  для перемещения и изображения окна
(как правило, совпадающие с границами рамки).

     Описание
     Заданные координаты образуют новый прямоугольник, ограни-
чивающий положение рамки (см. введение к данному разделу). По-
пытки  переместить  или изменить размеры окна окончатся неуда-
чей,  если рамка - за исключением теней - будет превышать гра-
ницы этого прямоугольника. Если на момент вызова данной проце-
дуры рамка выходит за устанавливаемые границы,  то  ошибка  не
обнаруживается.
     Наиболее общее использование этой процедуры заключается в
том,  чтобы предотвратить перемещение окна в какой-либо другой
элемент экрана, например, в меню или строку состояния.
     Доступ к существующим границам осуществляется посредством
обращения к полям данных wMinXL, wMinYL, wMaxXH и wMaxYH окна.

     Пример

     Win.SetPosLimits(1, 2, ScreenWidth, ScreenHeight - 1);

     Верхняя и нижняя строки экрана защищаются от наложения на
них окна.

     См.также
     SetSizeLimits
     
     
     SetSizeLimits
     -------------
     Объявление
     {$IFDEF UseAdjustableWindows}
     procedure SetSizeLimits(MinW, MinH, MaxW, MaxH : Byte);

     Назначение
     Устанавливает границы для задания размеров активного  ок-
на.

     Описание
     Параметры MinW и MinH устанавливают минимальные ширину  и
высоту активного окна, а параметры MaxW и MaxH - максимальные.
Попытки изменить размеры окна  с  нарушением  этих  границ  не
увенчаются  успехом.  Если  на  момент вызова данной процедуры
размеры активного окна уже превышают устанавливаемые  границы,
то ошибка не обнаруживается.
     Наиболее распространенное  использование  этой  процедуры
заключается  в  изменении  минимального размера таким образом,
чтобы окно вмещало определенное содержимое.
     Доступ к  границам существующего окна возможен только при
обращении к полям данных wMinW, wMinH, wMaxW и wMaxH окна.

     Пример

     Win.SetSizeLimits(10, 5, ScreenWidth, ScreenHeight);

     Устанавливается минимальный   размер   активного    окна,
составляющий 10 столбцов и 5 строк. Устанавливаются максималь-
ные размеры,  равные размерам полного экрана.  Если окно имеет
окантовку,  то  активная  область  окна практически никогда не
достигнет максимальных границ, поскольку сначала границы рамки
достигнут своих максимальных значений.

     См.также
     SetFrameLimits              SetPosLimits
     
     
     SetTextAttr
     -----------
     Объявление
     procedure SetTextAttr(Color, Mono : Byte); virtual;

     Назначение
     Устанавливает атрибуты для текста обычного окна.

     Описание
     Сохраняет заданные видеоатрибуты в полях данных  объекта.
Соответствующий  видеоатрибут  ( в зависимости от видеорежима)
будет использоваться при очищении или прокрутке окна  и  будет
назначен  константе  TextAttr модуля OPCRT,  когда окно станет
текущим.

     Пример

     Win.SetTextAttr($02, $70);

     Текст обычного окна будет изображаться зеленым цветом  на
черном фоне на цветных мониторах, а монохромные мониторы дадут
инверсное изображение.

     См.также
     SetBackChar
     
     
     Store
     -----
     Объявление
     procedure Store(var S : IdStream);

     Назначение
     Сохраняет объект RawWindow в абстрактный последовательный
файл.

     Описание
     Переменная S представляет собой  соответствующим  образом
инициализированный абстрактный последовательный объект (обычно
абстрактный последовательный файл,  открытый для записи). Сле-
дует отметить, что переменная S может быть любым потомком типа
IdStream,  который включает в себя DosIdStream,  BufIdStream и
MemIdStream (хотя обычно в MemIdStream не записывают).
     Процедура Store  записывает  образ  объекта  RawWindow  в
абстрактный  последовательный файл S.  Процедура Store сначала
записывает фиксированные поля данных объекта RawWindow,  а за-
тем  вызывает  методы Store входящих в окно объектов,  включая
объекты Frame и ScreenRect.  Если установлен флаг  опции  окна
wStoreContents, а прямоугольник содержимого окна уже инициали-
зирован на момент записи в абстрактный последовательный  файл,
то процедура Store также запишет содержимое этого окна (в ком-
пактном сжатом формате).
     Процедурой регистрации   абстрактного   последовательного
файла    для    объекта    RawWindow    является     процедура
RawWindowStream.  Если  окно  использует  специальные  эффекты
раскрывания,  то для регистрации соответствующего абстрактного
последовательного  файла  также  должна быть вызвана процедура
ExplodingWindowStream.
     Для проверки ошибок, которые могут иметь место при выпол-
нении  процедуры  Store,  нужно  вызвать   функцию   GetStatus
абстрактного последовательного файла.

     Примеры

     uses
       OpCrt, OpRoot, OpFrame, OpWindow;
     var
       Win : RawWindow;
       S : BufIdStream;
       WinOpts : LongInt;
       I : Word;
     begin
       WinOpts := wBordered+wClear+wSaveContents+
                                              +wStoreContents;
       Win.InitCustom(30,    5,   50,   15,   DefaultColorSet,
       WinOpts);    Win.wFrame.AddHeader('Standard    Header',
       heTC);      Win.wFrame.AddScrollBar(frRR,     1,     9,
       DefaultColorSet); Win.Draw; for I := 2 to 10 do
         Win.wFastText('Hello Mars',  1, 5);
       Win.Erase;

       {Окно записывается в абстрактный последовательный файл}
       S.Init('RAWWIN.STM', SCreate, 1024);
       S.RegisterHier(RawWindowStream);
       S.Put(Win);
       S.Done;
       Win.Done;
     end.

     Создается объект  RawWindow,  добавляются  его  свойства,
объект заполняется текстом,  окно стирается, затем осуществля-
ется запись его в абстрактный последовательный файл, используя
метод  Put,  который косвенно вызывает процедуру Store объекта
RawWindow.  В пример включена  опция  wStoreContents,  поэтому
процедура Store будет производить запись содержимого окна Win.
     Для правильного осуществления проверки ошибок при исполь-
зовании абстрактных последовательных файлов следует обратиться
к описанию типа BufIdStream (в разделе OPROOT).

     begin
       WinOpts := wBordered+wClear+wSaveContents+
                                               +wStoreContents;
       Win.InitCustom(30, 5, 50, 15, DefaultColorSet, WinOpts);
       Win.Draw;
       for I := 2 to 10 do
         Win.wFastText('Hello Mars', I, 5);
       S.Init('RAWWIN.STM', SCreate, 1024);
       S.RegisterHier(RawWindowStream);
       S.Put(Win);
       ...
     end.

     Данный пример,  вероятно,  не даст ожидаемых результатов.
Опция wStoreContents включена, но содержимое окна не будет за-
писываться в абстрактный последовательный файл. Текст, находя-
щийся в окне,  ни разу не был скопирован в содержимое  объекта
ScreenRect. Нужно добавить обращение к процедуре Erase объекта
Win или перед записью в абстрактный последовательный файл  до-
бавить следующее:

     Win.StoreContents;

     См.также
     Frame.Store                ScreenRect.Store
     Load
     
     
     TweakSlider
     -----------
     Объявление
     {$IFDEF UseScrollBar}
     function TweakSlider(Posn : FrameEdgeType;
                                              0MousePosn : Byte;
                          UserVal : LongInt; Step : LongInt) :
                          LongInt;

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

     Описание
     В идеальном случае высокая разрешающая способность экрана
и  использование  арифметических  операций с плавающей запятой
обеспечивают почти точное соответствие между видимым положени-
ем  слайдера зоны прокрутки и связанной с ней пользовательской
величиной.  Поскольку система Object  Professionl  работает  в
текстовом  режиме  и избегает использовать реальную арифметику
для вычисления положения слайдера, то эти идеальные условия не
выполняются.
     Пользователь сталкивается  с  этой  проблемой,  когда  он
использует мышь ,  чтобы отметить положение на зоне прокрутки,
и использует клавиши мыши,  чтобы  прокрутить  изображение  до
этого   положения.   Подпрограмма   EvaluateMousePos   объекта
RawWindow вычисляет  эквивалентную  пользовательскую  величину
(например,  номер строки в текстовом файле). Программа прокру-
чивает изображение до этого  положения  и  вызывает  процедуру
DrawSlider  для того,  чтобы обновить слайдер в соответствии с
новой пользовательской величиной. Однако за счет ошибок округ-
ления и ограниченной разрешающей способности экрана слайдер не
совпадает с положением курсора мыши,  что не может  удовлетво-
рить пользователя.
     Функция TweakSlider может решить эту проблему.  Используя
сторону рамки (Posn),  абсолютную координату мыши (MousePosn),
которая соответствует положению на  зоне  прокрутки,  исходную
оценку  пользовательской  величины  (UserVal)  и  размер  шага
(Step),  функция TweakSlider возвращает новую пользовательскую
величину, которая располагает преобразованную позицию слайдера
насколько возможно близко к фактическому положению мыши. Функ-
ция TweakSlider производит итеративный поиск путем прибавления
или вычитания единиц шагаStep из величины UserVal до тех  пор,
пока не будет найдена наилучшая величина.
     Функция TweakSlider выполняет вторичное  действие,  также
направленное на достижение соответствия между поведением прог-
раммы и интересами пользователя. Она помещает "english" на лю-
бой выделенный фрагмент зоны прокрутки - например,  если новая
позиция мыши окажется справа от существующего слайдера, распо-
ложенного   на   горизонтальной  зоне  прокрутки,  то  функция
TweakSlider гарантирует,  что новый слайдер  будет  расположен
справа от существующего слайдера,  даже при наличии ошибок ок-
ругления,  за счет которых слайдер мог бы остаться на  прежнем
положении.  Эта  функция  особенно  важна  для  прокрутки  "по
кускам",  такой как прокрутка столбцов списка указаний или по-
лей экрана ввода данных.
     Если параметр MousePosn находится вне экранных границ зо-
ны  прокрутки,  то  функция  TweakSlider генерирует код ошибки
(epNonFatal+ecWinCoordsBad) и завершает выполнение.

     Пример

     repeat
       {...Ждет нажатия на клавиши мыши...}
       EvaluateMousePos;
       UserVal := PosResults(FramePos, HotCode);
       case HotCode of
         hsNone :
           {Находится вне активной области};
         hsBar :
           case FramePos of
             frRR :
               {На правой вертикальной зоне прокрутки}
               begin
                 UserVal := TweakSlider(FramePos,
                                        MouseLastY+MouseYLo,
                                        UserVal, 1);
                 {...Прокручивает окно до новой UserVal...}
                 DrawSlider(frRR, UserVal);
               end;
             {...Другие зоны прокрутки...}
         end;
       {...Другие HotCodes...}
     end;
   until Finished;

     Если мышь перемещается по правой зоне прокрутки, то вели-
чина UserVal,  возвращенная функцией PosResults,  представляет
собой относительное положение курсора  мыши  в  предварительно
определенном диапазоне зоны прокрутки.
     Функция TweakSlider корректирует данную величину  UserVal
таким образом,  что новое положение слайдера будет более точно
соответствовать положению курсора мыши.  Следует отметить, что
выражение  MouseLastY+MouseYLo  дает  абсолютную  координату Y
курсора мыши,  даже если активно ограниченное окно мыши. После
вычисления  скорректированной величины UserVal выполняются лю-
бые действия,  необходимые для обновления содержимого окна,  а
затем слайдер отображается на новой позиции.
     Пример практического  использования  функции  TweakSlider
приведен в описании объекта QkRefChart модуля OPQKREF, исполь-
зуемого в программе DESKPOP.

     См.также
     EvaluatePos                       PosResults
     
     
     Unzoom
     ------
     Объявление
     {$IFDEF UseAdjustableWindows}
     procedure Unzoom; virtual;

     Назначение
     Возвращает увеличенное окно к первоначальному размеру.

     Описание
     Если масштаб окна не был увеличен, то эта процедура мгно-
венно прекращает работу. В противном случае она возвращает ок-
но к координатам, которые оно имело до увеличения масштаба.

     Пример

     Win.Unzoom;
     Result := Win.GetLastError;
     if Result <> 0 then
       WriteLn('Failed to zoom window, Result = ', Result)
     else
       {...Используется окно, масштаб которого не увеличен...};

     Окно,масштаб которого был увеличен, возвращается к своему
нормальному размеру.  В описании процедуры Zoom приведена пол-
ная программа, показывающая увеличение масштаба окна и возвра-
щение его к первоначальному размеру.

     См.также
     AdjustWindow                      Zoom

