
  Глава 5. Текстовые редакторы и средства просмотра файлов.

                          А. Обзор.

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

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

     Юнита OPEDITOR содержит производный от  объекта  MemoFile
объект  TextEditor,  который  предоставляет  расширенный набор
операций редактирования:  команды работы с блоками текста, ко-
манды поиска и замены, маркеры текста (иногда их называют зак-
ладками),  "разумная табуляция" и режим автоматического отсту-
па. Фактически,  TextEditor выполняет почти все, что может вы-
полнить встроенный текстовый редактор Turbo  Pascal,  и  кроме
этого имеет некоторые дополнительные возможности.

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



            B. OPMEMO: Базовый текстовый редактор.

     Этот раздел делится на три части. В первой описывается
самый низкоуровневый объект Object Professional, Memo. Во вто-
рой -  рассматривается производный от Memo объект MemoFile.  В
третьей части описаны процедуры и функции, предназначенные для
взаимодействия с OPMEMO.

     1. Memo.

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

     Если вы  посмотрите  телефонную  книгу,  реализованную  в
DESKPOP,  то увидите, что она удовлетворяет данному требованию
с помощью поля Notes. Вы можете также заметить, что данное по-
ле имеет некоторые ограничения на объем данных,  которые могут
храниться в данном поле:  поле не может содержать больше четы-
рех  строк,  каждая  из  которых в свою очередь не может иметь
длину больше 40 символов.  Это ограничение возникает от  того,
что  содержимое  поля  Notes хранится в массиве array[1..4] of
string[40],  и редактируется при помощи многострочного тексто-
вого редактора из OPFIELD. Мы конечно могли бы увеличить коли-
чество строк и их максимальную длину,  но  это  привело  бы  к
чрезвычайно неэффективному использованию памяти,  т.к.  пустые
строки требуют столько же места,  сколько и заполненные.  Если
нужно существенно увеличить размер и число строк, то необходи-
мо перейти к  другому  методу  использования  памяти,  который
предполагает  хранение  различного числа строк различной длины
друг за другом, в массиве array[1..n] of Char, и к более слож-
ному  редактору,  который позволяет обрабатывать такие строки.
Именно для этой цели был разработан объект Memo.

     Редактор Memo может обрабатывать текстовые данные, храня-
щиеся в буфере фиксированной длины (<=64521 байт). Каждая
строка в буфере ограничена символами возврат каретки / перевод
строки (^M^J), а за последней строкой в буфере следует символ
^Z. Хотя этот формат аналогичен формату текстовых файлов Turbo
Pascal, можно также редактировать и двоичные данные.

     Теперь, после ознакомления с тем, что из себя представля-
ет объект Memo,  мы можем посмотреть,  как его можно использо-
вать. Начнем с простого примера программы.

     program MemoExample; (EXMEMO.PAS)
     uses
        OpCrt, OpRoot, OpCmd, OpFrame, OpWindow, OpMemo;
     const
        BufSize = 5000;
     var
        M:Memo;
        Buffer:array[1..BufSize] of Char;
        ExitCommand:Word;
     begin
        { Указать пустой буфер }
        Buffer[1]:=^Z;
        { Инициализировать редактор параметрами окна }
        if not M.InitCustom(2,4,79,24,       { Координаты окна }
                            DefaultColorSet, { Цвета }
                            DefWindowOptions or
                                   wBordered,{ Параметры окна }
                            BufSize,         { Размер буфера }
                            @Buffer)         { Адрес буфера }
        then begin
           WriteLn('Ошибка при инициализации Memo. Status=',InitStatus);
           Halt;
        end;
        { Использовать встроенные программы обработки состояния и ошибок }
        M.SetStatusProc(MemoStatus);
        M.SetErrorProc(MemoError);
        repeat
          M.Process;
          ExitCommand := M.GetLastCommand;
          case ExitCommand of
             ccQuit, ccError : { Ничего не делать }
             { ...Обработка пользовательских команд выхода... }
          end;
       until (ExitCommand = ccQuit) or (ExitCommand = ccError);
       M.Erase;
       M.Done;
       ClrScr;
     end.

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

     Следующим шагом  необходимо   инициализировать   редактор
Memo.   Даже  при  использовании  определенного  по  умолчанию
ColorSet (из OPCRT),  нам придется воспользоваться конструкто-
ром InitCustom, поскольку мы хотим, чтобы окно редактора имело
рамку. Хотя для всех объектов, базирующихся на окнах, парамет-
ры  конструктора одинаковы (координаты окна,  цвета и парамет-
ры),  Memo.InitCustom имеет два дополнительных параметра. Пер-
вый определяет размер текстового буфера,  а второй - адрес бу-
фера.

     Если вы посмотрите на вызов InitCustom, то можете заме-
тить, что второй параметр определяет, что окно редактора начи-
нается с 4 строки экрана, помещая рамку на третьей строке. При
этом  в  верхней  части экрана остаются свободными две строки,
которые можно использовать для других целей,  в  нашем  случае
для строки  состояния (строка 2) и строки сообщений об ошибках
(строка 1).  Строка состояния показывает кроме всего  прочего,
текущее положение курсора, с помощью процедуры MemoStatus, ко-
торая определяется  с  использованием  метода   SetStatusProc.
MemoError, определяемая с помощью SetErrorProc, наследуется из
CommandWindow.

     Теперь можно начать редактирование.  Основной цикл  прог-
раммы делает только две вещи: вызывает метод Process для отоб-
ражения окна редактора и обработки команд редактирования и вы-
зывает GetLastCommand для определения команды выхода из редак-
тора.  В этом простом случае используются только две команды -
ccQuit, которая означает конец редактирования,  и ccError, ко-
торая показывает, что в процессе редактирования возникла ошиб-
ка.  По  получении одной из этих команд процесс редактирования
прекращается и происходит выход из основного цикла.

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

     Хотя данный пример не является типичным примером,  он ил-
люстрирует основные шаги необходимые, для установки параметров
окна Memo  и для редактирования с его помощью.  Более типичным
примером был бы возможно пример,  где редактируемый текст  яв-
лялся бы частью более сложной структуры данных, например полем
некоторой записи.  Несмотря на то, что ENTRY.PAS был написан в
качестве примера на OPENTRY, он точно подходит в качестве при-
мера на OPMEMO.

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

                   Команды редактирования.
     
     OPMEMO поддерживает практически полный набор  команд  ре-
дактирования,  разбитых на категории,  которые приведены ниже.
Для каждой команды первая строка содержит, имя команды, за ко-
торым следуют клавиши,  которым она соответствует. Во второй и
последующих  строках  содержится  короткое  описание действий,
производимых данной командой.  Набор клавиш,  используемый  по
умолчанию для вызова команд, содержится в глобальной константе
MemoKeySet.

     ccLeft                  <Left>, <CtrlS>
     Курсор перемещается на одну позицию влево. Если курсор
находится в первой позиции и действует опция WrapAtLeft, он
перемещается на последний символ предыдущей строки. Если опция
выключена, то курсор не перемещается.

                 Команды перемещения курсора.

     ccRight                 <Right>, <CtrlI>
     Курсор перемещается на одну позицию вправо.

     ccWordLeft              <CtrlLeft>, <CtrlA>
     Курсор перемещается на одно слово влево. Если курсор на-
ходится в начале строки, то он перемещается в конец предыду-
щей.

     ccWordRight             <CtrlRight>, <CtrlF>
     Курсор перемещается на следующее слово. Если курсор нахо-
дится в конце строки, то он перемещается в начало следующей.

     ccEnd                   <End>, <CtrlQ><D>
     Курсор перемещается в конец строки.

     ccHome                  <Home>, <CtrlQ><S>
     Курсор перемещается в начало строки.

     ccUp                    <Up>, <CtrlE>
     Курсор перемещается на одну строку вверх.

     ccDown                  <Down>, <CtrlX>
     Курсор перемещается на одну строку вниз.

     ccScrollUp              <CtrlW>
     Прокрутить изображение на одну строку вверх.

     ccScrollDown            <CtrlZ>
     Прокрутить изображение на одну строку вниз.

     ccPageUp                <PgUp>, <CtrlR>
     Прокрутить изображение на одну страницу вверх.

     ccPageDn                <PgDn>, <CtrlC>
     Прокрутить изображение на одну страницу вниз.

     ccScreenTop             <CtrlHome>, <CtrlQ><E>
     Курсор перемещается в первую строку окна редактора.

     ccScreenBot             <CtrlEnd>, <CtrlQ><X>
     Курсор перемещается в последнюю строку окна редактора.

     ccTopOfFile             <CtrlPgUp>, <CtrlQ><R>
     Перемещает курсор в начало файла.

     ccEndOfFile             <CtrlPgDn>, <CtrlQ><C>
     Перемещает курсор в конец файла.

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

     ccDel                   <Del>, <CtrlG>
     Удаляет символ под курсором.

     ccBack                  <Bksp>, <CtrlH>, <CtrlBksp>
     Удаляет символ слева от курсора. Если курсор находится в
первой позиции, то строка сливается с предыдущей.

     ccDelLine               <CtrlY>
     Удаляет текущую строку.

     ccDelEol                <CtrlQ><Y>
     Удаляет символы от курсора до конца строки.

     ccDelWord               <CtrlT>
     Удаляет слово справа от курсора. Если курсор находится в
конце строки, то следующая строка присоединяется к текущей.

     ccSelect                <Enter>, <CtrlM>
     Начинает новую строку.

     ccInsertLine            <CtrlN>
     Вставляет в позиции курсора новую строку.

     ccTab                   <Tab>, <CtrlI>
     Перемещает курсор в следующую позицию табуляции. Если
включен режим вставки, то весь текст справа от курсора будет
сдвинут на следующую позицию табуляции.

     ccCtrlChar              <CtrlP>
     Вставляет управляющий символ. Например, для вставки ^G вы
должны ввести <CtrlP><CtrlG>. Эта команда не работает, если
видео аттрибуты  для  управляющих  символов  те же,  что и для
обычного текста и если включен tcMapCtrls.

                    Переключатели режимов.

     ccIns                   <Ins>, <CtrlV>
     Включает и выключает режим вставки. Курсор в виде блока
означает режим вставки, тонкий курсор показывает режим замены.

     ccIndent                <CtrlO><I>
     Включает режимы автоматического выравнивания. В режиме
автоматического выравнивания  при  нажатии  <Enter>  в  режиме
вставки  происходит вставка строки,  первая позиция которой та
же, что и в предыдущей строке.  Кроме этого,  режим  автомати-
ческого  выравнивания  влияет  на  форматирование текста,  при
включенном переносе слов - новая строка имеет то же  смещение,
что и предшествующая и, следовательно, влияет на поведение ко-
манд форматирования (<CtrlB> и <CtrlK><G>).

     ccWordWrap              <CtrlO><W>
     Включает и выключает режим переноса. Когда режим переноса
включен, любая попытка вставить или добавить текст  за  правой
границей текста  вызовет  вставку  новой строки и перенос всех
слов, находящихся за правой границей текста в новую строку.

                    Форматирование текста.

     ccReformatP             <CtrlB>
     Переформатировать текущий абзац. Эта команда игнорируется
при выключенном переносе слов.

     ccReformatG             <CtrlK><G>
     Переформатирует весь текстовый буфер (глобальное перефор-
матирование). Эта команда не производит никаких действий при
выключенном переносе слов. Данной командой пользуйтесь с осто-
рожностью!

                          Остальные.

     ccRestore               <CtrlQ><L>
     Восстанавливает исходное содержимое текущей строки.

     ccHelp                  <F1>, <ClickBoth>
     Помощь. Если пользовательская подпрограмма выдачи спра-
вочной информации      была      определена      с     помощью
MemoCommands.SetHelpProc,  нажатие F1 приведет к  вызову  этой
подпрограммы. В противном случае эта команда не делает ничего.
Если подпрограмма выдачи справочной информации определена,  то
Memo  передаст  ей три параметра:  ucMemo,  @Self,  и значение
используемое в качестве  индекса  оконной  справочной  системы
(см.  CommandWindow.SetHelpIndex),  который по умолчанию равен
0.

     ccQuit                  <Esc>, <CtrlBreak>, <ClickRight>
     Завершение редактирования.

     ccMouseSel              <ClickLeft>
     Перемещает курсор в позицию, определенную мышью. Эта ко-
манда может использоваться для прокрутки окна при нажатии в
строке прокрутке.

     В дополнение к приведенным выше командам и к  стандартным
командам выхода (ccError и команда выхода,  определяемая поль-
зователем ccUserO),  Process распознает две другие специальные
команды - ccNewFile и ccSaveFile,  которые не связаны с клави-
шами по умолчанию.  Это "ловушки"  объекта  Memo  для  взаимо-
действия с программой,  которая его использует. Они рассматри-
ваются как команды выхода и  предназначены  для  пользователя,
который при необходимости может их реализовать.

                  Редактирование поля Memo.

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

     Самое важное то, что метод Process подразумевает, что
предварительно был вызван процесс ReinitBuffer для инициали-
зации внутренних переменных, которые содержат информацию о
содержимом текстового буфера, число символов в нем, число
строк и т.д. Конструктор объекта Memo вызывает его, поэтому в
нашем примере мы явно не вызывали его. Однако во многих прик-
ладных программах один экземпляр объекта Memo инициализиру-
ется в начале программы и затем используется много раз. В та-
ких случаях содержимое текстового буфера должно сильно отли-
чаться при разных вызовах Process, что делает необходимым вы-
зов ReinitBuffer, как показано ниже:

     M.ReinitBuffer;
     repeat
        M.Process;
        ExitCommand := M.GetLastCommand;
        case ExitCommand of
          ccQuit, ccError : { Ничего не делать }
          { ...Обработка пользовательских команд выхода... }
        end;
     until (ExitCommand = ccQuit) or (ExitCommand = ccError);

     Здесь приведен вид основного цикла, как он должен выгля-
деть при многократном использовании. В качестве хорошего при-
мера такого использования редактора смотрите ENTRY.PAS.

     При работе с полями типа memo часто необходимо ограни-
чить число и/или длину строк. Для этих целей в объекте Memo
имеются методы SetLineLimit и SetMaxLength. Смотрите их описа-
ние.

     Реже возникает необходимость использовать Memo только
для отображения  информации,  чтобы  дать пользователю ознако-
миться с содержимым поля memo, но не дать возможности изменить
его.  Для этого Memo имеет опцию meReadOnly,  которая временно
отключает команды редактирования,  которые могут изменить  со-
держимое буфера.  (Список таких команд содержится в глобальной
константе DisallowedInReadOnlyMode.) Эта  опция  соответствует
опции esReadOnly для EntryScreen из OPENTRY.

                         Константы.

     BadMemoOptions : LongInt = meModifaed+meReformating;

     Параметры, используемые  для  внутренних  нужд,  не могут
быть изменены вызовом meOptionsOn или meOptionsOff.

     DisallowedInReadOnlyMode : set of Byte =
       [ccChar, ccCtrlChar, ccSelect, ccInsertLine, ccBack,
        ccDel, ccRestore, ccDelEol, ccDelLine, ccDelWord,
        ccIns, ccTab, ccIndent, ccWordWrap, ccReformatP,
        ccReformatG];

     Эти команды отключаются при работе редактора в режиме
"только для чтения" (используя опцию meReadOnly), поскольку
могут привести к модификации отображаемого текста.

     DefMemoOptions : LongInt = meInsert+meIndent+
       meWordWrap+meMapCtrls+meMousePage+meMakeBackups;

     Опции, используемые по умолчанию в Memo и MemoFile.

     DefTabDelta : Byte = 8;

     Исходное расстояние табуляции.

     DefMaxLength : Byte = 254;

     Максимальная длина строки по умолчанию.

     meInsert         = $00000001;   { Да, в режиме вставки }
     meIndent         = $00000002;    { Да, в режиме сдвига }
     meReadOnly       = $00000004;
                         { Да, в режиме "только для чтения" }
     meWordWrap       = $00000008;   { Да, в режиме переноса}
     meDeleteJoins    = $00000010;   { Да, если при Del воз-}
                         { можно слияние строк              }
     meModifaed       = $00000020;   { Да, если произошло   }
                         { редактирование. Только для внут- }
                         { реннего использования            }
     meIndentPara     = $00000040;   { Сдвигать начало па-  }
                         { раграфа.                         }
     meMousePage      = $00000080;   { Нажатие мыши на па-  }
                         { нели прокрутки приведет к про-   }
                         { крутке страницы.                 }
     meAllowTrunk     = $00000100;   {Считывать часть файла?}
     meMapCtrls       = $00000200;   { Помечать управляющие }
                         { символы                          }
     meMakeBackups    = $00000400;   { Сохранять старые фай-}
                         { лы?                              }
     meStreamReload   = $00000800;   { Перезагружать преды- }
                         { дущий файл при активизации       }
                         { MemoFile, сохраненной в потоке?  }
     meReformating    = $00001000;   { Флаг устанавливается }
                         { при переформатировании. Для      }
                         { внутреннего использования.       }
     meNewFile        = $00002000;   { Загружен новый файл. }
     meDeallocate     = $00004000;   { Освобождать буфер    }
                         { при вызове Done?                 }
     meWrapAtLeft     = $00008000;   { Переходить на преды- }
                         { дущую строку при нажатии на Left,}
                         { если курсор на первой позиции    }
     meNoCtrlZ        = $00010000;   { Отменяет запись на   }
                         { диск символа ^Z.                 }

     Это параметры, влияющие на поведение Memo и MemoFile.
meInsert выбирает режим вставки, в котором текст вставляется с
позиции курсора  вместо  того,  чтобы  забивать  существующий.
meIndent выбирает режим автоматического сдвига,  в котором при
нажатии на Enter происходит переход на новую строку  в  ту  же
позицию,  что и начало предыдущей строки.  meReadOnly выбирает
режим,  в котором текст в текстовом буфере не может быть изме-
нен.  meWordWrap  разрешает  перенос  слов,  при  этом попытка
вставки или добавление текста за правой  границей  приведет  к
переносу в новую строку всех слов,  не поместившихся на преды-
дущей строке.  При включенной meDeleteJoins  нажатие  на  Del,
когда курсор находится в конце строки,  приведет к подсоедине-
нию к ней следующей строки, начиная от позиции курсора.

     meMidifaed это внутренний флаг, который устанавливается
при изменении содержимого текстового буфера. Если пользователь
восстановил строку перед тем, как покинуть ее, то флаг получа-
ет  состояние,  которое было перед началом редактирования этой
строки. meIndentPara влияет на поведение команд переформатиро-
вания. Если  выключен,  то  концом одного и началом следующего
параграфа рассматривается пустая строка. Если включен, то про-
белы  в начале следующей строки сигнализируют о начале следую-
щего абзаца.  meMousePage определяет,  что  произойдет,  когда
пользователь  "кликнет" на стрелке вверх или вниз строки прок-
рутки. Если опция выключена, то окно редактора будет прокруче-
но на одну строку, если включена, то на полную страницу.

     meAllowTrunc влияет на поведение MemoFile. Если эта опция
включена, и у ReadFile запрашивается загрузка файла, который
не помещается в текстовый буфер, то ReadFile загрузит столь-
ко, сколько      сможет      и      выдаст      предупреждение
(epWarning+ecFileTruncated). Если опция выключена, то ReadFile
не  будет  считывать  файл  и  сгенерирует  фатальную  ошибку
(epFatal+ecFileTooLarge).  meMapCtrls  определяет,  как  будут
отображаться управляющие символы (кроме ^J,  ^M и ^Z,  которые
обычно  подавляются),  если они встретятся в текстовом буфере.
Если она включена,  то при появлении управляющего  символа  он
будет отображен  символом в верхнем регистре (^A как 'A') дру-
гим цветом.  meMakeBackups влияет на работу MemoFile.SaveFile.
Если опция включена,  то при сохранении файла, если он уже су-
ществует, он будет переименован (ему будет присвоено  расшире-
ние BAK)  перед  тем,  как  на  диск  будет записана новая его
версия.  Если данная опция выключена,  то новая  версия  файла
затрет старый файл.

     meStreamReload влияет на поведение MemoFile.Load и
MemoFile.Store. Если данная опция включена, то она сохраняет
имя редактируемого файла в потоке. При следующем вызове Load
она попытается перезагрузить файл,  имя которого было сохране-
но. meReformating это внутренний флаг, который устанавливается
при переформатировании абзаца.  Он сигнализирует что  меняется
изображение  и  что  сообщения об ошибках должны быть временно
подавлены.     meNewFile     это     флаг,     устанавливаемый
MemoFile.ReadFile при загрузке в текстовый буфер нового файла.
Он предназначен для того,  чтобы можно было узнать, об измене-
нии имени файла и поменять его в строке состояния.  После мо-
дификации строки состояния необходимо сбросить этот флаг.

     meDeallocate - это  флаг,  предназначенный  исключительно
для внутреннего использования.  Он устанавливается конструкто-
ром MemoFile при выделении буфера и сигнализирует  деструктору
(Done),  что  он должен освободить буфер.  Вы можете самостоя-
тельно установить этот флаг,  если вы выделили буфер самостоя-
тельно и хотите,  чтобы деструктор освободил его. meWrapAtLeft
определяет, что произойдет, если нажать Left, когда курсор на-
ходится в первой позиции строки.  Если эта опция включена,  то
курсор переместится на последнюю позицию предыдущей строки. В
противном  случае  он останется на месте.  meNoCtrlZ влияет на
MemoFile.SaveFile.  Если он выключен (по умолчанию),  на  диск
будет записан символ ^Z,  который отмечает конец буфера.  Если
флаг установлен, то ^Z не будет записан на диск.

     MemoKeyMax = 250;
     MemoKeyID  : string[16] = 'opmemo key array';
     MemoKeySet : array[0..MemoKeyMax] of Byte = (...);
     MemoCfgEnd : Byte =0;

     MemoKeyID - это идентификационная строка,  отмечающая на-
чало области данных конфигурации OPMEMO.  MemoCfgEnd  отмечает
конец  области  данных конфигурации.  Между ними лежит область
MemoKeySet -  таблица   команд,   используемая   MemoCommands.
MemoKeyMax содержит максимальный допустимый индекс в этой таб-
лице.

     meWordDelims : CharSet = [^I, ' ', '.', ',' ':', ';',
                               '?', '!', '*', '(', ')', '[',
                               ']', '{', '}', '<', '>', '+',
                               '-', '/', '\', '''', '$', '=',
                               '^', '#'];

     Этот набор содержит символы, которые рассматриваются как
разделители слов в различных командах,  оперирующих со словами
(ccWordLeft,  ccWordRight, ccDelWord). В конце этот набор дол-
жен содержать ''.

                            Типы.

     MemoPtr = ^Memo;
     Memo =
        object(ComandWindow)
        ...
        meBufSize : Word;        { размер текстового буфера }
        meMaxLines: Integer;     { максимальное число вводи-}
                                 { мых строк                }
        meTabDelta: Byte;        { расстояние между колон-  }
                                 { ками табуляции           }
        meMargin: Byte;          { правая граница  для пере-}
                                 { носа слов                }
        meTotalBytes: Word;      { число символов, находя-  }
                                 { щееся в буфере           }
        meTotalLines: Integer;   { число находящихся в бу-  }
                                 { фере строк               }
        meCurLine: Integer;      { номер текущей строки     }
        meCurCol: Byte;          { номер текущей позиции    }
        ...
     end;

     Редактор memo.  Поля данных,  приведенные выше,  не могут
быть модифицированы непосредственно.  Они приведены для  того,
чтобы  вы  могли  использовать их в процедурах,  отслеживающих
состояние.  Отметим,  что  Memo  поддерживает  "границу  безо-
пасности" длиной 2 байта,  означающую, что пользователь не мо-
жет ввести больше, чем meBufSize-2 байт текста. (Это позволяет
избежать проблем с переполнением буфера при разделении слишком
длинных строк.  Поэтому при определении свободного места в бу-
фере вы должны использовать meTotalBytes и meBufSize-2.

     MemoBufPtr = ^MemoBuf;
     MemoBuf = array[1..65521] of Char;

     Буфер для хранения редактируемого текста. Это максималь-
ный размер буфера, в действительности его размер может быть
другим.

     MemoStatusProc = procedure (MP:MemoPtr);

     Пользователь может написать процедуру, отображающую
состояние (текущая строка,  колонка,  и т.п.). MP - это указа-
тель на Memo/MemoFile (TextEditor), которые производят вызов.

                         Переменные.

     MemoCommands : CommandProcessor;

     Используемый по умолчанию процессор команд для Memo и
MemoFile.

Load
─────────────────────────────────────────────────────────────
Объявление

     constructor Load(var S:IdStream);

Функция

     Загрузка из потока memo.

Описание

     S -  это инициализированный объект-поток (файл,  открытый
для чтения).  S может быть любым производным от IdStream, нап-
ример DosIdStream, BufIdStream и MemIdStream.

     Load считывает следующую последовательность байт из пото-
ка S. Эти байты должны быть выведены предыдущим вызовом
Memo.Store.

     Если текстовый буфер был зарегистрирован перед вызовом
Store, и зарегистрирован снова перед вызовом Load, то Load
инициализирует Memo  для использования буфера,  адрес которого
был зарегистрирован. Необходимо, чтобы новый буфер имел тот же
размер,  что  и предыдущий,  и за это в данном случае отвечает
программист.

     Если буфер не был зарегистрирован в обоих случаях, Load
сделает одно из двух, в зависимости от состояния флага
meDeallocate. Если флаг установлен, Load попытается выделить
буфер в "куче", если этого сделать невозможно, то Load завер-
шается по ошибке и InitStatus получет значение
epFatal+ecOutOfMemory. Если флаг не установлен, Load сразу же
завершается и InitStatus получает значение
epFatal+ecIdNotRegistered.

     Процедура регистрации потока для Memo : MemoStream.

Пример

     uses
        OpCrt, OpRoot, OpCmd, OpFrame, OpWindow, OpMemo;
     const
        BufSize = 5000;
     var
        M:Memo;
        S:BufIdStream;
        Buffer:array[1..BufSize] of Char;
     begin
        Buffer[1] := ^Z;
        S.Init('MEMO.STM',SOpen,1024);
        S.RegisterHier(MemoStream);
        S.RegisterPointer(1000,@Buffer);
        S.Get(M);
        if S.GetStatus <> 0 then
           Halt;
        M.Process;
        M.Erase;
        M.Done;
     end.

     В этом примере мы загружаем M из потока, созданного
примером Store, с помощью метода Get, относящегося к потоку,
который неявно вызывается Memo.Load. Заметим, что адрес буфера
зарегистрирован с кодом 1000 так же, как и в примере Store.

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

Смотри также

     CommandWindow.Load      Store

meOptionsAreOn
─────────────────────────────────────────────────────────────
Объявление

     function meOptionsAreOn(OptionFlags:LongInt):Boolean;

Функция

     Возвращает True, если все указанные опции включены.

Описание

     Этот метод возвращает True, если все указанные опции
включены.

Пример

     if M.meOptionsAreOn(meWordWrap) then
        M.meOptionsOff(meWordWrap)
     else
        M.meOptionsOn(meWordWrap);

     Переключает опцию переноса слов.

meOptionsOff
─────────────────────────────────────────────────────────────
Объявление

     procedure meOptionsOff(OptionFlags:LongInt);

Функция

     Выключает указанную опцию.

Описание

     Данный метод выключает указанную опцию (опции),  исключая
те, которые   относятся  к  BadMemoOptions  (см.  выше  раздел
"Константы").

Пример

     M.meOptionsOff(meWordWrap+meIndent);

     Выключает перенос слов и режим автоматического сдвига.

meOptionsOn
─────────────────────────────────────────────────────────────
Объявление

     procedure meOptionsOn(OptionFlags:LongInt);

Функция

     Включает указанную опцию.

Описание

     Данный метод  включает указанную опцию (опции),  исключая
те,  которые  относятся  к  BadMemoOptions  (см.  выше  раздел
"Константы").

Пример

     M.meOptionsOn(meWordWrap+meIndent);

     Включает перенос слов и режим автоматического сдвига.

Process
─────────────────────────────────────────────────────────────
Объявление

     procedure Process; virtual;

Функция

     Обработка команд редактирования.

Описание

     Метод Memo  Process следует основной модели,  описанной в
CommandWindow.Process, со следующими добавлениями и исключени-
ями:

     Она обрабатывает  команды  редактирования,  приведенные в
разделе "Команды редактирования".

     Process вызывает  пользовательскую  процедуру   обработки
состояния (если она есть) перед запросом у пользователя следу-
ющей команды.

Пример

     Смотрите пример в начале данной главы.

Смотрите также

     CommandWindow.Process             SetStatusProc

ReinitBuffer
─────────────────────────────────────────────────────────────
Объявление

     procedure ReinitBuffer;

Функция

     Повторная инициализация внутренних переменных при измене-
нии содержимого буфера.

Описание

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

     ReinitBuffer чаще  всего  используется в прикладных зада-
чах, типа приведенной в ENTRY.PAS,  где используется один  эк-
земпляр Memo, а содержимое текстового буфера может меняться от
одного вызова Process до другого.

     Отметим, что после вызова MemoFile.ReadFile вызывать дан-
ный метод не нужно, поскольку это делается автоматически.

Пример

     repeat
        M.Process;
        ExitCommand := M.GetLastCommand;
        case ExitCommand of
           ccQuit : if M.meOptionsAreOn(meModifaed) then
                    { Сохранить это поле memo }
           ccUser0 : begin
                        Buffer[1] := ^Z;
                        M.ReinitBuffer;
                     end;
           { ... Другие пользовательские команды выхода ...}
         end;
     until (ExitCommand = ccQuit) or (ExitCommand = ccError);

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

Смотрите также

     MemoFile.ReadFile


SetCtrlAttr
─────────────────────────────────────────────────────────────
Объявление

     procedure SetCtrlAttr(Color, Mono : Byte);

Функция

     Устанавливает атрибуты управляющих символов.

Описание

     Данный метод позволяет вам установить атрибуты, с которы-
ми будут   отображаться   управляющие   символы.   Если   флаг
meMapCtrls сброшен, то эти атрибуты должны быть теми же, что и
атрибуты обычного текста.  Если же он установлен (что устанав-
ливается по умолчанию),  атрибуты должны отличаться, для того,
чтобы пользователь мог отличить ^A от 'A' и т.п.

Пример

     M.meOptionsOn(meMapCtrls);
     M.SetCtrlAttr($03,$70);

     Управляющие символы  будут  в  данном случае отображаться
голубыми на черном фоне на цветных мониторах  и  наоборот  для
монохромных.

Смотрите также

     InitCustom

SetLineLimit
─────────────────────────────────────────────────────────────
Объявление

     procedure SetLineLimit(N:Integer);

Функция

     Определяет максимальное число строк.

Описание

     Данный метод позволяет вам ограничить число строк,  кото-
рые может ввести пользователь.  По умолчанию максимальное зна-
чение равно 32767,  которое подразумевает отсутствие ограниче-
ния (если буфер может содержать 65521 символ,  один из которых
это ^Z,  то  максимально  буфер  может содержать 65520/2=32760
пустых строк).

     Отметим, что две команды переформатирования  (ccReformatP
и ccReformatG) не соблюдают данное ограничение.  Почему? Пото-
му что запуск этих команд с соблюдением ограничения может при-
вести к появлению недостижимой части буфера:  число строк, по-
лучившихся после форматирования, вычисляемое в процессе форма-
тирования,  приведет  к  удвоению  времени выполнения команды.
(Остановка форматирования при достижении максимального  значе-
ния может  уменьшить  его,  но  переформатирование  оставшихся
строк,  увеличит общее время).  Обычно это не составляет проб-
лем,  кроме тех случаев,  когда конец легко достижим.  В таких
случаях решением может служить отключение команд  переформати-
рования,  что  делается  присвоением соответсвующим последова-
тельностям клавиш значения ccNone (см. документацию по OPCMD).

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

Пример

     M.SetLineLimit(15);

     Устанавливает максимальное число строк  равное  15.  Если
была инсталлирована  процедура  обработки  ошибок  (с  помощью
SetErrorProc), то  она  будет  вызвана,  если  вы  попытаетесь
ввести больше 15 строк. Если установлена стандартная процедура
обработки ошибок, то она подаст звуковой сигнал.

SetMaxLength
─────────────────────────────────────────────────────────────
Объявление

     procedure SetMaxLength(Len : Byte);

Функция

     Устанавливает максимальную длину строки.

Описание

     Этот метод позволяет вам  определить  максимальную  длину
строк, которую  можно  ввести  в текстовый буфер.  Значение по
умолчанию (DefMaxLength) определяет абсолютный максимум,  рав-
ный 254.  Если  необходимо  изменить это значение,  то вызвать
данный метод нужно перед тем, как окно Memo будет отображено в
первый раз. После того, как текст из буфера был отображен, из-
менять максимальную длину строки не стоит.

     Установка данного значения имеет  два  эффекта.  Главное,
оно определяет максимальное число символов,  которое пользова-
тель может ввести,  находясь на одной строке,  включая слияние
строк  и добавление текста к существующим строкам.  Менее оче-
видно то,  что строка может оказаться слишком  длинной,  чтобы
можно было ее разделить, пока курсор находится на этой строке.
(Этому следуют редакторы Borland). Если возможно, такие строки
делятся на границе слова,  находящейся на или перед максималь-
ной допустимой позицией, если невозможно, то строка делится по
позиции, предшествующей максимальной. В обоих случаях процеду-
ре     обработки     ошибок     передается      предупреждение
(epWarning+ecLineTooLong).  Если  при этом текстовый буфер уже
заполнен,  то два символа перед последней позицией  забиваются
символами  перевод строки,  возврат каретки (^M^J),  поскольку
единственно возможной альтернативой является рассмотрение оши-
бочного состояния, как фатального.

     Важное замечание:  При использовании данного метода необ-
ходимо быть уверенным,  что правая граница  меньше  или  равна
максимальной длине строки. Смотрите описание SetRightMargin.

Пример

     M.SetMaxLength(80);

     Устанавливает максимальную  длину  строк равную 80 симво-
лам.

SetRightMargin
─────────────────────────────────────────────────────────────
Объявление

     procedure SetRightMargin(RM : Byte);

Функция

     Устанавливает правую границу.

Описание

     Этот метод позволяет вам определить  позицию,  с  которой
должен начинаться перенос слов.  Например, если правая граница
определена в 78, то попытка ввести любой текст, за исключением
пробелов, за  78  позицией  приведет к тому,  что строка будет
разбита на границе слова,  самой ближней слева к правой грани-
це. По  умолчанию конструктор Memo устанавливает правую грани-
цу, равную ширине окна минус один.  (т.е., если окно имеет ши-
рину 80, то правая граница будет равна 79).

     Очень важное  замечание:  Вы никогда не должны устанавли-
вать правую границу равную 0  или  большую,  чем  максимальная
длина  строки  (по умолчанию 254 символа).  Пренебрежение этим
предупреждением может привести к непредсказуемым результатам.

Пример

     M.SetRightMargin(70);

     Устанавливает правую границу в позиции 70.

SetStatusProc
─────────────────────────────────────────────────────────────
Объявление

     procedure SetStatusProc(MSP : MemoStatusProc);

Функция

     Устанавливает процедуру состояния.

Описание

     Этот метод позволяет вам  определить  процедуру,  которая
будет вызываться перед каждым вызовом MemoCommands.GetCommand,
которая, в свою очередь,  вызывается для получения команд  ре-
дактирования от пользоваталя. Подпрограмма должна иметь следу-
ющую форму:

     {$F+}
     procedure MyStatusProc(MP:MemoPtr);
     begin
     end;

     Она должна   компилироваться  с  моделью  FAR  (используя
{$F+}, и  не  должна  вкладываться  внутрь  другой  процедуры.
Memo/MemoFile/TextEditor производят вызов этой процедуры,  пе-
редают в качестве параметра @Self.

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

     Заметим, что  в TextEditor,  который является производным
объектом от Memo,  процедура состояния вызывается кроме  этого
еще в двух случаях: непосредственно после загрузки нового фай-
ла по запросу пользователя (в случае, если процедура состояния
отображает имя редактируемого файла), и во время поиска строки
(чтобы пользователь  мог  следить  за  процессом  поиска).   В
EDITOR.PAS приведен пример процедуры состояния для TextEditor.

Примеры

     M.SetStatusProc(MemoStatus);

     Делает активной  встроенную в OPMEMO процедуру состояния,
которая выводит информацию в строке StatusRow (по умолчанию  =
2), используя  атрибуты  по  умолчанию (белое на черном фоне и
для цветного и для монохромного дисплея).

     StatusRow := ScreenHeight;
     StatusColor := $0E;
     StatusMono := $0F;
     M.SetStatusProc(MemoStatus);

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

Смотрите также

     MemoStatus

SetTabSize
─────────────────────────────────────────────────────────────
Объявление

     procedure SetTabSize(TabSize : Byte);

Функция

     Устанавливает шаг табуляции.

Описание

     Этот метод  позволяет  вам  определить шаг табуляции.  По
умолчанию устанавливается 8 (DefTabDelta), определяя таким об-
разом колонки табуляции на позициях 1,9,17 и т.д.

Пример

     M.SetTabSize(5);

     Устанавливает, что  колонки  табуляции  будут  проходит с
каждой пятой позиции (1,6,11 и т.д.).

Store
─────────────────────────────────────────────────────────────
Объявление

     procedure Store(var S : IdStream);

Функция

     Выводит Memo в поток.

Описание

     S - это правильно инициализированный  объект  типа  поток
(обычно поток, связанный с файлом, открытым для записи). Заме-
тим, что S может быть любым объектом производным  от  IdStream
(DosIdStream,   BufIdStream   и  MemIdStream),  однако  обычно
MemIdStream не используется.

     Store выводит образ Memo в поток S.  Перед вызовом  этого
метода  вы  должны быть уверены,  что 1) зарегистрирован адрес
текстового буфера Memo,  или 2) установлен флаг  meDeallocate.
Это  происходит потому,  что сообщая деструктору объекта,  что
необходимо  освободить  текстовый  буфер,  meDeallocate  также
сообщает  Load,  что при загрузке объекта из потока необходимо
заново выделить место под текстовый буфер.

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

     MemoStream -  это  потоковая  процедура  регистрации  для
Memo.

Пример

     uses
        OpCrt, OpRoot, OpCmd, OpFrame, OpWindow, OpMemo;
     const
        BufSize = 5000;
     var
        M:Memo;
        S:BufIdStream;
        Buffer:array[1..BufSize] of Char;
        Status:Word;
     begin
        Buffer[1]:=^Z;
        if not M.InitCustom(2,4,79,24,       { Координаты окна }
                            DefaultColorSet, { Цвета }
                            DefWindowOptions or
                                   wBordered,{ Параметры окна }
                            BufSize,         { Размер буфера }
                            @Buffer)         { Адрес буфера }
        then begin
           WriteLn('Ошибка при инициализации Memo. Status=',InitStatus);
           Halt;
        end;
        S.Init('MEMO.STM',SCreate,1024);
        S.RegisterHier(MemoStream);
        S.RegisterPointer(1000,@Buffer);
        S.Put(M);
        Status := S.GetStatus;
        if Status<>0 then begin
           WriteLn('Ошибка Store',Status);
           Halt;
        end;
       S.Done;
       M.Done;
     end.

     Обработать M,  а затем сохранить его в потоке,  используя
метод потока Put, который неявно вызывает Memo.Store. Заметим,
что адрес буфера регистрируется с кодом 1000; любая программа,
которая загружает  Memo,  должна  таким образом регистрировать
буфер, используя тот же размер и тот же код.

Смотрите также

     CommandWindow.Store

                         2. MemoFile.

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

     Сравните примеры программ, приведенный ниже и приведенный
в предыдущем разделе.

     program MemoFileExample; {EXMEMOF.PAS}
     uses
        OpCrt, OpRoot, OpCmd, OpFrame, OpWindow, OpMemo;
     const
        BufSize = 5000;
     var
        MF:MemoFile;
        FSize:LongInt;
        ExitCommand:Word;
     begin
        { Инициализировать редактор параметрами окна }
        if not M.InitCustomAndAlloc(2,4,79,24,{ Координаты окна }
                            DefaultColorSet, { Цвета }
                            DefWindowOptions or
                                   wBordered,{ Параметры окна }
                            BufSize)         { Размер буфера }
        then begin
           WriteLn('Ошибка при инициализации Memo. Status=',InitStatus);
           Halt;
        end;
        { Использовать встроенные программы обработки состояния и ошибок }
        MF.SetStatusProc(MemoStatus);
        MF.SetErrorProc(MemoError);

        { создать и считать из файла }
        MF.ReadFile('TEMP.MEM',FSize);

        { связать команду ccSaveFile с <F2>, а команду }
        { ccNewFile с <F3> }
        MemoCommands.AddCommand(ccSaveFile,1,$3C00,0);
        MemoCommands.AddCommand(ccNewFile ,1,$3D00,0);

        repeat
          MF.Process;
          { обработка команд завершения }
          ExitCommand := MF.GetLastCommand;
          case ExitCommand of
             ccSaveFile  : MF.SaveFile;
             ccQuit : if MF.meOptionsAreOn(meModifaed)
                      then
                         MF.SaveFile;
             ccNewFile: begin
                        { ... запрос имени файла, вызов }
                        { ReadFile ...}
                        end;
             { ...Обработка пользовательских команд выхода... }
          end;
       until (ExitCommand = ccQuit) or (ExitCommand = ccError);
       MF.Erase;
       MF.Done;
       ClrScr;
     end.

     Если вы последуете нашему совету и сравните эти две прог-
раммы, то вы найдете только два основных отличия  между  ними.
Первое, конструктор использует меньше параметров  при  вызове,
поскольку   самостоятельно   выделяет  текстовый  буфер.  Хотя
MemoFile имеет конструктор,  имеющий дополнительный  параметр,
но  удобнее  использовать конструктор,  который самостоятельно
выделяет буфер.  Второе,  данная программа  использует  вызовы
двух методов SaveFile и ReadFile, которых нет в Memo. Как вид-
но из их названий,  ReadFile считывает файл в текстовый буфер,
а  SaveFile  сохраняет  содержимое  текстового буфера в том же
файле. Все остальные различия между  программами  относятся  к
вызовам данных методов.

     Необходимо обратить внимание на три дополнительные  вещи.
Первое, обработка ошибок довольно слаба.  За вызовом ReadFile,
должен следовать  вызов  GetLastError  для  определения  того,
успешно ли закончилось чтение файла. Можно запросить ReadFile,
ввести не существующий файл, но нельзя продолжать работу, если
указано неправильное имя файла. Пример программы с хорошей об-
работкой   ошибок   вы   найдете  в  MEMO.PAS.  Второе,  вызов
MemoCommand.AddCommand необходим, поскольку этим двум командам
не  присвоены по умолчанию последовательности клавиш.  По этой
причине, в программах, которые используют MemoFile, необходимо
связать клавиши с данными командами.  И третье, в программе не
показана реализация обработки команды ccNewFile,  хотя ей была
присвоена  последовательность  клавиш.  Обработка этой команды
требует написания довольно большого блока кода, который в дан-
ном случае излишен.  Пример обработки команды ccNewFile вы мо-
жете найти в файле MEMO.PAS.

     Хотя дополнительные  методы ReadFile и SaveFile представ-
ляют основное отличие MemoFile  от  Memo,  имеются  другие,  в
основном относящиеся к опциям.  Некоторые опции,  описанные  в
предыдущем разделе, относятся частично или целиком к MemoFile.
meModifaed - это флаг, который устанавливается, если пользова-
тель изменил  содержимое текстового буфера,  и,  как вы можете
видеть, в примере программы используется для того, чтобы опре-
делить, нужно  ли  сохранять  содержимое  буфера в файле перед
разрушением  MemoFile.  meAllowTrunc   влияет   на   поведение
ReadFile:  определяет,  должна  ли  быть считана в буфер часть
файла,  если  весь  он  не  помещается  в  текстовом   буфере.
meMakeBackups  влияет  на  поведение SaveFile,  он определяет,
нужно ли в случае,  если  записываемый  файл  уже  существует,
предварительно переименовать старую версию (присвоить расшире-
ние BAK).  meStreamReload влияет на  работу  методов  Store  и
Load,  он  определяет,  что имя загруженного файла должно быть
сохранено Store и при вызове Load необходимо  попытаться  отк-
рыть  его  снова.  meNewFile  устанавливается ReadFile,  чтобы
сообщить процедуре  состояния,  что  загружен  новый  файл.  И
meNoCtrlZ также  влияет  на SaveFile и сообщает,  нужно ли за-
писывать в файл символ ^Z, который используется для маркировки
конца текстового буфера.

                      Символы табуляции.

     При обсуждении  объекта Memo мы упустили из виду,  что он
не обрабатывает  символы  табуляции  (^I),   встречающиеся   в
текстовом буфере.  Когда  в  режиме вставки вы вводите команду
ccTab, она не вставляет символ табуляции,  а вставляет столько
пробелов, чтобы сдвинуть текст справа (если он есть) на следу-
ющую позицию табуляции. Это не так страшно для Memo, поскольку
обычно  редактор  Memo используется для редактирования текстов
созданных с его помощью.  Однако  это  довольно  серьезно  для
MemoFile, который  довольно часто применяется для редактирова-
ния текстов,  созданных в  других  редакторах,  которые  могут
использовать или не использовать символы табуляции.  При этом,
если файл,  который  вы  хотите  отредактировать   с   помощью
MemoFile, содержит   символы  табуляции,  то  это  работа  для
TextEditor, который является производным объектом от MemoFile,
поскольку файл  в начале необходимо пропустить через программу
- преобразователь,  которая расширит символы табуляции в необ-
ходимое  число пробелов.  Очень простая программа преобразова-
тель приведена в описании функции Detab в OPSTRING.

                            Типы.

     MemoFilePtr = ^MemoFile;
     MemoFile =
        object(Memo)
           mfFileName : PathStr; { имя редактируемого файла }
        end;

     Несколько измененный объект,  который можно  использовать
для редактирования файлов.

Init
─────────────────────────────────────────────────────────────
Объявление

     constructor Init(X1,Y1,X2,Y2:Byte;BufferSize:Word;
                          BufPtr:Pointer);

Функция

     Создает окно memo для редактирования файлов.

Описание

     Этот конструктор  создает  экземпляр  объекта   MemoFile,
используя параметры  окна  по умолчанию (DefWindowOptions),  и
набор цветов по умолчанию (DefaultColorSet).  Детальное описа-
ние смотрите в InitCustom.

Пример

     const
        BufSize = 50000;
     var
        MF:MemoFile;
        Buffer:array[1..BufSize] of Char;
     ...
     Buffer[1]:=^Z;
     if not MF.Init(2,4,79,24,BufSize,@Buffer) then begin
        WriteLn('Ошибка в Init MemoFile, Status = ',
                      InitStatus);
        Halt;
     end;

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

Смотрите также

     InitCustom

InitAndAlloc
─────────────────────────────────────────────────────────────
Объявление

     constructor InitAndAlloc(X1,Y1,X2,Y2:Byte;BufferSize:Word);

Функция

     Создает окно memo для редактирования и выделяет буфер.

Описание

     Этот конструктор  создает  экземпляр  объекта   MemoFile,
используя параметры окна по умолчанию (DefWindowOptions) и на-
бор цветов по умолчанию (DefaultColorSet).  BufferSize опреде-
ляет необходимый размер текстового буфера.  Детальное описание
смотрите в InitCustom.

Пример

     const
        BufSize = 50000;
     var
        MF:MemoFile;
     ...
     Buffer[1]:=^Z;
     if not MF.InitAndAlloc(2,4,79,24,BufSize,@Buffer)
        then begin
        WriteLn('Ошибка в Init MemoFile, Status = ',
                      InitStatus);
        Halt;
     end;

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

Смотрите также

     InitCustomAndAlloc

InitCustom
─────────────────────────────────────────────────────────────
Объявление

     constructor InitCustom(X1,Y1,X2,Y2:Byte;
                      var Colors:ColorSet; Options:LongInt;
                      BufferSize:Word;BufPtr:Pointer);

Функция

     Создает окно memo для редактирования файлов.

Описание

     Этот конструктор   создает  экземпляр  объекта  MemoFile,
используя указанные параметры и цвета окна. X1, X2, Y1 и Y2 -
это координаты  внутренней области окна,  в которой происходит
отображение редактируемого текста.  BufferSize определяет раз-
мер используемого текстового буфера, а BufPtr - это его адрес.
Если при вызове InitCustom буфер пуст, то в первой позиции бу-
фера должен находится символ ^Z.

     InitCustom завершается неудачно,  только если завершается
неудачно вызов родительского  конструктора  (Memo.InitCustom).
Чаще всего это происходит если не хватает памяти.  Для получе-
ния точной причины можно проверить InitStatus.

     Только два набора атрибутов  в  указанном  наборе  цветов
имеют отношение    к    оконным    объектам   типа   MemoFile.
TextColor/TextMono определяют атрибуты, используемые для отоб-
ражения обычного текста, и CtrlColor/CtrlMono определяют атри-
буты, используемые для отображения управляющих символов. После
создания экземпляра  объекта эти значения можно изменить с по-
мощью методов SetTextAttr и SetCtrlAttr соответственно.

     InitCustom инициализирует mfFileName  в  ''.  Предполага-
ется, что между вызовами InitCustom и Process будет вызван ме-
тод ReadFile. Если не производит вызова ReadFile, и mfFileName
остается пустым,   вызов   SaveFile   не   производит  никаких
действий.

Пример

     const
        BufSize = 50000;
     var
        MF:MemoFile;
        Buffer:array[1..BufSize] of Char;
        ...
        Buffer[1]:=^Z;
        if not M.InitCustom(2,4,79,24,       { Координаты окна }
                            DefaultColorSet, { Цвета }
                            DefWindowOptions or
                                   wBordered,{ Параметры окна }
                            BufSize,         { Размер буфера }
                            @Buffer)         { Адрес буфера }
        then begin
           WriteLn('Ошибка при инициализации MemoFile.
                           Status=',InitStatus);
           Halt;
        end;

     Создает экземпляр  MF  с окном,  имеющим рамку и со стан-
дартным набором цветов.

Смотрите также

     InitCustomAndAlloc                ReadFile
     Memo.InitCustom

InitCustomAndAlloc
─────────────────────────────────────────────────────────────
Объявление

     constructor InitCustomAndAlloc(X1,Y1,X2,Y2:Byte;
                      var Colors:ColorSet; Options:LongInt;
                      BufferSize:Word);

Функция

     Создает окно  memo  для  редактирования файлов и выделяет
текстовый буфер.

Описание

     Этот конструктор идентичен InitCustom, за исключением то-
го,  что  он  самостоятельно выделяет буфер указанного размера
(BufferSize).  Если не хватает памяти,  то  InitCustomAndAlloc
завершается   по   ошибке,   и  InitStatus  получает  значение
epFatal+ecOutOfMemory.

Пример

     const
        BufSize = 50000;
     var
        MF:MemoFile;
        ...
        if not M.InitCustomAndAlloc(2,4,79,24,{Координаты окна }
                            DefaultColorSet, { Цвета }
                            DefWindowOptions or
                                   wBordered,{ Параметры окна }
                            BufSize)         { Размер буфера }
        then begin
           WriteLn('Ошибка при инициализации MemoFile.
                           Status=',InitStatus);
           Halt;
        end;

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

Смотрите также

     InitAndAlloc                      InitCustom

Load
─────────────────────────────────────────────────────────────
Объявление

     constructor Load(var S : IdStream);

Функция

     Загружает из потока MemoFile.

Описание

     S - это надлежащим образом инициализированный объект типа
поток (например, файл открытый для чтения). Заметим, что S мо-
жет быть любым  объектом,  производным  от  IdStream,  включая
DosIdStream, BufIdStream и MemIdStream.

     Load считывает  следующую последовательность из потока S.
Эти байты  должны   быть   выведены   предшествующим   вызовом
MemoFile.Store. Обсуждение   специальных  случаев,  вызывающих
использование текстового  буфера  MemoFile,   вы   найдете   в
Memo.Load. (Обычно, MemoFile использует динамически выделяемый
буфер, который Load должна выделить заного).

     Если во  время  сохранения   MemoFile   установлен   флаг
meStreamReload,  то поток содержит имя файла, который был заг-
ружен.  Если такое имя есть, то Load попытается загрузить этот
файл.  Если Load не сможет его загрузить, то произойдет завер-
шение по ошибке и InitStatus получит значение ошибки ввода/вы-
вода, возвращенной ReadFile.

     Для MemoFile процедура регистрации потока MemoFileStream.

Пример

     uses
        OpCrt, OpRoot, OpCmd, OpFrame, OpWindow, OpMemo;
     const
        BufSize = 50000;
     var
        MF:MemoFile;
        S:BufIdStream;
     begin
        S.Init('MEMOFILE.STM',SOpen,1024);
        S.RegisterHier(MemoFileStream);
        S.Get(MF);
        if S.GetStatus<>0 then
           Halt;
       S.Done;
       MF.Process;
       MF.Erase;
       MF.Done;
     end.

     В этом примере мы загрузили MF из потока, созданного при-
мером Store, используя метод Get (относится к потоку), который
неявно вызывает MemoFile.Load.  Заметим,  что  вызывать  метод
ReadFile не  нужно,  поскольку  при  сохранении был установлен
флаг meStreamReload.

Смотрите также

     Memo.Load                         Store

ReadFile
─────────────────────────────────────────────────────────────
Объявление

     procedure ReadFile(FName : string; var FSize : LongInt);

Функция

     Считывает файл в текстовый буфер.

Описание

     Эта процедура считывает текстовый файл FName  в  буфер  и
запоминает имя файла в поле meFileName, для использования про-
цедурой SaveFile. Если файл открыт успешно, FSize получает его
размер, даже если он не будет считан. Если файл не существует,
но FName содержит допустимое имя файла, то FSize получает зна-
чение 0, а файл создается при вызове SaveFile.

     Любые ошибки ввода/вывода,  происшедшие в процессе считы-
вания существующего файла, передаются процедуре обработки оши-
бок, определяемой  пользователем,  если она определена.  Боль-
шинство ошибок ввода/вывода ReadFile  классифицирует  как  фа-
тальные.

     Если считываемый файл имеет размер больший, чем буфер, то
ReadFile делает одно из двух, в зависимости от состояния флага
meAllowTrunc. Если флаг сброшен,  ReadFile сгенерирует фаталь-
ную ошибку (epFatal+ecFileTooLarge)  и  сразу  же  завершится.
Если он установлен,  то будет считано столько, сколько возмож-
но, и будет выдано предупреждение (epWarning+ecFileTruncated).

Пример

     MF.ReadFile('TEMP.MEM',FSize);

     Считывает файл TEMP.MEM, если он существует.

SaveFile
─────────────────────────────────────────────────────────────
Объявление

     procedure SaveFile;

Функция

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

Описание

     Данная процедура сохраняет содержимое текстового буфера в
файле, имя которого содержится в поле meFileName (подразумева-
ется, что  это поле было инициализировано предшествующим вызо-
вом ReadFile).  Если  файл  существует   и   установлен   флаг
meBackups, существующий   файл   будет  переименован  (получит
расширение .BAK) перед тем,  как будет создан новый файл. Если
поле meFileName  пустое,  то  SaveFile  не  выполняет  никаких
действий.

     Любые ошибки ввода/вывода,  появившиеся в процессе  ввода
файла, передаются пользовательской процедуре обработки ошибок,
если она есть, причем они классифицируются как "нефатальные".

     Если сброшен флаг meNoCtrlZ (по умолчанию), то символ ^Z,
маркирующий конец текста в буфере, будет записан на диск. Если
флаг установлен, то ^Z не будет записан на диск.

Пример

     MF.Process;
     MF.meOptionsOn(meBackups);
     if MF.meOptionsAreOn(meModifaed) then
        mf.SaveFile;

     Сохраняет текущий файл в том случае, если он был изменен.

Store
─────────────────────────────────────────────────────────────
Объявление

     procedure Store(var S : IdStream);

Функция

     Сохраняет в потоке MemoFile.

Описание

     S - это надлежащим образом инициализированный объект типа
поток (например, файл открытый для записи). Заметим, что S мо-
жет быть  любым  объектом  производным  от  IdStream,  включая
DosIdStream,  BufIdStream и MemIdStream (хотя обычно не произ-
водится вывод в MemIdStream).

     Store выводит образ MemoFile в поток S.  Если  установлен
 флаг meStreamReload, то поток будет содержать имя редактируе-
мого файла.  В этом случае при вызове Load для загрузки объек-
та будет вызвана ReadFile для перезагрузки этого файла. Обсуж-
дение   различных  случаев,  вызывающих  текстовый  буфер  для
MemoFile, вы найдете в Memo.Store.

     Для получения информации об ошибках,  которые могли прои-
зойти во  время  выполнения  Store,  вызовите  функцию  потока
GetStatus, как показано в нижеприведенном примере.

     Для MemoFile процедура регистрации потока MemoFileStream.

Пример

     uses
        OpCrt, OpRoot, OpCmd, OpFrame, OpWindow, OpMemo;
     const
        BufSize = 50000;
     var
        MF:MemoFile;
        S:BufIdStream;
        FSize:LongInt;
        Status:Word;
     begin
        if not MF.InitCustomAndAlloc(2,4,79,24,
              GefaultColorSet, DefWindowOptions or wBordered,
              BufSize) then begin
           WriteLn('Ошибка Init MemoFile. Status = ',Status);
           Halt;
        end;
        MF.ReadFile('TEMP.MEM',FSize);
        { вывести MF в поток }
        MF.meOptionsOn(meStreamReload);
        S.Init('MEMOFILE.STM',SCreate,1024);
        S.RegisterHier(MemoFileStream);
        S.Put(MF);
        Status := S.GetStatus;
        if Status<>0 then begin
           WriteLn('Ошибка Store',Status);
           Halt;
        end;
       S.Done;
       MF.Done;
     end.

     В данном примере мы создали экземпляр MF,  загрузили файл
и сохранили MF в потоке,  используя потоковый метод Put, кото-
рый неявно производит вызов  Store.  В  Load  приведен  пример
программы, производящей перезагрузку MemoFile.

Смотрите также

     Load                              Memo.Store


                    3.Процедуры и функции.

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

                            Типы.

     ErrorRow           :Byte = 1;
     ErrorColor         :Byte = $F;
     ErrorMono          :Byte = $F;

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

     StatusRow          :Byte = 2;
     StatusColor        :Byte = $F;
     StatusMono         :Byte = $F;

     Данные константы  влияют на работу MemoStatus.  StatusRow
содержит номер строки экрана,  в  которой  будет  отображаться
строка состояния.  StatusColor и StatusMono определяют атрибу-
ты, с которыми будет выводиться строка состояния.

MemoError
─────────────────────────────────────────────────────────────
Объявление

     procedure MemoError(UnitCode : Byte; var ErrorCode : Word;
                         ErrorMsg : string);

Функция

     Выводит сообщение об ошибке и ожидает нажатия клавиши.

Описание

     Это готовая  процедура обработки ошибок для использования
с Memo и MemoFile. Хотя ее можно использовать с другими типами
объектов, она была сделана специально для использования с раз-
личными текстовыми редакторами.  Она делает следующее:  1) до-
бавляет '.Press any key...' в конец строки ErrorMsg,  2) выво-
дит сообщение об ошибке в строку ErrorRow экрана (по умолчанию
1), причем использует атрибуты ErrorColor или ErrorMono в  за-
висимости от типа дисплея, 3) перемещает курсор в конец строки
с сообщением об ошибке, 4) ожидает нажатия клавиши пользовате-
лем и 5) очищает строку.

Примеры

     M.SetErrorProc(MemoError);

     Выводит сообщение об ошибке в строке ErrorRow (по умолча-
нию = 1), используя атрибуты по умолчанию (белое на черном для
цветных и монохромных дисплеев).

     M.SetErrorProc(MemoError);
     ErrorRow := ScreenHeight;
     ErrorColor := $0E;
     ErrorMono := $0F;

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

Смотрите также

     CommandWindow.SetErrorProc

MemoStatus
─────────────────────────────────────────────────────────────
Объявление

     procedure MemoStatus(MP:MemoPtr);

Функция

     Выводит строку статуса.

Описание

     Это готовая  процедура отображения состояния,  предназна-
ченная для использования с Memo и MemoFile.  Строка  состояния
использует 80 колонок и выводится в строку с номером StatusRow
(по умолчанию =2) на экран, используя атрибуты StatusColor или
StatusMono в  зависимости  от  типа дисплея.  Строка состояния
имеет следующую форму:

Line: nnnnn Column: nnn 100% Insert: Off Indent: Off
     Word wrap: Off SAVE

     Первые два  поля  показывают  позицию   курсора.   Второе
(100%) показывает используемый объем текстового буфера. Следу-
ющие три поля отображают состояние важных переключателей режи-
мов (режим вставки,  режим автоматического сдвига, режим пере-
носа слов).  Слово  'SAVE'  появляется  если  установлен  флаг
meModifaed, который говорит,  что содержимое буфера было моди-
фицировано.

Примеры

     StatusRow := ScreenHeight;
     StatusColor := $0E;
     StatusMono := $0F;
     M.SetStatusProc(MemoStatus);

     Выводит строку состояния в нижней строке экрана желтым по
черному на цветных дисплеях и белым по черному на монохромных.

Смотрите также

     Memo.SetStatusProc



            C.OPEDITOR: Улучшенный текстовый редактор.

     В описании MemoFile в предыдущем разделе,  мы  определили
его назначение как  простое  расширение  возможности  объектов
Memo  в  отношении возможности редактирования файлов.  Это все
верно, однако нельзя сказать, что MemoFile - лучший инструмент
в Object Professional для выполнения данной задачи. В OPEDITOR
представлен объект типа TextEditor.

     TextEditor является производным объектом от MemoFile, од-
нако он  поддерживает  много больший набор команд редактирова-
ния, и в результате получается текстовый редактор сравнимый по
мощности с текстовым редактором TurboPascal. Большинство новых
команд делится на четыре категории: файловые команды (для чте-
ния и записи текстовых файлов), блоковые команды (копирование,
перемещение,  удаление,  считывание,  запись и т.п.),  команды
маркировки  текста (для помещения в текст "закладок" и возврат
на них) и команды поиска и замены (для поиска текста и  произ-
ведения замены отдельных строк или всех таких строк).

     Пример простой программы,  приведенной ниже, иллюстрирует
основные шаги по использованию TextEditor.

     program EditorExample; { EXEDITOR.PAS }
     uses OpCrt, OpRoot, OpCmd, OpFrame, OpWindow, OpMemo,
          OpEditor;
     var
        TE:TextEditor;
        FSize:LongInt;
        ExitCommand:Word;
        AllDone:Boolean;
     bagin
        { создать экземпляр TextEditor с окном имеющим рамку }
        if not TE.InitCustom(2,4,79,24,    { Координаты окна }
                         DefaultColorSet,  { Цвета }
                         DefWindowOptions or Bordered,
                                           { параметры окна }
                         65521)            { размер буфера }
        then begin
           WriteLn('Ошибка в Init TextEditor. Status = ',
                    Status);
           Halt;
        end;

        { использовать встроенные процедуры состояния и }
        { обработки ошибок }
        TE.SetStatusProc(MemoStatus);
        TE.SetErrorProc(MemoError);

        { создать или ввести текстовый файл }
        TE.ReadFile('READ.ME',FSize);

        AllDone := False;
        repeat
           TE.Process;
           ExitCommand := TE.GetLastCommand;
           case ExitCommand of
              ccSaveExit,     { выход с сохранением -- файл }
                              { уже сохранен }
              ccAbandonFile,  { покинуть файл }
              ccError:        { фатальная ошибка }
                 AllDone := True;
              { ...пользовательские команды выхода...}
           end;
        until AllDone;
        TE.Erase;
        TE.Done;
        ClrScr;
        end.

     За небольшими  исключениями,  данная  программа идентична
программе, приведенной в начале предыдущего  раздела,  которая
иллюстрировала использование MemoFile, и если вы запустите две
программы, то различий не  заметите.  Все  отличия  содержатся
внутри. Основное отличие,  которое вы можете заметить, сравни-
вая исходные тексты, это то, что в MemoFile команда ccSaveFile
обрабатывалась вами вручную, в то время как в данной программе
она обрабатывается автоматически.  Команда ccNewFile также об-
рабатывается автоматически,  однако ей требуется процедура на-
писанная пользователем, о чем мы расскажем ниже.

     Еще одно заметное отличие между этими программами состоит
в том,  что в операторе выбора обрабатываются две дополнитель-
ные команды выхода - ccSaveExit и ccAbandonFile,  и не обраба-
тывается  команда ccQuit,  которой не присвоена последователь-
ность клавиш  в  таблице  команд,  используемых  по  умолчанию
(EditorKeySet).   Отличия   возникли   по  причине  того,  что
TextEditor предназначен именно  для  редактирования  текстовых
файлов. ccSaveExit определяет то, что у пользователя было зап-
рошено, необходимо ли сохранять файл (что было сделано методом
Process),  и  затем произведен выход.  ccAbandonFile говорит о
том,  что пользователь дал команду на выход без сохранения из-
менений на диске. (В большинстве прикладных задач в таких слу-
чаях выдается сообщение и запрашивается  подтверждение  коман-
ды.)  Хотя  эта  команда по своему значению аналогична команде
ccQuit,  ей присвоена другая  последовательность  клавиш,  чем
обычно используется для ccQuit.

     Заметная схожесть в обработке ошибок в этих двух програм-
мах выглядит  некрасиво.  Лучший  пример  содержится  в  файле
EDITOR.PAS.

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

     Заметим, что некоторые команды в данном списке  работают,
только в случае, если определены пользовательские процедуры. В
каждом таком случае описание команды завершается именем  (име-
нами)  метода  (методов)  TextEditor,  которые  являются соот-
ветствующими  программными  "ловушками".  Имена  приводятся  в
скобках курсивом.

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

                 Команды перемещения курсора.

     ccLeft                  <Left>, <CtrlS>
     Курсор перемещается на одну позицию влево. Если курсор
находится в первой позиции и действует опция WrapAtLeft, он
перемещается на последний символ предыдущей строки. Если опция
выключена, курсор не перемещается.

     ccRight                 <Right>, <CtrlI>
     Курсор перемещается на одну позицию вправо.

     ccWordLeft              <CtrlLeft>, <CtrlA>
     Курсор перемещается на одно слово влево. Если курсор на-
ходится в начале строки, то он перемещается в конец предыду-
щей.

     ccWordRight             <CtrlRight>, <CtrlF>
     Курсор перемещается на следующее слово. Если курсор нахо-
дится в конце строки, то он перемещается в начало следующей.

     ccHome                  <Home>, <CtrlQ><S>
     Курсор перемещается в начало строки.

     ccEnd                   <End>, <CtrlQ><D>
     Курсор перемещается в конец строки.

     ccUp                    <Up>, <CtrlE>
     Курсор перемещается на одну строку вверх.

     ccDown                  <Down>, <CtrlX>
     Курсор перемещается на одну строку вниз.

     ccScrollUp              <CtrlW>
     Прокрутить изображение на одну строку вверх.

     ccScrollDown            <CtrlZ>
     Прокрутить изображение на одну строку вниз.

     ccPageUp                <PgUp>, <CtrlR>
     Прокрутить изображение на одну страницу вверх.

     ccPageDn                <PgDn>, <CtrlC>
     Прокрутить изображение на одну страницу вниз.

     ccScreenTop             <CtrlHome>, <CtrlQ><E>
     Курсор перемещается в первую строку окна редактора.

     ccScreenBot             <CtrlEnd>, <CtrlQ><X>
     Курсор перемещается в последнюю строку окна редактора.

     ccTopOfFile             <CtrlPgUp>, <CtrlQ><R>
     Перемещает курсор в начало файла.

     ccEndOfFile             <CtrlPgDn>, <CtrlQ><C>
     Перемещает курсор в конец файла.

     ccJmpLine               <CtrlJ><L>
     Запрашивает у  пользователя  номер  строки  и  перемещает
курсор на эту строку.  Если этот номер больше, чем число строк
в файле,   курсор  перемещается  на  последнюю  строку  файла.
(SetEditProc).

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

     ccDel                   <Del>, <CtrlG>
     Удаляет символ под курсором.

     ccBack                  <Bksp>, <CtrlH>, <CtrlBksp>
     Удаляет символ слева от курсора. Если курсор находится в
первой позиции, то строка сливается с предыдущей.

     ccDelLine               <CtrlY>
     Удаляет текущую строку.

     ccDelEol                <CtrlQ><Y>
     Удаляет символы от курсора до конца строки.

     ccDelWord               <CtrlT>
     Удаляет слово справа от курсора. Если курсор находится в
конце строки, то следующая строка присоединяется к текущей.

     ccSelect                <Enter>, <CtrlM>
     Начинает новую строку.

     ccInsertLine            <CtrlN>
     Вставляет в позиции курсора новую строку.

     ccTab                   <Tab>, <CtrlI>
     Перемещает курсор в следующую позицию табуляции. Если
включен режим вставки, то весь текст справа от курсора будет
сдвинут на следующую позицию табуляции. Когда включена жесткая
табуляция, то курсор перемещается на следующую колонку табуля-
ции, (по умолчанию шаг табуляции равен 8 позициям). Если вклю-
чена гибкая табуляция (по умолчанию), то позиции табуляции оп-
ределяются положением слов в предыдущей строке:  первый символ
каждого слова определяет позиции табуляции.

     ccCtrlChar              <CtrlP>
     Вставляет управляющий символ. Например, для вставки ^G вы
должны ввести <CtrlP><CtrlG>. Эта команда не работает, если
видеоатрибуты для управляющих символов те же,  что и для обыч-
ного текста, и если включен teMapCtrls.

                      Файловые команды.

     ccSaveFile              <F2>, <CtrlK><S>
     Сохранить текущий файл и продолжить редактирование.

     ccNewFile               <F3>
     Загрузить новый файл. Если содержимое текущего файла было
изменено, то у пользователя будет запрошено подтверждение, что
он хочет   потерять   сделанные   изменения.  (SetGetFileProc,
SetYesNoProc)

     ccAbandonFile           <CtrlK><Q>
     Завершение редактирования.  Игнорировать  любые сделанные
изменения.

     ccSaveSwitch            <CtrlK><D>
     Сохранить содержимое  текущего  файла  и загрузить новый.
(SetGetFileProc)

     ccSaveNamed             <CtrlK><N>
     Сохранить текущий файл под новым именем. (SetGetFileProc)

     ccSaveExit              <CtrlK><X>
     Сохранить текущий файл и завершить редактирование.

                      Блоковые команды.

     ccBlkBegin              <F7>, <CtrlK><B>
     Маркирует начало блока.

     ccBlkEnd                <F8>, <CtrlK><K>
     Маркирует конец блока.

     ccBlkWord               <CtrlK><T>
     Маркирует в качестве блока слова.

     ccJmpBegin              <CtrlQ><B>
     Перемещает на начало текущего выбранного блока.

     ccBlkToggle             <CtrlK><H>
     Включает и выключает отображение выбранного блока.  Заме-
тим, что несколько других блоковых команд не совершают никаких
действий или  генерируют  ошибки,  если  отключено отображение
блока.

     ccBlkCopy               <CtrlK><C>
     Копирует текущий  выбранный и отображаемый блок в текущую
позицию курсора.  Маркеры блока помещаются вокруг новой  копии
блока.

     ccBlkMove               <CtrlK><V>
     Перемещает текущий выбранный и отображаемый блок в  теку-
щую позицию  курсора.  Маркеры  блока помещаются вокруг блока,
перемещенного в новую позицию.

     ccBlkDelete             <CtrlK><Y>
     Удаляет текущий выбранный и отображаемый блок.

     ccBlkIndent             <CtrlK><I>
     Сдвигает начало абзацев в текущем выбранном и  отображае-
мом блоке на фиксированное число пробелов (по умолчанию 2). Не
совершает никаких действий,  если курсор не  находится  внутри
блока.

     ccBlkUnindent           <CtrlK><U>
     Сдвигает начало абзацев влево в текущем выбранном и отоб-
ражаемом  блоке  на фиксированное число пробелов (по умолчанию
2).  Не совершает никаких действий,  если курсор не  находится
внутри блока.

     ccBlkTCase              <CtrlO><O>
     Переключает регистры всех символов в текущем выбранном  и
отображаемом блоке. Если курсор не находится внутри выбранного
и отображаемого блока,  то переключается регистр  символа  под
курсором.

     ccBlkUCase              <CtrlO><U>
     Преобразует все символы в текущем выбранном и  отображае-
мом блоке  в верхний регистр.  Если курсор не находится внутри
текущего выбранного и отображаемого блока,  то в  верхний  ре-
гистр переводится символ, находящийся под курсором.

     ccBlkLCase              <CtrlO><V>
     Преобразует все символы в текущем выбранном и  отображае-
мом блоке  в  нижний регистр.  Если курсор не находится внутри
текущего выбранного и отображаемого блока, то в нижний регистр
переводится символ, находящийся под курсором.

     ccBlkRead               <CtrlK><R>
     Считывает файл в текстовый буфер в текущую позицию курсо-
ра и маркирует его как блок.  Если все содержимое файла не по-
мещается в      буфер,       генерируется       предупреждение
(epWarning+ecBufferFull) и   чтение  данных  не  производится.
(SetGetFileProc)

     ccBlkWrite              <CtrlK><W>
     Сохраняет текущий  выбранный и отображаемый блок в файле.
(SetGetFileProc)

     ccBlkPrint              <CtrlK><P>
     Выводит текущий выбранный и отображаемый блок на принтер.
По умолчанию ccBlkPrint осуществляет вывод на LPT1. Для выбора
LPT2 или LPT3 вызовите метод SetPrinter.

                   Команды поиска и замены.

     ccSearch                <CtrlQ><F>
     Позволяет пользователю производить поиск строки длиной до
30 символов.  После  ввода строки у пользователя запрашиваются
параметры поиска того же типа, что и параметры поиска редакто-
ра Borland.  Допустимые параметры: 'B' - поиск в обратном нап-
равлении (к началу файла),  'G' - глобальный  поиск  по  всему
тексту,  'L' - локальный поиск в выделенном блоке, 'U' - поиск
с игнорированием регистра. Если искомая строка найдена, то она
будет подсвечиваться  до тех пор,  пока пользователь не нажмет
любую клавишу. (SetEditProc)

     ccReplace               <CtrlQ><A>
     Данная команда  работает аналогично команде ccSearch,  за
исключением того,  что у  пользователя  запрашивается  строка,
длиной до 30 символов, на которую нужно будет заменить найден-
ную строку. В дополнение к параметрам, используемым с командой
ccSearch, имеется дополнительный параметр 'N',  который подав-
ляет запрос подтверждения замены.  При запросе подтверждения у
пользователя имеются четыре альтернативы: yes - произвести за-
мену,  no - не производить замену, all - произвести данную за-
мену и продолжить без подтверждения, quit - закончить выполне-
ние данной команды. (SetEditProc, SetYesNoProc)

     ccReSearch              <CtrlL>
     Повторяет предыдущую команду поиска или замены.  В поиске
или замене будут использоваться те же строки, что и в предыду-
щей команде. Будут использоваться те же параметры поиска. Если
во время данного сеанса работы не  выполнялось  команд  поиска
или замены, то никакие действия производиться не будут.

                       Маркеры текста.

     ccSetMark0..9           <CtrlK><0>..<CtrlK><3>
     Устанавливает один из десяти текстовых маркеров в позицию
курсора. <CtrlK><0> устанавливает маркер 0,  <CtrlK><1> - мар-
кер 1  и  т.д.  Заметим,  что  в таблице команд по умолчанию в
OPEDITOR командам ccSetMark4..ccSetMark9 не присвоены последо-
вательности клавиш.

     ccJmpMark0..9           <CtrlQ><0>..<CtrlQ><3>
     Перемещает курсор на один из текстовых маркеров, установ-
ленных командой  ccSetMarkX.  <CtrlQ><0>  перемещает курсор на
маркер 0,  <CtrlQ><1> - на маркер 1 и т.д. Заметим, что в таб-
лице команд     по     умолчанию     в    OPEDITOR    командам
ccJmpMark4..ccJmpMark9 не присвоены последовательности клавиш.

     ccMarkToggle            <CtrlK><M>
     Включает и выключает отображение текстовых маркеров.

     ccPrevPos               <CtrlQ><P>
     Перемещает курсор в позицию,  в которой он  находился  до
тех пор, пока не попал на данную строку. Данная команда обычно
следует за командами поиска и замены.

                    Форматирование текста.

     ccReformatP             <CtrlB>
     Переформатировать текущий абзац. Эта команда игнорируется
при выключенном переносе слов.

     ccReformatG             <CtrlK><G>
     Переформатирует весь текстовый буфер (глобальное перефор-
матирование). Эта команда не производит никаких действий при
выключенном переносе слов. Данной командой пользуйтесь с осто-
рожностью!

     ccCenterLine            <CtrlO><C>
     Центрирует данную строку между позицией 1 и правой грани-
цей.

         Переключение режимов и установка параметров.

     ccIns                   <Ins>, <CtrlV>
     Включает и выключает режим вставки. Курсор в виде блока
означает режим вставки, тонкий курсор показывает режим замены.

     ccIndent                <CtrlO><I>
     Включает режимы  автоматического  выравнивания.  В режиме
автоматического выравнивания  при  нажатии  <Enter>  в  режиме
вставки происходит вставка строки,  первая позиция которой  та
же, что  и в предыдущей строке.  Кроме этого,  режим автомати-
ческого выравнивания  влияет  на  форматирование  текста:  при
включенном переносе  слов  новая  строка имеет то же смещение,
что и предшествующая,  и,  следовательно,  влияет на поведение
команд форматирования (ccReformatP и ccReformatG).

     ccWordWrap              <CtrlO><W>
     Включает и выключает режим переноса. Когда режим переноса
включен, любая попытка вставить или добавить  текст  за  правой
границей текста вызовет вставку новой строки  и  перенос  всех
слов, находящихся за правой границей текста, в новую строку.

     ccTabToggle             <CtrlO><F>
     Переключает режимы "жесткой" и "гибкой" табуляции.

     ccTabSize               <CtrlO><T>
     Запрашивает пользователя о числе позиций между  колонками
табуляции (1-10). (SetEditProc)

     ccRtMargin              <CtrlO><R>
     Запрашивает у   пользователя   новую   правую    границу.
(SetEditProc)

     ccSetIndent             <CtrlO><B>
     Запрашивает у пользователя  число  пробелов,  на  которые
сдвигается начало    абзацев   в   операциях   ccBlkIndent   и
ccBlkUnindent. Значение по умолчанию равно 2.

                          Остальные.

     ccRestore               <CtrlQ><L>
     Восстанавливает исходное содержимое текущей строки.

     ccHelp                  <F1>, <ClickBoth>
     Помощь. Если пользовательская подпрограмма выдачи спра-
вочной информации      была      определена      с     помощью
MemoCommands.SetHelpProc,  нажатие F1 приведет к  вызову  этой
подпрограммы. В противном случае эта команда не делает ничего.
Если подпрограмма выдачи справочной информации определена,  то
Memo передаст ей три  параметра:  ucMemo,  @Self  и  значение,
используемое в  качестве  индекса  оконной  справочной системы
(см.  CommandWindow.SetHelpIndex),  который по умолчанию равен
0.

     ccMouseSel              <ClickLeft>
     Перемещает курсор в позицию, определенную мышью. Эта ко-
манда может использоваться для прокрутки окна при нажатии в
строке прокрутке.

                     Программные ловушки.

     TextEditor предоставляет два набора  программных  ловушек
помимо тех, что предоставляются методами, наследуемыми от Memo
и CommandWindow,  позволяющими настраивать их на  определенные
приложения.

     Первое - это тройка методов,  которые получают в качестве
параметра  адрес  функции:   SetEditProc,   SetGetFileProc   и
SetYesNoProc.  В  отличии  от  большинства программных ловушек
Object Proofessional,  данные не рассматриваются как  необяза-
тельные. Любым приложениям, использующим TextEditor, требуются
возможности, предоставляемые этими ловушками. SetEditProc поз-
воляет вам указать процедуру, которая будет вызываться при не-
обходимости ввести строку. Без такой процедуры будут недоступ-
ны некоторые команды редактирования (например команды поиска и
замены). SetGetSileProc позволяет вам указать процедуру, кото-
рая будет вызвана при необходимости ввода имени файла. Без нее
будут недоступны некоторые  блоковые  и  файловые  команды.  И
SetYesNoProc  позволяет  вам указать процедуру,  которая будет
вызываться при необходимости получить от пользователя ответ  в
форме да-нет. При отсутствии такой процедуры команда ccNewFile
не сможет запросить у пользователя подтверждение тому, что все
изменения, произведенные с файлом, должны быть потеряны. Кроме
этого,  странной становится команда ccReplace. Смотрите описа-
ние данных методов в соответствующих разделах.

     Вторая часть  ловушек   состоит   из   четырех   методов:
GotoLineCol, GotoOffset,          InsertTextAtCursor         и
InsertStringAtCursor. Цель данных методов состоит в  упрощении
реализации команд,  определяемых пользователем.  GotoLinePos и
GotoOffset позволяет вам переместить  курсор  на  определенную
позицию в файле. GotoOffset может быть использована, например,
при реализации сцепленных команд поиска, вроде тех, что реали-
зованы в  редакторе  Turbo  Pascal.  Вы  можете  просматривать
текст, начиная с текущей позиции курсора (meBufPos+meCurCol-1)
до тех пор,  пока вам не встретится индекс символа, на который
нужно  переместить курсор,  этот индекс передается GotoOffset.
GotoLineCol  используется  в  случаях,  когда   местоположение
курсора должно быть задано в виде номера строки и номера пози-
ции в строке.  InsertTextAtCursor и InsertStringAtCursor  дают
возможность вставить текст в буфер с позиции курсора. Вы може-
те использовать их для реализации системы макрокоманд или  для
получения текста из другого файла и вставки его в данный.

               Текстовые редакторы и поля Memo.

     Хотя TextEditor был разработан для редактирования тексто-
вых файлов,  его  все же можно использовать для редактирования
полей memo. При этом необходимо помнить три вещи. Начнем с ко-
манд чтения  и  записи файлов (ccNewFile,  ccSaveFile и т.д.).
Если файл не был считан в текстовый  буфер  с  помощью  метода
ReadFile или более точно, когда поле meFileName наследуемое от
MemoFile остается пустым,  то все эти команды будут отключены.
Команды ccBlkRead и ccBlkWrite,  которые также являются коман-
дами файлового ввода/вывода, при этом не отключаются и их мож-
но использовать для экспорта и импорта данных.

     Второе касается самого текстового буфера.  Наиболее часто
используемые конструкторы TextEditor  Init  и  InitCustom  са-
мостоятельно выделяют вам текстовый буфер,  усложняя таким об-
разом редактирование полей  записи.  Поэтому  TextEditor  пре-
доставляет вам два дополнительных  конструктора  -  InitBuf  и
InitBufCustom,  которые  позволяют вам указать ваш собственный
текстовый буфер.

     И последнее,  касающееся изменения содержимого текстового
буфера при  работе с полями memo.  Решение здесь то же,  что и
для Memo: при изменении содержимого текстового буфера вы долж-
ны вызвать ReinitBuffer. Поскольку TextEditor не переопределя-
ет метод ReinitBuffer, то ему приходится переопределять низко-
уровневые   подпрограммы,   которые  вызываются  ReinitBuffer,
поскольку необходимо инициализировать переменные,  относящиеся
к TextEditor (например, маркеры блока и текстовые маркеры).

                          Константы.

     BadEditorOptions : LongInt = teModifaed+teRefornatting+
                                  teSearching+teSearchStart+
                                  teSerchEnd+teHighlightOn+
                                  teHighlightBack;

     Эти флаги  предназначены  для внутреннего использования и
не могут   быть   изменены   посредством    teOptionsOn    или
teOptionsOff.

     DefBlockIndent : Byte = 2;

     Сдвиг по умолчанию для выделенного блока.

     DefEditorExt : ExtStr = '';

     Расширение имени  файла,  используемое  по  умолчанию при
запросе имени файла.

     DefEditorOptions : Longint = teInsert+teIndent+teWordWrap+
                                  teMapCtrls+teMousePage+
                                  teMakeBackups+TeSmartTabs+
                                  teDeallocate;

     Используемые по умолчанию параметры TextEditor.

     EditorKeyMax = 400;
     EditorKeyID : string[18] = 'opeditor key array';
     EditorKeySet: array[0..EditorKeyMax] of Byte = (...);
     EditorCfgEnd : Byte = 0;

     EditorKeyID содержит  идентификационную  строку,  которая
используется для  указания  начала области данных конфигурации
для OPEDITOR.  EditorCfgEnd указывает конец этой области  дан-
ных. Между   ними   находится  EditorKeySet,  таблица  команд,
используемая EditorCommands.  EditorKeyMax - это последний до-
пустимый индекс в таблице.

     MaxBlockIndent = 10;

     Максимальный уровень выравнивания для выделенного блока.

     MaxMarker = 9;

     Максимальный номер маркеров (закладок).

     MaxSearchLen = 30;

     Максимальная длина строки для поиска.

     MaxSearchOptions = 5;
     teBackward = 'B';
     teNoCase = 'U';
     teGlobal = 'G';
     teNoConfirm = 'N';
     teBlockOnly = 'L';

     Символы параметров поиска.  'B' означает поиск в обратном
направлении, 'U'  - игнорирование регистров,  'G' - глобальный
поиск по всему тексту от начала  (при  нормальном  направлении
поиска) или  от  конца (при обратном направлении поиска),  'N'
означает замену без запроса подтверждения,  'L' - поиск только
внутри выделенного блока.

     meInsert         = $00000001;   { Да, в режиме вставки }
     teIndent         = $00000002;    { Да, в режиме сдвига }
     teReadOnly       = $00000004;
                         { Да, в режиме "только для чтения" }
     teWordWrap       = $00000008;   { Да, в режиме переноса}
     teDeleteJoins    = $00000010;   { Да, если при Del воз-}
                         { можно слияние строк              }
     teModifaed       = $00000020;   { Да, если произошло   }
                         { редактирование.                  }
     teIndentPara     = $00000040;   { Сдвигать начало па-  }
                         { раграфа.                         }
     teMousePage      = $00000080;   { Нажатие мыши на па-  }
                         { нели прокрутки приведет к про-   }
                         { крутке страницы.                 }
     teAllowTrunk     = $00000100;   {Считывать часть файла?}
     teMapCtrls       = $00000200;   { Помечать управляющие }
                         { символы                          }
     teMakeBackups    = $00000400;   { Сохранять старые фай-}
                         { лы?                              }
     teStreamReload   = $00000800;   { Перезагружать преды- }
                         { дущий файл при активизации       }
                         { редактора, сохраненного в потоке?}
     teReformating    = $00001000;   { Флаг устанавливается }
                         { при переформатировании.          }
     teNewFile        = $00002000;   { Загружен новый файл. }
     teDeallocate     = $00004000;   { Освобождать буфер    }
                         { при вызове Done?                 }
     teWrapAtLeft     = $00008000;   { Переходить на преды- }
                         { дущую строку при нажатии на Left,}
                         { если курсор на первой позиции    }
     teNoCtrlZ        = $00010000;   { Отменяет запись на   }
                         { диск символа ^Z.                 }
     teSmartTabs      = $01000000:   { Режим гибкой или     }
                         { жесткой табуляции                }
     teSearching      = $02000000;   { Устанавливается при  }
                         { поиске строки                    }
     teSearchStart    = $04000000;   { Устанавливается в    }
                         { начале поиска                    }
     teSearchEnd      = $08000000;   { Устанавливается в    }
                         { конце  поиска                    }
     teHighlightOn    = $10000000;   { Подсветка включена ? }
     teHighlightBack  = $20000000;   { Подсветка в обратном }
                         { направлении ?                    }
     teMarkersOn      = $40000000;   { Текстовый маркеры    }
                         { видимы ?                         }
     teBlockOn        = $80000000;   { Маркеры блока видимы?}

     Это параметры,  которые влияют на  поведение  TextEditor.
Первая группа   флагов   teInsert..teNoCtrlZ  идентична  соот-
ветствующим флагам для Memo/MemoFile.  Их описание смотрите  в
документации по Memo. Вторая группа - teSmartTabs..teBlockOn -
используется только TextEditor.

     teSmartTabs определяет,  что вместо жесткого режима табу-
ляции используется гибкий режим. teSearching определяет, что в
данный момент выполняется команда поиска.  teSearchStart уста-
навливается в начале операций поиска. teSearchEnd устанавлива-
ется  в  конце  операций  поиска.  Эти флаги предназначены для
пользовательских процедур состояния,  чтобы они могли  отобра-
жать  соответствующие сообщения.  (Можно также вывести сообще-
ние,  определяющее сколько операций замены  было  произведено.
Это число хранится в переменной teReplacements.) teHighlightOn
и teHighlightBack - это  внутренние  флаги,  используемые  при
подсветке найденной строки. teMarkersOn определяет, что марке-
ры текста тоже должны отображаться.  teBlockOn определяет, что
должны отображаться маркеры текущего блока.

     teNo       = 0;
     teYes      = 1;
     teQuit     = 2;
     teAll      = 3;

     Коды, возвращаемые  пользовательской  процедурой  Да-Нет.
(Смотрите EditorYesNoFunc).

                            Типы.

     EditorEditFunc = function(MsgCode:Word;Prompt:string;
                          ForceUp,TrimBlanks : Boolean;
                          MaxLen:Byte;var S:string) : Boolean;

     Пользовательская процедура для запроса  и  ввода  строки.
(Смотрите описание SetEditProc).

     EditorGetFileFunc = function(MsgCode:Word;Prompt:string;
                          ForceUp,TrimBlanks,Writing,MustExist:
                          Boolean; MaxLen:Byte;DefExt:ExtStr;
                          var S:string):Boolean;

     Пользовательская процедура для ввода имени файла.  (Смот-
рите описания SetGetFileProc).

     EditorYesNoFunc = function(MsgCode:Word;Prompt:string;
                        Default:Byte;QuitAndAll:Boolean):Byte;

     Пользовательская процедура для запроса у пользователя от-
вета Да-Нет. (Смотрите описание SetYesNoProc).

     MarkerRec =
        record
           Line,Col : Integer;
        end;
     MarkerArray = array[0..MaxMarker] of MarkerRec;

     MarkerRec это внутренняя структура, используемая для хра-
нения отдельного маркера текста и блока. MarkerArray использу-
ется для хранения всей группы текстовых маркеров.

     teSearchType = (tescNone, tescSearch, tescReplace);

     Внутренний тип,  используемый для представления выполняе-
мой операции.

     TextEditorPtr = ^TextEditor;
     TextEditor =
        object(MemoFile)
           ...
           teSearchSt : string[MaxSearchLen];
           { строка для поиска }
           teReplaceSt : string[MaxSearchLen];
           { строка для замены }
           teOptionSt : string[MaxSearchOptions];
           { параметры поиска }
           teLastSearch : teSearchType;
           { тип последней операции поиска }
           teReplacements : Word;
           { число сделанных замен }
           teBlockIndent : Byte;
           { сдвиг для блоков }
           teLPT : Byte;
           { принтер (1-3)}
           teDefExt : ExtStr;
           { расширение, используемое по умолчанию }
           teBlkBegin : MarkerRec;
           { начало блока }
           teBlkEnd : MarkerRec;
           { конец блока }
           ...
        end;

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

     teSerchSt -  это  последняя строка поиска.  teReplaceSt -
это последняя строка замены. teOptionSt содержит параметры по-
иска,    использованные    при   последней   такой   операции.
teReplacements содержит число замен,  сделанных при  последней
операции поиска и замены. Пользовательская процедура отображе-
ния состояния может вывести эту информацию при установке флага
teSearchEnd;  teBlockIndent определяет число позиций, на кото-
рые происходит сдвиг при  выполнении  операций  ccBlkIndent  и
ccBlkUnindent.  teLPT определяет номер принтера,  используемый
при выполнении команды ccBlkPrint.  По умолчанию равно 1,  что
означает LPT1.  teDefExtention  -  это расширение имени файла,
используемое по умолчанию.  teBlkBegin и  teBlkEnd  определяют
начало и конец текущего блока.  Блок считается неопределенным,
если teBlkBegin.Line или teBlkEnd.Line равны 0.

                         Переменные.

     EditorCommands : CommandProcessor;

     CommandProcessor используемый по умолчанию с TextEditor.

GotoLineCol
─────────────────────────────────────────────────────────────
Объявление

     procedure GotoLineCol(LineNum : Integer; Col : Byte);

Функция

     Перемещает курсор на строку LineNum в позицию Col.

Описание

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

     Для того,  чтобы работал данный метод,  TextEditor должен
быть текущим окном.  Если он не является текущим окном, то ни-
чего не произойдет.  Если вы не хотите выводить окно редактора
до того,  как будет перемещен курсор, то сначала его нужно вы-
вести на виртуальный экран и затем вызвать GotoLineCol как по-
казано ниже:

     TE.ActivateWrite;   { активизировать виртуальный экран }
     TE.Draw;            { нарисовать окно }
     TE.GotoLineCol(line,col); { переместить курсор }
     TE.DeaktivateWrite  { деактивизировать виртуальный экран }

Пример

     TE.GotoLineCol(1,1)l

     Перемещает курсор в начало файла.

GotoOffset
─────────────────────────────────────────────────────────────
Объявление

     procedure GotoOffset(Offset : Word);

Функция

     Перемещает курсор в указанную точку текстового буфера.

Описание

     Этот метод идентичен GotoLineCol,  эа  исключением  того,
что параметр  Offset  относится  к  текстовому буферу (массиву
символов), а не к строкам и позициям. Если Offset содержит не-
верное значение (меньше 0 или больше,  чем число символов, на-
ходящихся в буфере),  то курсор будет перемещен на  допустимую
позицию. Например, 'GotoOffset(65535)' переместит курсор в ко-
нец файла  независимо  от   размера   текстового   буфера,   а
'GotoOffset(0)' переместит курсор в начало файла.

Пример

     TE.GotoOffset(1);

     Переместит курсор в начало файла.

Init
─────────────────────────────────────────────────────────────
Объявление

     constructor Init(X1,Y1,X2,Y2 : Byte; BufferSize : Word);

Функция

     Создает окно для редактирования файлов.

Описание

     Этот конструктор создает экземпляр TextEditor,  используя
параметры окна по умолчанию (DefWindowOptions) и набор  цветов
по умолчанию (DefaultColorSet). Смотрите описание InitCustom.

Пример

     if MaxAvail < 65521 then
        BufferSize := MaxAvail
     else
        BufferSize := 65521;
     if not TE.Init(1,3,ScreenWidth,ScreenHeight,BufferSize)
       then begin
     WriteLn('Ошибка при инициализации TextEditor. Status =',
            InitStatus);
       Halt;
     end;

     Создает редактор без рамки с максимально возможным  буфе-
ром.

Смотрите также

     InitCustom

InitBuf
─────────────────────────────────────────────────────────────
Объявление

     constructor Init(X1,Y1,X2,Y2 : Byte; BufferSize : Word,
                      BufPtr : Pointer);

Функция

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

Описание

     Этот конструктор  создает  экземпляр  объекта TextEditor,
используя параметры окна по умолчанию (DefWindowOptions) и на-
бор цветов по умолчанию (DefaultColorSet).  BufferSize опреде-
ляет размер текстового буфера,  а BufPtr его  адрес.  Смотрите
InitBufCusttom и InitCustom.

Пример

     const
        BufSize = 20000;
     var
        Buffer : array[1..BufSize] of Char;
        TE : TextEditor;
     ...
     Buffer[1] = ^Z;
     if not TE.Init(1,3,ScreenWidth,ScreenHeight,BufferSize,
                    Buffer) then begin
     WriteLn('Ошибка при инициализации TextEditor. Status =',
            InitStatus);
       Halt;
     end;

     Создает редактор  без рамки,  используя уже имеющийся бу-
фер.

Смотрите также

     InitBufCustom

InitBufCustom
─────────────────────────────────────────────────────────────
Объявление

     constructor InitBufCustom(X1,Y1,X2,Y2 : Byte;
                               var Colors : ColorSet;
                               Options : LongInt;
                               BufferSize : Word;
                               BufPtr:Pointer);

Функция

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

Описание

     Этот конструктор идентичен InitCustom, за исключением то-
го, что он получает дополнительный параметр, который представ-
ляет собой адрес используемого текстового буфера. Если при вы-
зове InitCustom буфер пуст,  то в первой позиции должен  нахо-
диться символ ^Z.

Пример

     const
        BufSize = 20000;
     var
        Buffer : array[1..BufSize] of Char;
        TE : TextEditor;
     ...
     Buffer[1] = ^Z;
     if not TE.InitBufCustom(2,4,79,24,{ Координаты окна }
                    DefaultColorSet, { Набор цветов }
                    DefWindowOptions or wBordered,
                                     { Параметры окна }
                    BufferSize,      { Размер буфера }
                    Buffer) then begin { Буфер }

     WriteLn('Ошибка при инициализации TextEditor. Status =',
            InitStatus);
       Halt;
     end;

     Создает редактор c рамкой, используя уже имеющийся буфер.

Смотрите также

     InitCustom

InitCustom
─────────────────────────────────────────────────────────────
Объявление

     constructor InitCustom(X1,Y1,X2,Y2 : Byte;
                            var Colors : ColorSet;
                            Options : LongInt;
                            BufferSize : Word);

Функция

     Создает окно для редактирования файлов в  соответствии  с
передаваемыми параметрами.

Описание

     Этот конструктор создает  экземпляр  объекта  TextEditor,
используя указанные параметры и цвета окна. X1, Y1, X2, Y2 это
координаты внутренней области окна,  где отображается редакти-
руемый текст. BufferSize определяет необходимый размер тексто-
вого буфера, который выделяется и инициализируется конструкто-
ром.

     InitCustom завершается по ошибке в случае, если текстовый
буфер не может быть выделен,  или если завершается  по  ошибке
родительский конструктор  (MemoFile.InitCustomAndAlloc).  Чаще
всего это происходит в случае нехватки памяти.  Для  получения
точной причины можно проверить InitStatus.

     К объектам типа TextEditor имеют отношение три набора па-
раметров из указанного ColorSet.  BlockColor/BlockMono опреде-
ляют атрибуты,  используемые  для  подсветки  маркеров  блока.
MarkerColor/MarkerMono определяют атрибуты,  используемые  для
подсветки маркеров         текста         (закладок).        И
HighlightColor/HighlightMono определяют атрибуты, используемые
для подсветка строк, найденных при выполнении операций поиска.
После инициализации объекта эти атрибуты могут быть изменены с
помощью методов SetBlockAttr, SetMarkerAttr и SetHighlightAttr
соответственно.

Пример

     if MaxAvail < 65521 then
        BufferSize := MaxAvail
     else
        BufferSize := 65521;
     if not TE.InitCustom(2,4,79,24, { Координаты окна }
                    DefaultColorSet, { Набор цветов }
                    DefWindowOptions or wBordered,
                                     { Параметры окна }
                    BufferSize)      { Размер буфера }
       then begin
     WriteLn('Ошибка при инициализации TextEditor. Status =',
            InitStatus);
       Halt;
     end;

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

Смотрите также

     Init                    Memo.InitCustom
     InitBufCustom           MemoFile.InitCustomAndAlloc

InsertStringAtCursor
─────────────────────────────────────────────────────────────
Объявление

     procedure InsertStringAtCursor(S : String);

Функция

     Вставляет строку S в текстовый буфер с текущего положения
курсора.

Описание

     Этот метод позволяет вам вставить строку в текстовый  бу-
фер с  текущей  позиции  курсора.  Его  можно использовать для
встроенной системы макрокоманд,  в которой нажатие на  опреде-
ленные клавиши  приводило бы к вставке в текстовый буфер опре-
деленных строк.    Для     выполнения     операции     вставки
InsertStringAtCursor вызывает      более      общий      метод
InsertTextAtCursor, который и выполняет вставку текста.

Пример

     repeat
        TE.Process;
        ExitCommnd := TE.GetLastCommand;
        case ExitCommand of
           ccAbandonFile,
           ccSaveExit,
           ccError : AllDone := True;
           ccUser0 : begin
                     { ввод вставляемой строки }
                     InsertStringAtCursor(S);
                     end;
           { ... пользовательские команды выхода ...}
           end;
     until AllDone;

     Показывает, как InsertStringAtCursor может быть использо-
вана в качестве пользовательской команды выхода.

Смотрите также

     GotoLineCol

InsertTextAtCursor
─────────────────────────────────────────────────────────────
Объявление

     procedure InsertTextAtCursor(var Data; Bytes : Word);

Функция

     Вставляет Bytes байт из Data в текстовый буфер с текущего
положения курсора.

Описание

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

     Data рассматривается  как array[1..Bytes] of Char и может
содержать все, что может находиться в обычном текстовом файле,
включая символы Возврат каретки/Перевод строки.  Заметим,  что
если Data содержит символ ^Z,  то будет вставлен только текст,
предшествующий символу ^Z.

     TextEditor должен быть текущим окном,  иначе данный метод
ничего не будет делать.

Пример

     Смотрите пример в предшествующем описании.

Load
─────────────────────────────────────────────────────────────
Объявление

     constructor Load(var S : IdStream);

Функция

     Загружает TextEditor из потока.

Описание

     S - это инициализированный объект поток  (файл,  открытый
для  чтения).  S  может быть любым производным от IdStream,  к
примеру DosIdStream, BufIdStream и MemIdStream.

     Load считывает следующую последовательность байт из пото-
ка S.  Эти  байты  должны  быть  выведены  предыдущим  вызовом
TextEditor.Store. Если при сохранении объекта  TextEditor  был
установлен флаг  teStreamReload,  то  в потоке будет сохранено
имя файла,  который был загружен в TextEditor.  При этом  Load
попытается загрузить этот файл.  Если это невозможно,  то Load
завершится по ошибке и InitStatus будет содержать  код  ошибки
ввода/вывода, который был возвращен ReadFile.

     Процедура регистрации      потока      для     TextEditor
TextEditorStream.

Пример

     uses OpCrt,OpRoot,OpCmd,OpFrame,OpWindow,OpMemo, OpEditor
     var
        TE: TextEditor;
        S : BufIdStream;
     begin
        S.Init('EDITOR.STM',SOpen,1024);
        S.RegisterHier(TextEditorStream);
        S.Get(TE);
        if S.GetStatus <> 0 then Halt;
        S.Done;
        TE.Process;
        TE.Erase;
        TE.Done;
     end.

     В этом примере из потока,  созданного вызовом Store, заг-
ружается TE с помощью потокового метода  Get,  который  неявно
вызывает TextEditor.Load. Заметим, что в данном случае не нуж-
но вызывать ReadFile, поскольку при сохранении файла был уста-
новлен флаг teStreamReload.

Смотрите также

     MemoFile.Load           Store

Process
─────────────────────────────────────────────────────────────
Объявление

     procedure Process; virtual;

Функция

     Обрабатывает команды редактирования.

Описание

     Метод TextEditor'a   Process   следует  основной  модели,
описанной под CommandWindow.Process, со следующими дополнения-
ми и исключениями:

     Он обрабатывает команды редактирования,  описанные в раз-
деле "Команды редактирования" в начале раздела.

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

Пример

     Смотрите пример в начале раздела.

Смотрите также

     CommandWindow.Process        Memo.SetStatusProc

SetBlockAttr
─────────────────────────────────────────────────────────────
Объявление

     procedure SetBlockAttr(Color,Mono : Byte);

Функция

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

Описание

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

Пример

     TE.SetBlockAttr($02,$70);

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

SetBlockIndent
─────────────────────────────────────────────────────────────
Объявление

     procedure SetBlockIndent(Indent : Byte);

Функция

     Устанавливает уровень сдвига.

Описание

     Этот метод позволяет вам установить уровень сдвига, кото-
рый будет   использоваться   в    командах    ccBlkIndent    и
ccBlkUnindent. По умолчанию он равен 2.

Пример

     TE.SetBlockIndent(4);

     Устанавливает уровень сдвига в четыре колонки.

SetDefaultExtention
─────────────────────────────────────────────────────────────
Объявление

     procedure SetDefaultExtention(DefExt : ExtStr);

Функция

     Определяет расширение, используемое по умолчанию при зап-
росе имени файла.

Описание

     Данный метод позволяет установить расширение, которое бу-
дет использоваться   по  умолчанию  для  имен  файлов.  ExtStr
(string[3]) определено в OPSTRING.

Пример

     TE.SetDefaultExtention('DOC');

     Устанавливает, что  по  умолчанию  будет   использоваться
расширение .DOC.

Смотрите также

     SetGetFileProc

SetEditProc
─────────────────────────────────────────────────────────────
Объявление

     procedure SetEditProc(EF : EditorEditFunc);

Функция

     Устанавливает функцию ввода строки.

Описание

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

     Процедура должна иметь следующий вид:

     {$F+}
     function EditFunc(MsgCode:Word;Prompt:string;
                          ForceUp,TrimBlanks : Boolean;
                          MaxLen:Byte;var S:string) : Boolean;
     begin
     end;

     Она должна быть откомпилирована в модели FAR ( $F+  ),  и
не должна вставляться внутрь другой процедуры.

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

Пример

     uses OpCrt,OpRoot,OpCmd,OpFrame,OpWindow,OpMemo,OpEditor,
          OpEdit;
     var TE: TextEditor;

     {$F+}
     function MyEditFunc(MsgCode:Word;Prompt:string;
                          ForceUp,TrimBlanks : Boolean;
                          MaxLen:Byte;var S:string) : Boolean;
     var LE:LineEditor;
     begin
        FastFill(80,' ',1,1,TextAttr);
        LE.Init(DefaultColorSet);
           if ForceUp then
              LE.leEditOptionsOn(leForceUpper);
           if not TrimBlanks then
              LE.leEditOptionsOff(leTrimBlanks);
           LE.ReadString(Prompt,1,1,MaxLen,40,S);
           MyEditFunc := (LE.GetLastCommand <> ccQuit);
           LE.Done;
           FastFill(80,' ',1,1,TextAttr);
        end;
     {$F-}
     ...
     TE.SetEditProc(MyEditFunc);
     Устанавливает функцию  редактирования,  которая   выводит
подсказку и вводит строку в верхней части экрана. Заметим, что
максимальная длина строки MaxLen может меняться в  зависимости
от подсказки и свободного места.

SetGetFileProc
─────────────────────────────────────────────────────────────
Объявление

     procedure SetGetFileProc(GFF : EditorGetFileFunc);

Функция

     Устанавливает функцию ввода имени файла.

Описание

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

     Подпрограмма должна иметь следующий вид:

     function GetFile(MsgCode:Word;Prompt:string;
                          ForceUp,TrimBlanks,Writing,MustExist:
                          Boolean; MaxLen:Byte;DefExt:ExtStr;
                          var S:string):Boolean;
     begin
     end;

     Она должна  компилироваться  под моделью FAR {$F+},  и не
должна вставляться внутрь другой процедуры.

     MsgCode - это код сообщения для используемого по  умолча-
нию Prompt.  S  -  это редактируемая строка,  длиной не больше
MaxLen байт. DefExt - это расширение имени файла, используемое
по  умолчанию  (ExtStr определен OPSTRING).  ForceUp говорит о
том,  что все символы должны отображаться в верхнем  регистре.
TrimBlanks говорит, что все начальные и концевые пробелы долж-
ны удаляться.  Если MustExist и Writing оба равны False,  то у
пользователя будет запрашиваться имя файла, который будет соз-
дан позднее при необходимости.  Если MustExist равен  True,  а
Writing равен False, то у пользователя будет запрошено имя су-
ществующего файла, который должен быть присоединен к текущему.
Если Writing равен True,  а MustExist - False, то пользователь
должен ввести имя файла,  который,  если он существует,  будет
перезаписан.  Результат  функции будет равен True только в том
случае, если пользователь ввел имя файла, который удовлетворя-
ет указанным условиям.

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

Пример

     uses
        OpCrt, OpDos, OpRoot, OpString, OpCmd, OpFrame,
        OpWindow, OpMemo, OpEditor, OpEdit;
     var
        TE : TextEditor;
        {$F+}
        function MyGetFileFunc(MsgCode:Word;Prompt:string;
                          ForceUp,TrimBlanks,Writing,MustExist:
                          Boolean; MaxLen:Byte;DefExt:ExtStr;
                          var S:string):Boolean;
        var
           LE : LineEditor;
           Cmd : Word;
        begin
           MyGetFileFunc := False;
           FastFill(80,' ',1,1,TextAttr);
           LE.Init(DefaultColorSet);
           if ForseUp then
              LE.leEditOptionsOn(leForceUpper);
           if not TrimBlanks then
              LE.leEditOptionsOff(leTrimBlanks);
           LE.ReadString(Prompt,1,1,MaxLen,40,S);
           Cmd := GetLastCommand;
           LE.Done;
           FastFill(80,' ',1,1,TextAttr);
           if Cmd = ccQuit then
              Exit;
           S := DefaultExtention(S,DefExt);
           if Writing then
              if ExistFile(S) then
                 { запросить у пользователя подтверждение,
                   что нужно перезаписать файл }
              else
                 MyGetFileFunc := True;
           else if ExistFile(S) or not MustExist then
              MyGetFileFunc := True;
                else
                   { Ошибка. Файл не существует }
        end;
        {$F-}
     ...
     TE.SetGetFileProc(MyGetFileFunc);

     Это практически  полный  пример  EditorGetFileFunc.  Были
опущены следующие детали: 1) вычисление ширины поля редактиро-
вания (40 символов),  2) необязательный  запрос  подтверждения
того, что  файл  должен быть перезаписан и 3) выдача сообщения
об ошибке, возникающей в случае, если файл не существует, в то
время когда он должен существовать.

Смотрите также

     SetEditProc

SetHighlightAttr
─────────────────────────────────────────────────────────────
Объявление

     procedure SetHighlightAttr(Color,Mono : Byte);

Функция

     Устанавливает атрибуты   для  подсвеченного  (найденного)
текста.

Описание

     Этот метод позволяет вам установить атрибуты, которые бу-
дут использоваться  при отображении подсвеченного текста.  Эти
атрибуты используются в двух случаях:  1)когда в операциях по-
иска найдена  строка  и  2) во время операций поиска и замены,
когда найдена строка и у пользователя запрашивается  подтверж-
дение, что ее надо заменить.

Пример

     TE.SetHighlightAttr($4F,$70);

     Отображает найденный  текст белым по красному для цветных
мониторов и в инверсном режиме для монохромных.

SetMarkerAttr
─────────────────────────────────────────────────────────────
Объявление

     procedure SetMarkerAttr(Color,Mono : Byte);

Функция

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

Описание

     Этот метод позволяет вам указать атрибуты, с которыми бу-
дут выводиться текстовые маркеры.  Если,  например, установить
атрибут $70 для монохромного монитора,  то текстовый маркер  1
будет отображаться как '1' в инверсном режиме.

Пример

     TE.SetMarkerAttr($1F,$70);

     Отображает текстовый  маркер  белым  по синему на цветных
мониторах и в инверсном режиме на монохромных.

SetPrinter
─────────────────────────────────────────────────────────────
Объявление

     procedure SetPrinter(LptNum : Byte);

Функция

     Определяет номер порта принтера (1-3).

Описание

     Данный метод позволяет определить принтер,  который будет
использован при  выполнении команды ccBlkPrint.  LptNum должен
содержать число  в  диапазоне  от  1  до  3,   соответствующее
LPT1-LPT3. Если будет указано любое другое значение,  то будет
использован LPT1.

Пример

     TE.SetPrinter(2);

     Направляет вывод на LPT2.

SetYesNoProc
─────────────────────────────────────────────────────────────
Объявление

     procedure SetYesNoProc(YNF : EditorYesNoFunc);

Функция

     Устанавливает функцию Да-Нет.

Описание

     Этот метод позволяет вам определить собственную  подпрог-
рамму, которая будет вызвана TextEditor, когда ему потребуется
ответ типа Да-Нет. В случае, если такая процедуре не будет оп-
ределена, то  соответствующие команды редактирования будут не-
доступны (смотрите список команд редактирования в начале  дан-
ного раздела).

     Подпрограмма должна иметь следующий вид:

     {$F+}
     function YesNo(MsgCode:Word;Prompt:string;Default:Byte;
                    QuitAndAll:Boolean):Byte;
     begin
     end;

     Она должна  компилироваться  под моделью FAR {$F+},  и не
должна находиться внутри другой процедуры.

     MsgCode - это код,  используемый для Prompt по умолчанию.
Default определяет ответ, подразумеваемый по умолчанию. Он мо-
жет быть следующим teNo (0),  teYes(1), teQuit (2), teAll (3).
Эти коды также определяют единственно допустимые значения, ко-
торые должна возвращать функция.  Заметим,  что teAll является
допустимым кодом возврата только в случае, если QuitAndAll ра-
вен True.  Если QuitAndAll равен False, то teQuit рассматрива-
ется  эквивалентно teNo.  QuitAndAll равен True только при вы-
полнении операций поиска и замены.

Пример

     uses
        OpCrt, OpString, OpRoot, OpCmd, OpWindow, OpMemo,
        OpEditor, OpField, OpEdit;
     var
        TE : TextEditor;

        {$F+}
        function MyYesNo(MsgCode:Word;Prompt:string;
                      Default:Byte;QuitAndAll:Boolean):Byte;
        var LE : LineEditor;
            Ch : Char;
            CharToTake : CharSet;
        begin
           FastFill(80,' ',1,1,TextAttr);
           LE.Init(DefaultColorSet);
           LE.leEditOptionsOn(leAllowEscape+leDefaultAccept+
                              leForseUpper);
           if Default = teYes then
              Ch := 'Y'
           else
              Ch := 'N';
           if QuitAndAll then begin
              CharsToTake := ['Y','N','A','Q'];
              Prompt := Prompt+' (Y/N/A/Q)'
           end
           else
              CharsToTake := ['Y','N'];
           LE.ReadChar(Prompt,1,1,CharsToTake,Ch);
           if LE.GetLastCommand = ccQuit then
              MyYesNo := teQuit
           else case Ch of
              'Y' : MyYesNo :=teYes;
              'N' : MyYesNo :=teNo;
              'A' : MyYesNo :=teAll;
              'Q' : MyYesNo :=teQuit;
           end;
           LE.Done;
           FastFill(80,' ',1,1,TextAttr);
        end;
        {$F-}
     ...
     TE.SetYesNoProc(MyYesNo);

     Типичная функция     До-Нет.    Заметим,    что    вместо
LineEditor.YesOrNo была   использована    LineEditor.ReadChar,
поскольку необходимо обрабатывать еще и teAll и teQuit.

Смотрите также

     SetEditProc

Store
─────────────────────────────────────────────────────────────
Объявление

     procedure Store(var S : IdStream);

Функция

     Сохраняет в потоке TextEditor.

Описание

     S - это правильно инициализированный  объект  типа  поток
(обычно поток, связанный с файлом, открытым для записи). Заме-
тим, что S может быть любым объектом,  производным от IdStream
(DosIdStream, BufIdStream   и   MemIdStream),   однако  обычно
MemIdStream не используется.

     Store выводит образ TextEditor в поток S. Если установлен
флаг teStreamReload,  то в потоке будет также сохранено и  имя
текущего файла.  В  этом  случае  при вызове Load будет вызван
ReadFile для того, чтобы загрузить этот файл в редактор.

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

     TextEditorStream - это  потоковая  процедура  регистрации
для TextEditor.

Пример

     uses
        OpCrt, OpRoot,  OpCmd,  OpFrame,   OpWindow,   OpMemo,
        OpEditor;
     var
        TE : TextEditor;
        S : BufIdStream;
        FSize : LongInt;
        Status : Word;
     begin
        if not TE.InitCustom(2,4,79,24,
              GefaultColorSet, DefWindowOptions or wBordered,
              65521) then begin
           WriteLn('Ошибка Init TextEditor. Status = ',Status);
           Halt;
        end;
        TE.ReadFile('READ.ME',FSize);
        TE.teOptionsOn(teStreamReload);
        S.Init('EDITOR.STM',SCreate,1024);
        S.RegisterHier(TextEditorStream);
        S.Put(TE);
        Status := S.GetStatus;
        if Status<>0 then begin
           WriteLn('Ошибка Store',Status);
           Halt;
        end;
       S.Done;
       TE.Done;
     end.

     В данном примере мы создали экземпляр TE,  загрузили файл
и сохранили TE в потоке,  используя потоковый метод Put, кото-
рый неявно производит вызов  Store.  В  Load  приведен  пример
программы, производящей перезагрузку TextEditor.

Смотрите также

     Load                              MemoFile.Store

teOptionsAreOn
─────────────────────────────────────────────────────────────
Объявление

     function teOptionsAreOn(OptionFlags:LongInt):Boolean;

Функция

     Возвращает True, если все указанные опции включены.

Описание

     Этот метод возвращает True, если все указанные опции
включены.

Пример

     if TE.teOptionsAreOn(teWordWrap) then
        TE.teOptionsOff(teWordWrap)
     else
        TE.teOptionsOn(teWordWrap);

     Переключает опцию переноса слов.

teOptionsOff
─────────────────────────────────────────────────────────────
Объявление

     procedure teOptionsOff(OptionFlags:LongInt);

Функция

     Выключает указанную опцию.

Описание

     Данный метод выключает указанную опцию (опции),  исключая
те, которые   относятся  к  BadMemoOptions  (см.  выше  раздел
"Константы").

Пример

     TE.teOptionsOff(teWordWrap+teIndent);

     Выключает перенос слов и режим автоматического сдвига.

teOptionsOn
─────────────────────────────────────────────────────────────
Объявление

     procedure teOptionsOn(OptionFlags:LongInt);

Функция

     Включает указанную опцию.

Описание

     Данный метод  включает указанную опцию (опции),  исключая
те,  которые  относятся  к  BadMemoOptions  (см.  выше  раздел
"Константы").

Пример

     TE.teOptionsOn(teWordWrap+teIndent);

     Включает перенос слов и режим автоматического сдвига.



                D.OPBROWSE : Просмотр файлов.

     Данный раздел  состоит из двух частей.  В первой описыва-
ется сам объект Browser,  а во второй описываются обычные про-
цедуры и функции, которые взаимодействуют с OPBROWSE.

                         1. Browser.

     При чтении документации по объекту TextEditor возможно вы
запомнили, что, установив флаг teReadOnly, вы можете использо-
вать  TextEditor  в качестве программы просмотра файлов,  т.е.
служебной программы для проверки содержимого файлов без  изме-
нения их содержимого. Хотя данная хитрость обычно срабатывает,
вы в результате получаете довольно ограниченную программу: она
не  может  работать  с двоичными файлами,  не может работать с
файлами большими, чем 64К. Эти ограничения обычно не так важны
для  редактора,  как для программы просмотра файлов.  Отсюда и
возникает необходимость в объекте Browser.

     Browser имеет внутреннее отличие в том,  как он сохраняет
содержимое файла. Вместо того, чтобы использовать один большой
буфер, Browser использует несколько буферов размером в 4К, на-
зываемых также страничными буферами. Более важно то, что он не
пытается сохранить в памяти  содержимое  всего  файла.  Вместо
этого он поддерживает набор структур данных,  называемых стра-
ницами, по одной для каждого страничного буфера, которые и со-
держат информацию  о том,  какую часть файла и содержит данный
страничный буфер. Если Browser необходим доступ к части файла,
которой в  настоящий  момент  в  памяти  нет,  то он проверяет
список страниц,  которые в настоящий момент в памяти, выбирает
ту, которая не нужна и записывает в ее буфер содержимое нужной
части файла. Т.о., Browser теоретически можно использовать для
просмотра файлов  размером  до 2 гигабайт при использовании им
всего лишь 8К буфера.  (Конечно, чем больше размер буфера, тем
лучше его характеристики).

     Небольшая программа иллюстрирует основные шаги, требуемые
при использовании Browser.

     program BrowseExample; { EXBROWSE.PAS }
     uses
        Dos, OpCrt, OpRoot, OpCmd, OpDos, OpFrame, OpWindow,
        OpBrowse;
     var
        B:Browser;
        Status : Word;
        Finished : Boolean;
     bagin
        if not B.InitCustom(2,3,79,24,     { Координаты окна }
                         DefaultColorSet,  { Цвета }
                         DefWindowOptions or Bordered,
                         MaxAvail){ максимальный размер буфера }
        then begin
           WriteLn('Ошибка в Init Browser. Status = ',
                    InitStatus);
           Halt;
        end;

        { открыть и проверить существование файла }
        B.OpenFile('BROWSE.PAS');
        Status := B.GetLastError;
        if Status <> 0 then begin
           WriteLn('Ошибка при открытии файла. Status =',
                    Status);
           Halt;
        end;

        { Использовать встроенную подпрограмму отображения
          состояния }
        B.SetStatusProc(BrowseStatus);

        Finished := False;
        repeat
           B.Process;
           case B.GetLastCommand of
             ccQuit,ccError:Finished := True;
              { ...пользовательские команды выхода...}
           end;
        until Finished
        B.Erase;
        B.Done;
        ClrScr;
        end.

     Как вы   возможно   заметили,   первые  шесть  параметров
InitCustom стандартные: координаты окна, цвета и параметры ок-
на. Последний  параметр  уникален  для Browser.  Он определяет
максимальный объем  памяти,  которую  Browser   выделяет   для
использования под страницы и страничные буфера.  Поскольку это
простой пример и нам больше ни для чего память не нужна, то мы
указали максимально возможный размер, MaxAvail.

     После создания  объекта Browser следующим шагом мы должны
указать ему просматриваемый файл, для чего мы используем метод
OpenFile,  который открывает файл только для чтения. В отличие
от примеров программ на MemoFile и TextEditor, в данном случае
использована проверка на возникновение ошибок, поскольку здесь
они возможны.  При возникновении ошибки больше делать  нечего,
т.к. Process  не  может больше ничего сделать,  за исключением
завершения по ошибке (по команде ccError).

     Перед входом в основной цикл программы мы добавляем вызов
метода   SetStatusProc  для  установки  процедуры  отображения
состояния,  которая выводит информацию в верхней части  экрана
(заметим,  что  в вызове InitCustom мы указали верхнюю границу
на строке 2,  чтобы оставить место для строки статуса).  В ка-
честве  параметра  передается процедура BrowseStatus,  которая
содержится в OPBROWSE и которую вы можете использовать  как  в
том виде,  в котором она поставляется, так и в качестве модели
для написания собственной процедуры отображения статуса.

     Основной цикл программы довольно прост, поскольку нет до-
полнительных команд выхода, кроме стандартных ccQuit (выход) и
ccError (возникновение фатальной ошибки).

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

     Эту программу можно улучшить во многих  отношениях.  Она,
например, не имеет процедуры отображения сообщений об ошибках.
Однако, самое главное, она не дает пользователю доступа ко всем
командам Browser.  Для этого необходимо создать процедуры для
ввода строк и имен файлов  пользователем.  Это  обсуждается  в
двух разделах: "Команды Browser" и "Программные ловушки". Если
вы хотите  увидеть  более  полный  пример,   посмотрите   файл
BROWSE.PAS.

                       Команды Browser.

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

     Заметим, что  некоторые  из этих команд в списке доступны
только при подключении одной или более пользовательских проце-
дур. В  этом  случае описание такой команды завершается именем
(именами) метода (методов) Browser, которые представляет соот-
ветствующую программную ловушку.  Имя приводится в скобках как
здесь: (SetEditProc).

                 Команды перемещения курсора.

     ccLeft                  <Left>, <CtrlS>
     Прокручивает окно на одну позицию влево.

     ccRight                 <Right>, <CtrlI>
     Прокручивает окно на одну позицию вправо.

     ccWordLeft              <CtrlLeft>, <CtrlA>
     Прокручивает окно на 10 позиций влево.

     ccWordRight             <CtrlRight>, <CtrlF>
     Прокручивает окно на 10 позиций вправо.

     ccHome                  <Home>, <CtrlQ><S>
     Прокручивает окно до позиции 1.

     ccEnd                   <End>, <CtrlQ><D>
     Прокручивает окно до самой левой позиции  таким  образом,
чтобы была видна самая длинная строка.

     ccUp                    <Up>, <CtrlE>, <CtrlW>
     Прокручивает окно на одну позицию вверх.

     ccDown                  <Down>, <CtrlX>, <CtrlZ>
     Прокручивает окно на одну строку вниз.

     ccPageUp                <PgUp>, <CtrlR>
     Прокрутить изображение на одну страницу вверх.

     ccPageDn                <PgDn>, <CtrlC>
     Прокрутить изображение на одну страницу вниз.

     ccTopOfFile             <CtrlPgUp>, <CtrlQ><R>
     Перемещает в начало файла.

     ccEndOfFile             <CtrlPgDn>, <CtrlQ><C>
     Перемещает в конец файла.

     ccJmpLine               <CtrlJ><L>
     Запрашивает у пользователя номер  строки  и  прокручивает
окно таким образом,  чтобы эта строка была верхней.  Если этот
номер больше, чем число строк в файле, то происходит перемеще-
ние в конец файла. (SetEditProc).

                      Файловые команды.

     ccNewFile               <F3>, <CtrlK><N>
     Загрузить новый файл. (SetEditProc).

                      Блоковые команды.

     ccBlkBegin              <F7>, <CtrlK><B>
     Маркирует верхнюю строку окна как начало блока.  Заметим,
что Browser считает частью блока только целые строки.

     ccBlkEnd                <F8>, <CtrlK><K>
     Маркирует верхнюю строку окна как конец блока.

     ccBlkBottom             <CtrlB><K>
     Маркирует нижнюю строку как конец блока.

     ccJmpBegin              <CtrlQ><B>
     Перемещает на начало текущего выбранного блока.

     ccJmpEnd                <CtrlQ><K>
     Перемещает на конец текущего выбранного блока.

     ccBlkToggle             <CtrlK><H>
     Включает и выключает отображение выбранного блока.  Заме-
тим, команды ccBlkWrite и ccBlkPrint генерируют  ошибки,  если
отключено отображение блока.

     ccBlkWrite              <CtrlK><W>
     Сохраняет текущий выбранный и отображаемый блок в  файле.
Заметим, что команда записывает действительное содержимое фай-
ла, а не то изображение,  что вы видите на экране. Команда со-
вершает одинаковые действия, когда вы находитесь в 16-ричном и
в ASCII режиме.(SetGetFileProc)

     ccBlkPrint              <CtrlK><P>
     Выводит текущий выбранный и отображаемый блок на принтер.
Как и ccBlkWrite выводит на принтер действительное  содержание
файла. По умолчанию ccBlkPrint осуществляет вывод на LPT1. Для
выбора LPT2 или LPT3 вызовите метод SetPrinter.

                       Команды поиска.

     ccSearch                <CtrlQ><F>
     Позволяет пользователю производить поиск строки длиной до
30 символов.  После  ввода строки у пользователя запрашиваются
параметры поиска того же типа, что и параметры поиска редакто-
ра Borland.  Допустимые параметры: 'B' - поиск в обратном нап-
равлении  (к  началу  файла),  'G' - глобальный поиск по всему
тексту,  'U' - поиск с игнорированием регистра.  Если  искомая
строка найдена, то она будет подсвечена до тех пор, пока поль-
зователь не нажмет любую клавишу. (SetEditProc)

     ccReSearch              <CtrlL>
     Повторяет предыдущую   команду  поиска.  В  поиске  будет
использоваться та же строка, что и в предыдущей команде. Будут
использоваться те  же параметры поиска.  Если во время данного
сеанса работы не выполнялось команд поиска то никакие действия
производиться не будут.

                       Маркеры текста.

     ccSetMark0..9           <CtrlK><0>..<CtrlK><3>
     Устанавливает один из десяти текстовых маркеров в  начало
верхней строки   окна.   <CtrlK><0>  устанавливает  маркер  0,
<CtrlK><1> - маркер 1 и т.д.  Заметим, что в таблице команд по
умолчанию   в   OPBROWSE  командам  ccSetMark4..ccSetMark9  не
присвоены последовательности клавиш.

     ccJmpMark0..9           <CtrlQ><0>..<CtrlQ><3>
     Прокручивает окно  таким образом,  чтобы строка с которой
связан соответствующий текстовый маркер,  оказалась бы верхней
строкой  в  окне.  <CtrlQ><0>  перемещает  курсор на маркер 0,
<CtrlQ><1> - на маркер 1 и т.д.  Заметим, что в таблице команд
по  умолчанию  в  OPBROWSE  командам ccJmpMark4..ccJmpMark9 не
присвоены последовательности клавиш.

                    Переключение режимов.

     ccHexMode               <CtrlH>
     Переключает между  ASCII режимом (используется по умолча-
нию) и 16-ричным режимом.  В 16-ричном режиме  отображаются  в
строке 8 или 16 символов,  в зависимости от ширины окна. (Если
ширина внутренней области окна меньше 50 символов,  то печата-
ется 8  символов  в строке).  В самой левой колонке печатается
смещение относительно начала файла (в 16-ричной нотации)  пер-
вого символа данной строки,  средняя колонка отображает содер-
жимое строки в 16-ричной форме,  а самая правая отображает со-
держимое строки в ASCII.

     ccStripHigh             <CtrlQ><H>
     Активизирует или отключает подавление старшего бита  (бит
7) для  каждого  символа.  В  режиме  ASCII эта команда влияет
только на символы с кодами от 128 и больше (10000000 в  двоич-
ном виде),  вызывая тем самым,  что,  например, символ с кодом
228 будет отображаться как символ с кодом 100 ('d'). В 16-рич-
ном  режиме  он  также  влияет на управляющие символы,  выводя
вместо них точки ('.').  Однако, на 16-ричные значения в сред-
ней колонке данная опция не влияет.

     ccTabExpand             <CtrlQ><T>
     Разрешает или запрещает  расширение  символов  табуляции.
Когда расширение разрешено, символы табуляции (^I) расширяются
до числа пробелов,  необходимых для перехода на следующую  ко-
лонку табуляции (Колонки табуляции это каждая 8:  1,  9,  17 и
т.д.). В 16-ричном режиме данная опция не  производит  никаких
действий.

                          Остальные.

     ccQuit                  <CtrlBreak>, <Esc>, ClickRight>
     Завершение просмотра.

     ccHelp                  <F1>, <ClickBoth>
     Помощь. Если  пользовательская  подпрограмма выдачи спра-
вочной    информации     была     определена     с     помощью
BrowseCommands.SetHelpProc,  нажатие F1 приведет к вызову этой
подпрограммы. В противном случае эта команда не делает ничего.
Если подпрограмма выдачи справочной информации определена,  то
Browser передаст ей три параметра: ucBrowse, @Self и значение,
предназначенное  в качестве индекса оконной справочной системы
(см.  CommandWindow.SetHelpIndex),  который по умолчанию равен
0.

     ccMouseSel              <ClickLeft>
     Если окно не имеет строки прокрутки или  горячих  клавиш,
то данная команда не выполняет никаких действий.

                     Программные ловушки.

     Программные ловушки Browser аналогичны программным ловуш-
кам TextEditor, и также разделены на две группы.

     Первая - это тройка методов,  которые получают в качестве
параметра   адрес   функции:   SetEditProc,  SetGetFileProc  и
SetYesNoProc.  SetStatusProc позволяет вам указать  процедуру,
которая  будет вызываться при прокрутке окна или при командах,
которые могут потребовать для выполнения  много  времени.  Как
показано в  вышеприведенном примере,  OPBROWSE поставляется со
встроенной процедурой  отображения  состояния,  которая  может
удовлетворить вас во многих случаях. SetEditProc позволяет вам
указать процедуру,  которая будет вызываться при необходимости
ввести строку.  Без такой процедуры будут недоступны некоторые
команды (например,  команды поиска).  SetGetFileProc позволяет
вам указать процедуру, которая будет вызвана при необходимости
ввода имени файла. Без нее будут недоступны некоторые блоковые
и файловые команды.

     Вторая часть    ловушек    состоит   из   трех   методов:
GotoLine, GotoOffset,  Transfer. Цель данных методов состоит в
упрощении   реализации   команд,  определяемых  пользователем.
GotoLine и GotoOffset позволяет вам  перейти  на  определенную
позицию  в  файле.  GotoOffset  может  быть  использована  для
просмотра  двоичных  файлов  в  16-ричном  режиме,  тогда  как
GotoLine  удобнее использовать при просмотре текстовых файлов.
Transfer используется для выделения данных из просматриваемого
файла.  Ее  обычно используют в прикладных задачах,  в которых
необходимо как  редактировать,  так  и  просто   просматривать
тексты (DESKPOP). Transfer можно использовать в качестве поль-
зовательской команды выхода,  которая копирует содержимое выб-
ранного блока из Browser в TextEditor.

                          Константы.

     BadBrowseOptions : Word = 0;

     Флаги, предназначенные  для  внутреннего  использования и
которые не могут изменяться при помощи методов  brOptionsOn  и
brOprionsOff. Пока таких флагов нет.

     brBackward = 'B';
     brNoCase = 'U';
     brGlobal = 'G';

     Символы параметров поиска.  'B' означает поиск в обратном
направлении, 'U'  - игнорирование регистров,  'G' - глобальный
поиск по всему тексту от начала  (при  нормальном  направлении
поиска) или  от  конца (при обратном направлении поиска).

     brHexMode      = $0001;      { 16-ричный режим }
     brTabExpand    = $0002;      { расширение символов таб. }
     brStripHigh    = $0004;      { подавление старшего бита }
     brMousePage    = $0008;      { Нажатие мыши на па-      }
                          { нели прокрутки приведет к про-   }
                          { крутке страницы.                 }
     brNewFile      = $0010;      { флаг устанавливается при }
                          { загрузке нового файла            }
     brStreamReload = $0020;      { перезагрузить файл при   }
                          { активизации сохраненного в пото- }
                          { ке Browser                       }

     Здесь представлены флаги,  влияющие на поведение Browser.
brHexMode выбирает, что файл будет отображаться в виде 16-рич-
ного дампа,  а не в ASCII виде.  brTabExpand  определяет,  что
символы табуляции  будут расширяться в пробелы при отображении
в ASCII режиме.  brStripHigh вызывает подавление старшего бита
в каждом байте (только для отображения). brMousePage определя-
ет что случиться при нажатии мышкой на стрелке вверх или  вниз
в строке прокрутки. Если флаг сброшен, то окно будет прокруче-
но на одну строку,  если  установлен  то  на  целую  страницу.
brNewFile  это  внутренний  флаг,  который устанавливается при
загрузке нового файла.  Его основное предназначение состоит  в
том, чтобы сообщить процедуре отображения состояния, что изме-
нилось имя файла.  brStreamReload влияет на работу Browse.Load
и Browse.Store. Если он установлен, то Store сохранит в потоке
имя просматриваемого файла.  При загрузке его вызовом Load, он
попытается загрузить в Browser файл,  имя которого было сохра-
нено.

     BrowseKeyMax = 260;
     BrowseKeyID : string[13] = 'opbrowse keys';
     BrowseKeySet: array[0..BrowseKeyMax] of Byte = (...);
     BrowseCfgEnd : Byte = 0;

     BrowseKeyID содержит  идентификационную  строку,  которая
используется для  указания  начала области данных конфигурации
для OPBROWSER.  BrowseCfgEnd указывает конец этой области  дан-
ных. Между  ними  находится  BrowseKeySet  -  таблица  команд,
используемая BrowseCommands.  BrowseKeyMax - это последний до-
пустимый индекс в таблице.

     DefBrowseExt : ExtStr = '';

     Расширение имени  файла,  используемое  по  умолчанию при
запросе имени файла.

     DefBrowseOptions : Word = brTabExpand+brMousePage;

     Используемые по умолчанию параметры Browser.

     MaxScrollCol : Word = 999;

     Максимальное число  колонок для горизонтальной прокрутки.
999 необязательно и может быть  изменено.  Значение  считается
относительно  0,  т.е.  MexScrollCol  999  говорит о том,  что
последней   колонкой   справа   может   быть   1000   колонка.
MaxScrollCol = 0 отключает горизонтальную прокрутку.

     MaxSearchLen = 30

     Максимальная длина строки поиска.

                            Типы.

     BrowseEditFunc = function(MsgCode:Word;Prompt:string;
                          ForceUp,TrimBlanks : Boolean;
                          MaxLen:Byte;var S:string) : Boolean;

     Пользовательская процедура для запроса  и  ввода  строки.
(Смотрите описание SetEditProc).

     BrowseGetFileFunc = function(MsgCode:Word;Prompt:string;
                          ForceUp,TrimBlanks,Writing,MustExist:
                          Boolean; MaxLen:Byte;DefExt:ExtStr;
                          var S:string):Boolean;

     Пользовательская процедура для ввода имени файла.  (Смот-
рите описания SetGetFileProc).

     BrowserPtr = Browser;
     Browser =
        object(CommandWindow)
           ...
           brLPT : Bybr;
           { принтер (1-3)}
           brDefExt : ExtStr;
           { расширение, используемое по умолчанию }
           brSearchSt : string[MaxSearchLen];
           { строка для поиска }
           brOptionSt : string[5];
           { параметры поиска }
           brLastPos : LongInt;
           { максимальное смещение в файле = размер-1 }
           brCurPos : LongInt;
           { текущая отображаемая позиция в файле }
           brCurLine : Word;
           { текущая отображаемая строка файла (1..Max) }
           brLastLine : Word;
           { номер последней строки в файле }
           brLastLine2 : Word;
           { номер последней строки в файле в 16-ричном реж. }
           brColOfs : Integer;
           { смещение горизонтальной прокрутки }
           brBlkBegin : MarkerRec;
           { начало блока }
           brBlkEnd : MarkerRec;
           { конец блока }
           brWorkingFlag L ShortInt;
           { не равен 0 при выполнении долгой операции }
           brBlockOn : Booleanl
           { True, если блок видим }
           ...
        end;

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

     brLPT определяет номер принтера, используемого при выпол-
нении команды ccBlkPrint.По умолчанию равно  1,  что  означает
LPT1. brDefExbrntion - это расширение имени файла,  используе-
мое по умолчанию.  brSerchSt - это  последняя  строка  поиска.
brOptionSt   содержит  параметры  поиска,  использованные  при
последней такой операции. brLastPos - это максимально допусти-
мое смещение  в  файле  (FileSize-1).  brCurPos - это смещение
верхней строки,  отображаемой в окне Browser.  brCurLine - это
номер  строки  (различный  для  ASCII  и  16-ричного режимов).
brLastLine - номер последней строки файла  (0  не  определен).
brLastLine2 -  содержит номер последней строки перед последним
изменением режима. brColOfs определяет номер колонки отобража-
емой в окне с первой позиции минус 1.

     brBlkBegin и  brBlkEnd определяют начало и конец текущего
brBlkBegin.FilePos <=    0    или    brBlkBegin.FilePos     >=
brBlkEnd.FilePos блока.  Блок  считается неопределенным,  если
равны 0.  brWorkingFlag устанавливается в  ненулевое  значение
при выполнении  операций,  требующих  продолжительного времени
(операции поиска или чтения данных с диска).  brBlockOn -  это
внутренний флаг, который равен True, если включено отображение
выбранного блока.

     BrowseStatusProc = procedure(BP : BrowserPtr);

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

     MarkerRec =
        record
           FilePos : LongInt;
           LineNum : Integer;
        end;
     MarkerArray = array[0..MaxMarker] of MarkerRec;

     MarkerRec - это внутренняя  структура,  используемая  для
хранения   отдельного  маркера  текста  и  блока.  MarkerArray
используется для хранения всей группы текстовых маркеров.


                         Переменные.

     BrowseCommands : CommandProcessor;

     CommandProcessor используемый по умолчанию с Browser.

teOptionsAreOn
─────────────────────────────────────────────────────────────
Объявление

     function brOptionsAreOn(OptionFlags:Word):Boolean;

Функция

     Возвращает True, если все указанные опции включены.

Описание

     Этот метод возвращает True, если все указанные опции
включены.

Пример

     if B.brOptionsAreOn(brStripHigh) then
        B.ToggleHighBitStripping;

     Выключает подавление старшего бита.

brOptionsOff
─────────────────────────────────────────────────────────────
Объявление

     procedure brOptionsOff(OptionFlags:Word);

Функция

     Выключает указанную опцию.

Описание

     Данный метод выключает указанную опцию (опции),  исключая
те,  которые относятся к  BadBrowseOptions  (см.  выше  раздел
"Константы").

     Важное замечание.   Хотя   brStripHigh   и  brHexMode  не
рассматриваются как "bad",  вы никогда не должны  использовать
brOptionsOff для  их  изменения  во  время  загрузки  файла  в
Browser. Вместо этого используйте ToggleHighBitStripping и/или
ToggleModes.

Пример

     B.brOptionsOff(brTabExpand);

     Выключает расширение символов табуляции.

brOptionsOn
─────────────────────────────────────────────────────────────
Объявление

     procedure brOptionsOn(OptionFlags:Word);

Функция

     Включает указанную опцию.

Описание

     Данный метод  включает указанную опцию (опции),  исключая
те, которые относятся  к  BadBrowseOptions  (см.  выше  раздел
"Константы").

     Важное замечание.   Хотя   brStripHigh   и  brHexMode  не
рассматриваются как "bad",  вы никогда не должны  использовать
brOptionsOn для   их  изменения  во  время  загрузки  файла  в
Browser. Вместо этого используйте ToggleHighBitStripping и/или
ToggleModes.


Пример

     B.brOptionsOn(brTabExpand);

     Включает расширение символов табуляции.

CloseFile
─────────────────────────────────────────────────────────────
Объявление

     procedure CloseFile;

Функция

     Закрывает текущий просматриваемый файл.

Описание

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

Пример

     Смотрите пример на GotoLine.

Смотрите также

     OpenFile

CurrentFileName
─────────────────────────────────────────────────────────────
Объявление

     function CurrentFileName : String;

Функция

     Возвращает имя просматриваемого файла.

Описание

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

Пример

     WriteLn("Просматриваемый файл: ",CurrentFileName);

     Выводит имя просматриваемого файла.

Смотрите также

     SetStatusProc

Done
─────────────────────────────────────────────────────────────
Объявление

     destructor Done; virtual;

Функция

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

Описание

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

Смотрите также

     CommandWindow.Done           InitCustom
     Init

GotoLine
─────────────────────────────────────────────────────────────
Объявление

     procedure GotoLine(Line : Word);

Функция

     Прокручивает окно до строки Line.

Описание

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

Пример

     SaveLine := B.brCurLine;
     SaveName := B.brCurrentFileName;
     B.Erase;
     B.CloseFile;
     { ... выполнить некоторые действия ...}
     B.OpenFile(SaveName);
     B.GotoLine(SaveLine);
     B.Draw;

     Закрывает текущий  файл,  производит  некоторые действия,
повторно открывает файл и переходит в ту же точку,  в  которой
прервал работу. (Обработка ошибок в данном примере опущена.)

GotoOffset
─────────────────────────────────────────────────────────────
Объявление

     procedure GotoOffset(Offset : LongInt);

Функция

     Прокручивает окно до строки, ближайшей к Offset.

Описание

     Этот метод  позволяет  вам прокрутить окно таким образом,
чтобы строка, ближайшая к Offset, стала первой в окне.

Пример

     SavePos := B.brCurPos;
     SaveName := B.brCurrentFileName;
     B.Erase;
     B.CloseFile;
     { ... выполнить некоторые действия ...}
     B.OpenFile(SaveName);
     B.GotoOffset(SavePos);
     B.Draw;

     Закрывает текущий  файл,  производит  некоторые действия,
повторно открывает файл и переходит в ту же точку,  в  которой
прервал работу. (Обработка ошибок в данном примере опущена.)

Init
─────────────────────────────────────────────────────────────
Объявление

     constructor Init(X1,Y1,X2,Y2 : Byte; HeapToUse : LongInt);

Функция

     Инициализирует объект типа Browser, используя параметры и
цвета по умолчанию.

Описание

     Этот конструктор инициализирует Browser  используя  пара-
метры окна  по умолчанию (DefWindowOptions) и цвета по умолча-
нию (DefaultColorSet).  Детальное  описание   вы   найдете   в
InitCustom.

Пример

     if not B.Init(1,1,ScreenWigth,ScreenHeight,MaxAvail)
        then begin
        WriteLn(Ошибка при инициализации Browser. Status =',
                InitStatus);
        Halt;
     end;

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

InitCustom
─────────────────────────────────────────────────────────────
Объявление

     constructor InitCustom(X1,Y1,X2,Y2 : Byte;
                            var Colors : ColorSet;
                            Options : LongInt;
                            HeapToUse : LongInt);

Функция

     Инициализирует объект типа Browser,  используя  указанные
параметры и цвета.

Описание

     InitCustom создает объект типа Browser, используя указан-
ные параметры и цвета.  X1,  Y1, X2, Y2 - это координаты внут-
ренней области окна, где отображается файл.

     HeapToUse определяет  максимальный объем памяти,  который
может быть выделен для страничных буферов. Если указанное зна-
чение превышает MaxAvail,  то MaxAvail используется в качестве
максимального значения.  "Страница" - это внутренняя структура
данных, которая состоит из двух частей: из буфера размером 4К,
в котором хранится часть просматриваемого файла,  и  маленькой
структуры данных, которая позволяет отслеживать содержимое бу-
фера.  Browser поддерживает массив этих  структур  переменного
размера чтобы  поместить  в память максимально возможный объем
файла одновременно.  Для минимизации обращения к диску исполь-
зуется алгоритм  LRU (Меньше Всего Используемый) для определе-
ния того,  какая страница должна быть перезаписана при необхо-
димости считать новые данные с диска.

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

     Из набора  атрибутов ColorSet для окон типа Browser имеют
значение три группы:  BlockColor/BlockMono определяют атрибуты
используемые для       подсветки       выбранного       блока,
MarkerColor/MarkerMono определяют атрибуты,  с которыми  будут
выводиться маркеры текста,  а HighlightColor/HighlightMono оп-
ределяют атрибуты с которыми будут подсвечиваться строки,  со-
держащие искомую,  найденную при операции поиска. После созда-
ния объекта эти атрибуты  можно  изменить  с  помощью  методов
SetBlockAttr, SetMarkerAttr, SetHighlightAttr соответсвенно.

Пример

     if not B.InitCustom(2,2,ScreenWidth-1,ScreenHeight-1,
                         DefaultColorSet,
                         DefWindowPotions or wBordered,
                         MaxAvail) then begin
        WriteLn(Ошибка при инициализации Browser. Status =',
                InitStatus);
        Halt;
     end;

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

Load
─────────────────────────────────────────────────────────────
Объявление

     constructor Load(var S : IdStream);

Функция

     Загружает Browser из потока.

Описание

     S -  это инициализированный объект-поток (файл,  открытый
для чтения).  S может быть любым производным от IdStream, нап-
ример, DosIdStream, BufIdStream и MemIdStream.

     Load считывает следующую последовательность байт из пото-
ка S.  Эти  байты  должны  быть  выведены  предыдущим  вызовом
Browser.Store.  Если  при сохранении объекта Browser был уста-
новлен флаг brStreamReload,  то в потоке будет  сохранено  имя
файла,  который был загружен в Browser.  При этом Load попыта-
ется загрузить этот файл.  Если это невозможно, то Load завер-
шится по  ошибке  и InitStatus будет содержать код ошибки вво-
да/вывода, который был возвращен ReadFile.

     Процедура регистрации потока для Browser BrowserStream.

Пример

     uses Dos, OpCrt, OpRoot, OpCmd, OpDos, OpFrame,OpWindow,
          OpBrowse;
     var
        B: Browser;
        S : BufIdStream;
     begin
        S.Init('BROWSE.STM',SOpen,1024);
        S.RegisbrrHier(BrowserStream);
        S.Get(B);
        if S.GetStatus <> 0 then Halt;
        S.Done;
        B.Process;
        B.Erase;
        B.Done;
     end.

     В этом примере из потока,  созданного вызовом Store, заг-
ружается B с помощью потокового метода Get, который неявно вы-
зывает Browser.Load. Заметим, что в данном случае не нужно вы-
зывать OpenFile, поскольку при сохранении файла был установлен
флаг brStreamReload.

Смотрите также

     CommandWindow.Load           Store

OpenFile
─────────────────────────────────────────────────────────────
Объявление

     procedure OpenFile(FName : String);

Функция

     Открывает файл для просмотра.

Описание

     Данная процедура пытается открыть файл FName для просмот-
ра. Все ошибки ввода/вывода, возникшие при открытии файла, пе-
редаются пользовательской процедуре обработки ошибок, если она
определена.  Все  ошибки  ввода/вывода OpenFile классифицирует
как "фатальные". Единственный возвращаемый OpenFile код ошибки
epFatal+ecFileIsEmpty, который говорит о том, что файл сущест-
вует, но совершенно пуст.

Пример

     B.OpenFile('OPDEFINE.INC');

     Загружает в Browser файл OPDEFINE.INC.

Смотрите также

     CloseFile

Process
─────────────────────────────────────────────────────────────
Объявление

     procedure Process; virtual;

Функция

     Обрабатывает команды просмотра.

Описание

     Метод Browser   Process   следует  основной  модели,
описанной под CommandWindow.Process, со следующими дополнения-
ми и исключениями:

     Он обрабатывает команды просмотра,  описанные  в  разделе
"Команды редактирования" в начале раздела.

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

Пример

     Смотрите пример в начале раздела.

Смотрите также

     CommandWindow.Process        SetStatusProc

SetBlockAttr
─────────────────────────────────────────────────────────────
Объявление

     procedure SetBlockAttr(Color,Mono : Byte);

Функция

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

Описание

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

Пример

     B.SetBlockAttr($4F,$70);

     Выделенный блок  будет  отображаться  белым на красном на
цветных дисплеях и реверсивно на монохромных.

SetDefaultExtention
─────────────────────────────────────────────────────────────
Объявление

     procedure SetDefaultExtention(DefExt : ExtStr);

Функция

     Определяет расширение, используемое по умолчанию при зап-
росе имени файла.

Описание

     Данный метод позволяет установить расширение, которое бу-
дет использоваться   по  умолчанию  для  имен  файлов.  ExtStr
(string[3]) определено в OPSTRING.

Пример

     B.SetDefaultExtention('PAS');

     Устанавливает, что  по  умолчанию  будет   использоваться
расширение .PAS.

     B.SetDefaultExtention('.PAS');

     Неверно! При указании расширения точка не нужна.

Смотрите также

     SetGetFileProc

SetEditProc
─────────────────────────────────────────────────────────────
Объявление

     procedure SetEditProc(EF : BrowseEditFunc);

Функция

     Устанавливает функцию ввода строки.

Описание

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

     Процедура должна иметь следующий вид:

     {$F+}
     function EditFunc(MsgCode:Word;Prompt:string;
                          ForceUp,TrimBlanks : Boolean;
                          MaxLen:Byte;var S:string) : Boolean;
     begin
     end;

     Она должна быть откомпилирована в модели FAR ( $F+ ) и не
должна вставляться внутрь другой процедуры.

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

Пример

     uses OpCrt,OpRoot,OpCmd,OpFrame,OpWindow,OpMemo,OpBrowser,
          OpEdit;
     var B: Browser;

     {$F+}
     function MyEditFunc(MsgCode:Word;Prompt:string;
                          ForceUp,TrimBlanks : Boolean;
                          MaxLen:Byte;var S:string) : Boolean;
     var LE:LineBrowser;
     begin
        FastFill(80,' ',1,1,TextAttr);
        LE.Init(DefaultColorSet);
           if ForceUp then
              LE.leEditOptionsOn(leForceUpper);
           if not TrimBlanks then
              LE.leEditOptionsOff(leTrimBlanks);
           LE.ReadString(Prompt,1,1,MaxLen,40,S);
           MyEditFunc := (LE.GetLastCommand <> ccQuit);
           LE.Done;
           FastFill(80,' ',1,1,TextAttr);
        end;
     {$F-}
     ...
     B.SetEditProc(MyEditFunc);
     Устанавливает функцию  редактирования,  которая   выводит
подсказку и вводит строку в верхней части экрана. Заметим, что
максимальная длина строки MaxLen может меняться в  зависимости
от подсказки и свободного места.

Смотрите также

     SetGetFileProc

SetGetFileProc
─────────────────────────────────────────────────────────────
Объявление

     procedure SetGetFileProc(GF : BrowseGetFileFunc);

Функция

     Устанавливает функцию ввода имени файла.

Описание

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

     Подпрограмма должна иметь следующий вид:

     function GetFile(MsgCode:Word;Prompt:string;
                          ForceUp,TrimBlanks,Writing,MustExist:
                          Boolean; MaxLen:Byte;DefExt:ExtStr;
                          var S:string):Boolean;
     begin
     end;

     Она должна  компилироваться  под  моделью  FAR {$F+} и не
должна вставляться внутрь другой процедуры.

     MsgCode - это код сообщения для используемого по  умолча-
нию Prompt.  S  -  это редактируемая строка,  длиной не больше
MaxLen байт. DefExt - это расширение имени файла, используемое
по  умолчанию  (ExtStr определен OPSTRING).  ForceUp говорит о
том,  что все символы должны отображаться в верхнем  регистре.
TrimBlanks говорит, что все начальные и концевые пробелы долж-
ны удаляться.  Если MustExist и Writing оба равны False,  то у
пользователя будет запрашиваться имя файла, который будет соз-
дан позднее при необходимости.  Если MustExist равен  True,  а
Writing равен False, то у пользователя будет запрошено имя су-
ществующего файла, который должен быть присоединен к текущему.
Если  Writing равен True,  а MustExist False,  то пользователь
должен ввести имя файла,  который,  если он существует,  будет
перезаписан.  Результат  функции будет равен True только в том
случае, если пользователь ввел имя файла, который удовлетворя-
ет указанным условиям.

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

Пример

     uses
        OpCrt, OpDos, OpRoot, OpString, OpCmd, OpFrame,
        OpWindow, OpBrowse, OpEdit;
     var
        B : Browser;
        {$F+}
        function MyGetFileFunc(MsgCode:Word;Prompt:string;
                          ForceUp,TrimBlanks,Writing,MustExist:
                          Boolean; MaxLen:Byte;DefExt:ExtStr;
                          var S:string):Boolean;
        var
           LE : LineBrowser;
           Cmd : Word;
        begin
           MyGetFileFunc := False;
           FastFill(80,' ',1,1,TextAttr);
           LE.Init(DefaultColorSet);
           if ForseUp then
              LE.leEditOptionsOn(leForceUpper);
           if not TrimBlanks then
              LE.leEditOptionsOff(leTrimBlanks);
           LE.ReadString(Prompt,1,1,MaxLen,40,S);
           Cmd := GetLastCommand;
           LE.Done;
           FastFill(80,' ',1,1,TextAttr);
           if Cmd = ccQuit then
              Exit;
           S := DefaultExtention(S,DefExt);
           if Writing then
              if ExistFile(S) then
                 { запросить у пользователя подтверждение,
                   что нужно перезаписать файл }
              else
                 MyGetFileFunc := True;
           else if ExistFile(S) or not MustExist then
              MyGetFileFunc := True;
                else
                   { Ошибка. Файл не существует }
        end;
        {$F-}
     ...
     B.SetGetFileProc(MyGetFileFunc);

     Это практически  полный  пример  BrowseGetFileFunc.  Были
опущены следующие детали: 1) вычисление ширины поля редактиро-
вания (40 символов),  2) необязательный  запрос  подтверждения
того, что  файл  должен быть перезаписан и 3) выдача сообщения
об ошибке, возникающей в случае, если файл не существует, в то
время когда он должен существовать.

Смотрите также

     SetEditProc

SetHighlightAttr
─────────────────────────────────────────────────────────────
Объявление

     procedure SetHighlightAttr(Color,Mono : Byte);

Функция

     Устанавливает атрибуты   для  подсвеченного  (найденного)
текста.

Описание

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

Пример

     B.SetHighlightAttr($4F,$70);

     Отображает найденный  текст белым по красному для цветных
мониторов и в инверсном режиме для монохромных.

SetMarkerAttr
─────────────────────────────────────────────────────────────
Объявление

     procedure SetMarkerAttr(Color,Mono : Byte);

Функция

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

Описание

     Этот метод позволяет вам указать атрибуты, с которыми бу-
дут выводиться текстовые маркеры.  Если,  например, установить
атрибут  $70 для монохромного монитора,  то текстовый маркер 1
будет отображаться как '1' в инверсном режиме.

Пример

     B.SetMarkerAttr($2F,$70);

     Отображает текстовый маркер белым по зеленому на  цветных
мониторах и в инверсном режиме на монохромных.

SetPrinter
─────────────────────────────────────────────────────────────
Объявление

     procedure SetPrinter(LptNum : Byte);

Функция

     Определяет номер порта принтера (1-3).

Описание

     Данный метод позволяет определить принтер,  который будет
использован при  выполнении команды ccBlkPrint.  LptNum должен
содержать число  в  диапазоне  от  1  до  3,   соответствующее
LPT1-LPT3. Если будет указано любое другое значение,  то будет
использован LPT1.

Пример

     B.SetPrinter(2);

     Направляет вывод на LPT2.

SetStatusProc
─────────────────────────────────────────────────────────────
Объявление

     procedure SetStatusProc(SP : BrowseStatusProc);

Функция

     Устанавливает процедуру отображения состояния.

Описание

     Данный метод позволяет вам указать собственную процедуру,
которая будет     вызываться     перед     каждым      вызовом
BrowseCommands.GetCommand, который вызывается для ввода следу-
ющей команды,  и во многих других случаях,  во время продолжи-
тельных команд, например, при запуске команды поиска. Процеду-
ра должна иметь следующую форму:

     {$F+}
     procedure MyStatusProc(BP : BrowserPtr);
     begin
     end;

     Она должна  компилироваться  под  моделью  FAR {$F+} и не
должна вставляться внутрь другой процедуры. Browser производит
вызов данной процедуры, посылая в качестве параметра @Self.

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

Пример

     uses
        Dos, OpCrt, OpDos, OpRoot, OpString, OpCmd, OpFrame,
        OpWindow, OpBrowse;
     var
        B : Browser;
        {$F+}
        function MyStatusProc(BP : BrowsePtr);
        const
           StatusLine : string[37] = ' Line: xxxxx Column: xxx
                Filename: ';
        var
           S : string[5];
        begin
           with BP^ do begin
              S := Pad(Long2Str(brCurLine),5);  { номер строки }
              Move(S[1],StatusLine[8],5);
              S := Pad(Long2Str(brColOfs+1),3); { колонка в левом }
                                                { углу }
              Move(S[1],StatusLine[23],3);
              FastWrite(Pad(StatusLine+CurrentFileName,80),1,1,TextAttr);
           end;
        end;
        {$F-}
     ...
     B.SetStatusProc(MyStatusProc);

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

     B.SetStatusProc(BrowseStatus);

     Активизирует в  качестве  процедуры  отображения  статуса
встроенную процедуру   OPBROWSE,  которая  отображает  текущее
состояние в строке StatusRow (по умолчанию 1), используя атри-
буты по умолчанию (белый на черном для обоих типов дисплея).

Смотрите также

     BrowseStatus

Store
─────────────────────────────────────────────────────────────
Объявление

     procedure Store(var S : IdStream);

Функция

     Сохраняет в потоке Browser.

Описание

     S - это правильно инициализированный  объект  типа  поток
(обычно поток, связанный с файлом, открытым для записи). Заме-
тим, что S может быть любым объектом,  производным от IdStream
(DosIdStream, BufIdStream   и   MemIdStream),   однако  обычно
MemIdStream не используется.

     Store выводит  образ  Browser в поток S.  Если установлен
флаг brStreamReload,  то в потоке будет также сохранено и  имя
текущего  файла.  В этом случае,  при вызове Load будет вызван
OpenFile для того, чтобы загрузить этот файл.

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

     BrowserStream - это потоковая процедура  регистрации  для
Browser.

Пример

     uses
        Dos, OpCrt,  OpRoot,  OpCmd, OpDos, OpFrame, OpWindow,
        OpBrowse;
     var
        B : Browser;
        S : BufIdStream;
        Status : Word;
     begin
        if not B.InitCustom(2,3,78,24,
                           GefaultColorSet,
                           DefWindowOptions or wBordered,
                           MaxAvail-8192)
        then begin
           WriteLn('Ошибка Init Browser. Status = ',Status);
           Halt;
        end;
        B.OpenFile('BROWSE.PAS');
        B.brOptionsOn(brStreamReload);
        S.Init('BROWSE.STM',SCreate,1024);
        S.RegisterHier(BrowserStream);
        S.Put(B);
        Status := S.GetStatus;
        if Status<>0 then begin
           WriteLn('Ошибка Store',Status);
           Halt;
        end;
       S.Done;
       B.Done;
     end.

     В данном примере мы создали экземпляр B,  загрузили файл
и сохранили B в потоке,  используя потоковый метод Put, кото-
рый неявно производит вызов  Store.  В  Load  приведен  пример
программы, производящей перезагрузку Browser.

Смотрите также

     CommandWindow.Store          Load

ToggleHighBitStripping
─────────────────────────────────────────────────────────────
Объявление

     procedure ToggleHighBitStripping;

Функция

     Включает или выключает подавление старшего бита.

Описание

     Данный метод позволяет вам включить или выключить  подав-
ление старшего бита.  Заметим,  что он не должен вызываться до
отображения на экране окна Browser. Если окно еще не отображе-
но на экране, то вместо данного метода необходимо использовать
'brOptionsOn(brStripHigh)' и 'brOptionsOff(brStripHigh)'.

Пример

     if B.brOptionsAreOn(brStripHigh) then
        B.ToggleHighBitStripping;

     Выключает подавление старшего бита.

ToggleModes
─────────────────────────────────────────────────────────────
Объявление

     procedure ToggleModes;

Функция

     Переключает между ASCII и 16-ричным режимами.

Описание

     Этот метод  позволяет  вам  переключаться  между режимами
ASCII и 16-ричным.  Если окно в настоящий момент не  отобража-
ется, то       нужно       использовать       вместо      него
'brOptionsOn(brHexMode)' и 'brOptionsOff(brHexMode)'.

Пример

     if B.brOptionsAreOn(brHexMode) then begin
        B.ToggleModes;

     Переключает в ASCII режим.

Transfer
─────────────────────────────────────────────────────────────
Объявление

     procedure Transfer(StartPos, StopPos : LongInt;
                        var Buffer; BufSize : Word);

Функция

     Копирует из Browser символы с позиции StartPos до StopPos
в Buffer.

Описание

     Данная процедура   позволяет   вам   передать  данные  из
просматриваемого файла в буфер.  Ее можно использовать в прик-
ладных программах,   использующих  и  Browser,  и  TextEditor.
Transfer можно  использовать  для  копирования  выделенного  в
Browser блока в TextEditor.

     StartPos и StopPos определяют диапазон в файле, в котором
происходит передача данных.  Buffer - это буфер, в который бу-
дут передаваться данные. BufSize определяет размер буфера.

Пример

     { ... проверка маркеров блока, размер блока и т.д. ... }
     B.Transfer(B.brBlkBegin.FilePos,B.brBlkEnd.FilePos,Buffer,
               BufSize);
     { ... проверка на ошибку ... }

     Передает данные из выделенного блока в буфер  размером  в
BufSize.

                   2. Процедуры и функции.

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

                          Константы.

     StatusRow   : Byte = 1;
     StatusColor : Byte = $F;
     StatusMono  : Byte = $F;

     Данные константы   определяют   поведение   BrowseStatus.
StatusRow определяет строку, в которой будет выводиться строка
статуса. StatusColor и StatusMono определяют атрибуты, с кото-
рыми будет отображаться данная строка на цветных и монохромных
мониторах соответственно.

BrowseStatus
─────────────────────────────────────────────────────────────
Объявление

     prosedure BrowseStatus(BP : BrowsePtr);

Функция

     Выводит строку состояния.

Описание

     Данная процедура  представляет  собой  готовую  процедуру
отображения статуса  для  использования   с   объектами   типа
Browser. Данная  строка  использует  80  колонок и выводится в
строке, определяемой глобальной константой StatusRow (по умол-
чанию  =  1),  используя  в  зависимости  от  типа дисплея или
StatusColor или StatusMono в качестве атрибутов.  Строка  ста-
туса имеет следующую форму:

     FILENAME.EXT        Working...      Line nnn    Col nnn

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

Пример

     B.SetStatusProc(BrowseStatus);

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

     StatusRow := ScreenHeight;
     StatusColor := $0E;
     StatusMono := $0F;
     B.SetStatusProc(BrowseStatus);

     Выводит строку состояния в нижней строке экрана желтым по
черному на цветном и белым по черному на монохромном мониторе.

Смотрите также

     Browser.SetStatusProc



                     E. Примеры программ.

     В данном  разделе коротко описаны три программы,  которые
демонстрируют использование юнит,  описанных в  данной  главе:
MEMO (OPMEMO), EDITOR (OPEDITOR) и BROWSE (OPBROWSE).

                           1. MEMO.

     MEMO.PAS -  это  простой текстовый редактор,  созданный с
использованием OPMEMO. Для его использования введите

     MEMO filename

     после подсказки DOS,  где filename - это имя файла, кото-
рый вы хотите редактировать.  Если вы не укажете имя файла, то
программа запросит его у вас.

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

     <CtrlK><S>, <F2>
     Сохранить файл и продолжить редактирование.

     <CtrlKX>, <CtrlF2>
     Выход с сохранением файла.

     <CtrlK><Q>, <AltF2>
     Сбросить файл.  Если файл был изменен, у вас будет запро-
шено подтверждение, что вы хотите выйти без сохранения измене-
ний. В реализации данная команда аналогична ccQuit (<Esc>).

     Верхняя строка экрана используется для вывода  сообщений,
а вторая для строки состояния. Оставшаяся часть экрана исполь-
зуется для окна редактирования. Заметим, что MEMO поддерживает
43 - строчный режим EGA и 50 - строчный режим VGA.

     Данная программа не предназначена для использования в ка-
честве реального текстового редактора,  а в основном  для  де-
монстрации  использования  объекта  MemoFile  (производного от
MEMO).

                          2. EDITOR.

     OPEDITOR - это более мощный текстовый  редактор,  который
имеет  практически  те  же  возможности,  что и редактор Turbo
Pascal,  и некоторые дополнительные,  типа переноса слов.  Для
использования его наберите в командной строке DOS:

     EDITOR filename

     где filename это имя файла,  который вы хотите редактиро-
вать. Если вы не укажете имя файла,  то программа запросит его
у вас.

     В дополнение к командам редактирования, описанным в главе
посвященной OPEDITOR, в данной программе реализованы следующие
команды:

     <CtrlF2>
     Выход с сохранением файла.

     <AltF2>
     Сброс файла. Если файл был изменен, у вас будет запрошено
подтверждение того, что вы хотите выйти без сохранения измене-
ний.

     Верхняя строка экрана используется для вывода  сообщений,
а вторая для строки состояния. Оставшаяся часть экрана исполь-
зуется для  окна  редактирования.  Заметим,  что  как  и MEMO,
OPEDITOR поддерживает 43-хстрочный режим EGA и 50-строчный ре-
жим VGA.

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

                          3. BROWSE.

     BROWSE это служебная программа для просмотра файла,  соз-
данная с использованием юниты OPBROWSE.  Для ее  использования
введите в командной строке DOS следующую строку:

     BROWSE filename.ext [filename.ext] [...] [filename.ext]

     где filename.ext - это имя или маска имени файла,  содер-
жащая символы маскирования.  Ниже приведены примеры допустимых
команд:

     BROWSE browse.pas
     BROWSE browse.pas opbrowse.pas
     BROWSE *.pas
     BROWSE *.pas *.inc
     BROWSE *.pas *.inc *.asm

     Когда явно  указаны имена нескольких файлов или несколько
файлов подходят под данную маску,  вы можете перейти к другому
файлу, нажав <Esc> или нажав на правую кнопку мыши. Если, нап-
ример вы набрали последнюю строку,  то в  начале  будут  отоб-
ра-жаться файлы с расширением .pas, затем с расширением .inc и
затем с расширением .asm.

     Заметим, что использование новых файловых команд  Browser
- <F3>  или  <CtrlK><N> - не влияет на поведение BROWSE с этой
точки зрения.  Например,  вы  указали   в   командной   строке
BROWSE.PAS и  OPBROWSE.PAS  и во время просмотра BROWSE.PAS вы
использовали новую файловую команду для загрузки OPDEFINE.INC.
Если   вы  после  этого  нажмете  <Esc>,  то  BROWSE  загрузит
OPBROWSE.PAS,  если вы не воспользуетесь еще раз новой  коман-
дой.

     В дополнение к командам,  описанным в главе,  посвященной
Browser, BROWSE реализует следующие пользовательские команды:

     <F10>, <AltX>
     Выход из  программы.  Данная команда завершает выполнение
программы, даже если остались не просмотренными некоторые фай-
лы.

     <AltH>
     Переключает между ASCII и 16-ричным режимом.

     Верхняя строка экрана используется для вывода  сообщений,
а вторая для строки состояния. Оставшаяся часть экрана исполь-
зуется для окна просмотра. Заметим, что как и MEMO и OPEDITOR,
BROWSE поддерживает  43-строчный режим EGA и 50-строчный режим
VGA.

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