1 группа включает все события от мыши.Эти события воздействуют в
зависимости от координат курсора мыши.Модальный объект, воспринявший
такое событие, передает его своим подэлементам в Z-порядке, отыскивая
подэлемент, в который попадает курсор мыши.Этот подэлемент, если он
существует и является группой, в свою очередь, также передает это со-
бытие своим подэлементам в Z-порядке и т.д., пока этот поиск не оста-
новится из-за отсутствия соответствующего подходящего подэлемента.Если
соответствующий объект найден, то он будет обрабатывать событие, в
противном случае событие обрабатываться не будет.
2 группа предназначена для сфокусированного объекта и включает
события от клавиш клавиатуры и команды.Эти события передаются по це-
почке выделенных объектов непосредственно сфокусированному объекту.Ес-
ли сфокусированный объект "не знает", как обработать соответствующее
событие, то оно передается назад по цепочке выделенных объектов к мо-
дальному объекту.
3 группа включает события-сообщения (стандартные и создаваемые
пользователем).Эти события передаются всем подэлементам модального
объекта в Z-порядке.Те, в свою очередь, передают их своим подэлементам
в Z-порядке и т.д. до тех пор, пока это событие не будет обработано
каким-либо объектом или же не будут просмотрены все объекты.
При обработке события сначала выполняются соответствующие дейс-
твия у объекта, которому предназначено событие, после чего событие
"очищается" стандартным методом ClearEvent :
procedure tView.ClearEvent(var Event: tEvent);
где Event - текущее "очищаемое" событие.Если событие не "очистить", то
оно будет передаваться и дальше в соответствии с механизмом его обра-
ботки и может быть обработано еще каким-либо объектом.
Команды
События от объектов (команды или сообщения) имеют в качестве од-
ного из параметров параметр Command типа Word, задающий код команды,
которую необходимо выполнить при обработке этого события.
Все используемые в Turbo Vision команды делятся на 4 группы :
- команды, зарезервированные за системой и которые можно маскиро-
вать методом DisableCommands объекта tView и демаскировать методом
EnablеCommands объекта tView, - коды от 0 до 99;
- команды, которые может вводить программист и которые можно мас-
кировать и демаскировать аналогично первой группе, - кода от 100 до
225;
- команды, зарезервированные за системой, но которые нельзя мас-
кировать и демаскировать, как команды первой группы, - коды от 256 до
999;
- команды, которые может вводить программист, но которые нельзя
маскировать и демаскировать, - коды от 1000 до 65535.
Программист может использовать зарезервированные за Turbo Vision
команды, не переопределяя их.Более того, команды этой категории имеют
стандартные названия, и средства пакета стандартным образом реагируют
на них.Так, например, команда cmClose вызывает закрытие активного ок-
на, а cmMenu - активизирует меню и т.д.Все стандартные команды начина-
ются с префикса cm.
ПОРЯДОК РАБОТЫ С ОТОБРАЖАЕМЫМИ ОБЪЕКТАМИ
Работа с отображаемыми объектами осуществляется в несколько эта-
пов, выполняемых в определенной последовательности.На этих этапах
отображаемый объект описывается, создается, помещается в соответствую-
щую группу, задаются его параметры, производится работа с объектом,
получаются введенные параметры, наконец, объект удаляется.
Описание отображаемого объекта
Если отображаемый объект не является стандартным, его следует
описать - ввести необходимые параметры и методы на основе правил объ-
ектного программирования.Методы могут быть 4-х видов : конструкторы,
деструкторы, переопределенные методы предка и специфические методы для
данного объекта.
Конструктор позволяет инициализировать отображаемый объект : за-
дать исходные параметры, создать его подэлементы и т.д.Кроме того, он
создает таблицу виртуальных методов, без которой нельзя будет обра-
титься к этим методам.
Деструктор выполняет действия, обратные действиям конструктора, и
используется при удалении отображаемого объекта, имеющего виртуальные
методы.Сам деструктор также является виртуальным.
Переопределенный метод предка позволяет, используя возможности
исходного метода, модифицировать их, добавить в них некоторые дополни-
тельные свойства, специфические для данного объекта.Переопределенный
метод должен быть виртуальным.
Специфический для данного объекта метод - это метод, который не
имеет аналогов у предка данного объекта.
Создание отображаемого объекта
Если отображаемый объект не размещен постоянно в сегменте данных
(не задана соответствующая переменная конкретного типа-объекта), необ-
ходимо создать соответствующий объект.Модальные объекты, как правило,
не размещаются постоянно в сегменте данных и создаются только на время
работы с ними; немодальные объекты могут и одного, и другого вида, но
чаще все-таки также не размещаются постоянно в сегменте данных.Созда-
ется объект с помощью стандартной подпрограммы New, использующей конс-
труктор Init.
Помещение отображаемого объекта в группу
После создания отображаемого объекта его следует поместить в со-
ответствующую группу : если он является элементом окна, то в соответс-
твующее окно, если же он сам является окном, то в рабочую область
DeskTop.
У каждого объекта-группы имеются методы Insert и InsertBefore, с
помощью которых можно поместить немодальный отображаемый объект в
группу.
Для размещения немодального окна в рабочей области вместо метода
Insert лучше воспользоваться методом InsertWindow :
function tProgram.InsertWindow(P: pWindow): pWindow;
где P - указатель на размещаемое окно; результат - указатель на разме-
щенное окно, и nil - если не размещено.
Метод является функцией, которая перед размещением окна проверяет
допустимость такой операции (имеется ли необходимая область памяти и
правильно ли сконструированы окно и его компоненты).
Задание параметров воображаемому объекту
В Turbo Vision принят следующий стандартный способ передачи пара-
метров.Для объекта-группы или его потомка формируется переменная ти-
па-записи, отдельные поля которой представляют собой параметры для по-
дэлементов группы.Поля должны идти в той же последовательности, в ка-
кой подэлементы включались в группу.Для каждого подэлемента параметры
создаются по-своему.Для стандартных элементов параметры должны быть
следующими :
- строка ввода - строка того же размера;
- триггерный список - число типа Word, в котором каждый бит опре-
деляет состояние соответствующего элемента списка;
- селективный список - число типа Word, определяющее порядковый
номер выделенного элемента списка;
- триггерный список с несколькими состояниями - информация разме-
ром в 4 байта, определяющая состояние каждого элемента списка
(под каждый элемент может отводиться 1,2,4 и 8 бит информации;
- список коллекции строк - запись размером в 6 байт, первое поле
которой - указатель на коллекцию просматриваемых строк, а вто-
рое - число типа Word, определяющее порядковый номер выделен-
ного элемента списка;
- параметрический текст - по 4 байта на каждый параметр.
Для нестандартных элементов пользователь сам определяет вид и
размер параметра.
Задать параметры немодальному отображаемому объекту лучше всего с
помощью метода SetData :
procedure <отображаемый объект>.SetData (var Rec); virtual;
где Rec - передаваемая запись с данными.
Работа с модальными объектами
Для работы с модальными отображаемыми объектами используются ме-
тоды, выполняющие комплексные действия.
Универсальным является метод ExecView объекта tGroup :
function tGroup&ExecView(P: pView): Word;
где P - объект, с которым происходит работа; результат - код команды,
вызвавшей прекращение работы с объектом P.
Этот метод помещает воображаемый объект в группу, делает его мо-
дальным, обеспечивает обработку поступающих событий, и, если очередное
событие является командой или сообщением, означающими конец работы с
отображаемым модальным объектом, удаляет отображаемый объект из груп-
пы.Предварительно перед удалением объекта следует снять с него модаль-
ность, что осуществляется с помощью процедуры EndModal объекта tView :
procedure tGruop.EndModal(Command: Word); virtual;
где Command - код команды, при которой снимается модальность.
В качестве результата функция ExecView возвращает код команды,
вызвавшей прекращение работы с модальным отображаемым объектом.После
удаления из группы сам отображаемый объект из динамической памяти не
удаляется.
Если модальный отображаемый объект является диалоговым окном и
его следует поместить в рабочую область, вместо метода ExecView целе-
сообразно использовать метод ExecuteDialog :
function tProgram.ExecuteDialog(P: pDialog;Data: Pointer): Word;
где P - диалоговое окно, с которым происходит работа;
Data - указатель на запись с передаваемыми данными;
результат - код команды, вызвавшей прекращение работы и диалоговым ок-
ном P.
СОЗДАНИЕ МЕНЮ
Turbo Vision позволяет создать меню программы,предназначенное для
выбора дальнейшего пути решения задачи.
После написания объекта-приложения - основного объекта программы,
целесообразно продолжить создание программы именно с описания меню,
так как выбор той или иной структуры меню во многом будет определять и
структуру программы.В Turbo Vision можно использовать либо обычное
разворачивающееся меню, либо так называемое локальное меню.
Создание разворачивающегося меню
Разворачивающееся меню (в дальнейшем - просто меню) может иметь
довольно сложную структуру и любое число уровней вложенности, но сос-
тавляется из однотипных элементов, правда имеющих три варианта : собс-
твенно элемент меню (фактически определяет команду, которую следует
выполнить при выборе этого элемента), подменю, при выборе которого на
экране раскрывается соответствующий пункт исходного меню, и раздели-
тельная линия, которая имеет чисто декоративное назначение и позволяет
отделять в подменю те или иные группы элементов друг от друга.
Элемент меню имеет структуру типа-запись (стандартный тип
tMenuItem) :
tMenuItem = record
Next: pMenuItem;
Name: pString;
Command: Word;
Disabled: Boolean;
KeyCode: Word;
HelpCtx: Word;
case Integer of
0: (Param: pString);
1: (SubMemu: pMenu);
end;
end;
где Next - указатель на следующий элемент этого же уровня вложенности,
если следующего элемента нет, указатель равен nil;
Name - указатель на строку, содержащую выводимый на экран текст;
этот параметр равен nil, если элемент представляет собой разделитель-
ную линию;
Commаnd - код команды, которую следует выполнить при выборе данно-
го элемента меню; эта величина равна нулю, если данный элемент - под-
меню;
Disabled - признак разрешения или запрета выбора данного элемента
меню;
KeyCode - код клавиши или их совокупности быстрого управления, с
помощью которых можно выполнить команду данного элемента меню, не вы-
зывая это элемент, или 0, если для данного элемента такой клавиши не
предусмотрено;
HelpCtx - параметр контекстной помощи, аналогичный параметру объ-
екта tView, но справочная система выдает информацию об элементе меню;
Param - указатель на строку с дополнительной информацией, которая
выводится в правой части строки подменю, соответствующей данному эле-
менту (обычно это название клавиши быстрого управления);
SubMemu - указатель на структуру меню следующего уровня, если дан-
ный элемент представляет собой подменю.
ню.
Горизонтальные размеры выводимой на экран строки для любого эле-
мента меню ограничены 31 символом.В связи с этим в Turbo Vision имеет-
ся стандартный тип строк tMenuStr :
tMenuStr = string[31];
который и используется для задания символьной информации элементам ме-
ню.
Для каждого элемента меню можно в его названии выделить одну ла-
тинскую букву или цифру для быстрого выбора элемента путем нажатия
этой клавиши на клавиатуре (для основного меню - в сочетании с клави-
шей Alt).Такая буква выделяется в тексте символами ~~,например, ~N~ew.
В данном примере соответствующий элемент можно активизировать на-
жатием клавиши N (или Alt+N, если это элемент основного меню).На экра-
не такая буква выделяется особым цветом.
Для создания элемента меню, определяющего выполняемую команду,
используется подпрограмма NewItem :
function NewItem(Name, Param: tMenuStr; KeyCode: Word; Command:
Word; AHelpCtx: Word; Next: pMenuItem): pMenuItem;
где Name - текстовая информация для данного элемента, она не должна
быть пустой строкой;
Param - дополнительная текстовая информация для элемента;
KeyCode - код клавиши быстрого управления;
Command - код выполняемой команды, не должен равняться 0;
AHelpCtx - параметр контекстной помощи;
Next - указатель на следующий элемент меню данного уровня;
результат - указатель на созданный элемент меню.
Для создания элемента меню, представляющего собой подменю, ис-
пользуется подпрограмма NewSubMenu :
function NewSubMenu(Name: tMenuStr; AHelpCtx: Word; SubMenu:
pMenu; Next: pMenuItem;
где Name - текстовая информация для данного элемента, не должна быть
пустой строкой;
AHelpCtx - параметр контекстной помощи;
SubMenu - указатель на структуру подменю;
Next - указатель на следующий элемент подменю данного уровня;
результат - указатель на созданный элемент меню.
Если элемент меню является разделительной строкой, то использует-
ся подпрограмма NewLine :
function NewLine(Next: pMenuItem): pMenuItem;
где Next - указатель на следующий элемент меню данного уровня;
результат - указатель на созданный элемент меню.
Функционально разворачивающееся меню состоит из нескольких частей
- главного меню, постоянно отображаемого на экране, и ряда подменю,
появляющихся на экране по мере необходимости.Главное меню представляет
собой объект типа tMenuBar.Создается оно обычно с помощью стандартной
подпрограммы New, а инициализируется конструктором Init :
сonstructor tMenuBar.Init(var Bounds: tRect; AMenu: pMenu);
где Bounds - область на экране для главного меню;
AMenu - указатель на главное меню.
Создавая меню программы, следует позаботиться лишь о размерах ос-
новного меню, размеры же выпадающих подменю определяются автоматически
при их отображении на экране.Стандартный объект tProgram ( а, следова-
тельно, и объект tApplication) имеет метод InitMenuBar :
procedure tProgram.InitMenuBar; virtual;
с помощью которого можно создать меню и который следует переопределить
для конкретной программы.Этот метод помещает указатель на созданное ме-
ню в стандартную типизированную константу MenuBar пакета Turbo Vision.
Создание локального меню
При работе с программой часто приходится многократно повторять
одни и те же действия, которые разнесены по различным частям меню (а
некоторых в меню вообще не может быть).Количество их обычно небольшое,
а поиск по всему меню неудобен.Целесообразно такие действия собрать в
одно дополнительное меню, доступ к которому осуществляется по тому или
иному событию, например, команде, нажатию клавиши клавиатуры или мыши.
Для создания такого меню можно использовать стандартный объект
пакета Turbo Vision - tMenuPopup.Для этого в метод HandleEvent основ-
ного объекта программы следует включить обработку выбранного для ло-
кального меню события и написать подпрограмму вызова локального ме-
ню.Так как локальное меню должно быть довольно простым, оператор его
конструирования будет также проще, чем у разворачивающегося меню, но
тем не менее состоять из обращений к тем же методам.
Создавать локальное меню целесообразно на завершающих этапах соз-
дания программы, когда становится ясно, какие действия наиболее часто
придется выполнять пользователю программы.
Несмотря на свою сложность, меню в силу своей специфики группой
не является, и у него имеется свой своеобразный механизм обработки со-
бытий.Так, например, если меню получит событие от мыши, когда курсор
не находится в поле отображения меню, оно закрывается, как будто пос-
тупила команда завершения работы с объектом без фиксации результата.В
случае же модального объекта группы (например, диалогового окна) такое
событие игнорируется.
СОЗДАНИЕ ОКОН И ДИАЛОГОВЫХ ОКОН
После того, как будет выбрано меню программы, целесообразно прис-
тупить к формированию отдельных частей программы, обрабатывающих соот-
ветствующие команды меню и строки состояния.Часто эти команды требуют
использования различных окон для передачи информации.Окна могут потре-
боваться и при создании подпрограмм, обрабатывающих те или иные коман-
ды.
Основным средством взаимодействия пользователя с программой в
Turbo Vision являются окна (тип tWindow) и диалоговые окна (тип
tDialog).У окон и диалоговых окон много общего, т.к. диалоговое окно
является непосредственным потомком окна, однако есть и принципиальные
различия, главным образом, в их предназначении, наборе стандартных
элементов, цветовой палитре.Можно сказать, что основное назначение
окон - просмотр той или иной информации, а диалоговых окон - ввод в
программу данных.Диалоговые окна обладают рядом дополнительных возмож-
ностей и более логически завершены, поэтому они чаще используются в
программах.
Окна (tWindow) в Turbo Vision
Окном в TurboVision называется отображаемый объект-группа, имею-
щий специальную рамку и который может иметь средства прокрутки (скро-
ллинга) не умещающейся в окне информации.В него можно поместить инфор-
мацию.Как правило, в программе используется не окно типа tWindow, а
его потомок с переопределенными методами.
В дополнение к параметрам объекта tGroup окно обладает рядом до-
полнительных параметров, отметим два : флаги окна Flags и используемая
палитра Pallete.Назначение флагов параметра Flags, и константы, соот-
ветствующие единице в соответствующем разряде параметра Flags следую-
щие :
0-й бит (wfMove) - возможность перемещения окна по полю его вла-
дельца
1-й бит (wfGrow) - возможность изменения размеров окна.
2-й бит (wfClose) - наличие пиктограммы закрытия окна.
3-й бит (wfZoom) - наличие пиктограммы распахивания окна.
Параметр Pallete определяет тип используемой палитры окна и может
принимать одно из трех следующих значений :
wpBlueWindow = 0 - синяя палитра окна;
wpCyanWindow = 1 - голубая палитра окна;
wpGrayWindow = 2 - серая палитра окна.
Как правило, синяя палитра - для окон, серая - для диалоговых
окон, а голубая - для вспомогательных окон.
Инициализируется окно параметром Init :
constructor tWindow.Init(var Bounds: tRect;
ATitle: tTitleStr; ANumber: Integer);
где Bounds - размеры окна;
ATitle - имя окна размером до 80 символов;
ANumber - номер окна.
После инициализации устанавливаются значения параметров.
Характерной особенностью окна и его потомков является наличие
рамки - специального отображаемого объекта, помещаемого в окно.Таким
образом, окно всегда имеет хотя бы один подэлемент.Рамка окна помимо
декоративного значения несет на себе еще дополнительную информацию о
окне.
Вид рамки окна меняется в зависимости от его состояния.Активное
окно обрамлено двойной рамкой.
В левой части верхней линии рамки располагается пиктограмма зак-
рытия окна.При подведении курсора мыши к этой пиктограмме и нажатии
левой клавиши окно закрывается.
В средней части верхней линии рамки располагается имя окна, зада-
ваемое при его инициализации.
В правой части верхней линии рамки находится пиктограмма распахи-
вания окна "стрелка вверх" до полного размера группы, в которую вклю-
чено окно,Распахивание также осуществляется с помощью мыши.После рас-
пахивания окна пиктограмма изменит свой вид - "двустороняя стрел-
ка".Чтобы восстановить исходные размеры окна, следует повторно подвес-
ти окно, а затем снова его сжать можно и другим способом.Для этого
следует поместить курсор мыши на верхнюю линию рамки окна и дважды на-
жать клавишу.
Правый нижний угол рамки может быть таким же, как и все другие, а
может быть изображен одинарной линией даже в случае активного окна.В
этом случае с помощью мыши можно изменять размеры окна.Для этого кур-
сор мыши поместить на этот угол, нажать на клавишу и, не отпуская ее,
переместить мышь в нужном направлении, а при достижении окном требуе-
мых размеров, отпустить.Минимальные размеры окна - 16 позиций по гори-
зонтали и 6 строк по вертикали.Эти ограничения можно изменить с по-
мощью метода SizeLimits :
procedure'tView.SizeLimits(var Min, Max: tPoint); virtual;
Верхняя линия позволяет в ряде случаев с помощью мыши перемещать
окно по полю его владельца.
Наличие или отсутствие у окна этих возможностей зависит от уста-
новленных флагов параметра Flags.
При работе с окном его следует сначала создать и инициализиро-
вать.При этом создать необходимые компоненты (кроме рамки, которая
создается автоматически) и поместить их в окно.
Далее окно следует поместить в рабочую область.Как правило, окно
используется в немодальном режиме, тогда его помещают при помощи мето-
да InsertWindow, а если окно модальное - при помощи метода ExecView.
Как правило, для окна следует переопределить метод обработки со-
бытий HandlEvent, где необходимо предусмотреть обработку предназначен-
ных для окна событий.
Перед завершением работы следует снять с окна модальность с по-
мощью метода EndModal.
Если окно содержит выделенный элемент, а нужно сделать выделенным
другой, то можно воспользоваться либо мышью, подведя курсор к этому
элементу и нажав клавишу, либо с помощью клавиши клавиатуры Tab
(или Shift+Tab), при этом нажатие Tab выделит следующий в Z-порядке
элемент, а Shift+Tab - предыдущий.
Элементы окон в Turbo Vision
В качестве стандартных элементов окон Turbo Vision можно исполь-
зовать поля скроллинга (тип Scroller), предназначенные для отображения
не умещающейся на экране информации и ее просмотра, текстовые элементы
буферированной информации (тип tTewtDevice), текстовые элементы для
пассивных терминалов (тип tTerminal) наподобие текстовых файлов и ли-
нейки скроллинга.В окне можно помещать также потомки перечисленных вы-
ше стандартных элементов.
Поле скроллинга (tScroller)
Поле скроллинга предназначено для размещения в нем текстовой ин-
формации, которую необходимо вывести в окно, и которая возможно не
уменьшается целиком в поле окна.
При инициализации поля скроллинга следует задать его размеры, ли-
нейки горизонтального и вертикального скроллинга :
constructor tScroller.Init(var Bounds: tRect;
AHScrollBar, AVScrollBar: pScrollBar);
где Bounds - размеры поля;
AHScrollBar, AVScrollBar - указатели на вертикальную и горизон-
тальную линейку скроллинга.
После инициализации устанавливаются значения параметров.Кроме
этого, при инициализации потомка tScroller могут быть заданы параметры
поля скроллинга, в частности максимальный горизонтальный и вертикаль-
ный размер текстовой информации (размер строк и число строк), размеща-
емой в поле скроллинга.
Следует также переопределить метод Draw объекта tScroller для
того, чтобы наполнить поле скроллинга соответствующей информацией.Для
этого необходимо в начале определить, какая часть информации должна
быть отображена (исходя из текущего состояния линеек), затем сформиро-
вать строки, которые необходимо вывести на экран и, наконец, поместить
сформированные строки в поле скроллинга, с атрибутами цвета.
Текстовый элемент буферированной информации
Текстовый элемент буферированной информации (тип tTextDevice) яв-
ляется потомком поля скроллинга и отличается от своего предка наличием
двух абстрактных методов, которые читают из некоторого текстового бу-
фера и записывают в текстовый буфер отображаемую информацию.
Текстовый элемент для пассивного терминала
Текстовый элемент для пассивного терминала (тип tTerminal)
является наследником объекта tTextDevice и предназначен для отображе-
ния в поле скроллинга информации от пассивного терминала, чаще всего
из текстового файла этого терминала.Под пассивным терминалом здесь по-
нимается терминал, хранящий информацию, но не имеющий собственных
средств редактирования информации и управления экраном.
Инициализируется текстовый элемент для пассивного терминала конс-
труктором Init :
constructor tTerminal.Init(var Bounds: tRect;
AHScrollBar, AVScrollBar: pScrollBar; ABufSize: Word);
где Bounds - размеры поля;
AHScrollBar, AVScrollBar - указатели на вертикальную и горизон-
тальную линейку скроллинга;
ABufSize - размер буфера терминала в байтах.
Во время инициализации создается элемент с указанными параметра-
ми, а также буфер для передачи информации размером ABufSize.
Линейка скроллинга (tScrollBar)
Линейка скроллинга предназначена для фиксации места нахождения
отображаемой на экране в данный момент порции информации во всем объ-
еме отображаемой информации.Линейка представляет собой либо горизон-
тальную полосу, либо вертикальную.Полоса оканчивается двумя стрелками,
а в средней части расположен ползунок, указывающий относительное рас-
положение отображаемой порции информации.
Используя этот ползунок, можно быстро переместиться в любое место
отображаемой информации.Для этого необходимо подвести к нему курсор
мыши, нажать клавишу мыши и, не отпуская ее, отбуксировать ползунок в
нужное место линейки скроллинга.Если курсор мыши поместить не на пол-
зунок, а в другое место линейки и нажать клавишу мыши, будет отображе-
на следующая страница информации, находящаяся в соответствующем нап-
равлении.Если курсор мыши поместить на завершающую стрелку и нажать
клавишу мыши, будет осуществлено перемещение на один шаг в соответс-
твующую сторону.
5 параметров объекта tScrollBar :
Min, Max - определяют миним. и максим. значение номера текущего
элемента информации.
ArStep - величина шага перемещения по информации в случае нажатия
клавиш Left, Right, Up, Down или при нажатии клавиши мыши, если ее
курсор находится на завершающей стрелке.
PgStep - размер страницы, на которую происходит перемещение.
Value - текущий элемент информации.Инициализация линейки скрол-
линга осуществляется конструктором Init :
constructor tScrollBar.Init(var Bounds: tRect;
где Bounds - область, выделенная под линейку скроллинга в коорди-
натах его владельца.
Линейка скроллинга не может активизироваться, так как у нее не
установлен флаг ofSelectable параметра Options.Поэтому она не может
обычным образом реагировать на нажатие клавиш клавиатуры.Чтобы этого
не происходило, следует нарушить стандартный порядок обработки собы-
тий, установив флаг ofPostProcess параметра Options.
Диалоговое окно
Диалоговое окно (тип tDialog) представляет специальный тип окна
(является потомком tWindow) и предназначено в первую очередь для ввода
значений параметров в программу.
Так же как и обычное окно, диалоговое окно может использовать
один из трех видов палитры :
dpBlueDialog = 0 - синяя палитра диал. окна;
dpCyanDialog = 1 - голубая палитра диал. окна;
dpGrayDialog = 2 - серая палитра диал. окна.
В отличие от обычного окна диалоговое окно обычно
используется в модальном режиме.Инициализируется диалоговое окно конс-
труктором Init :
constructor tDialog.Init(var Bounds: tRect;
ATitle: tTitleStr);
где Bounds - размеры диалогового окна;
ATitle - имя диалогового окна размером до 80 символов.
В отличие от обычного окна у диалогового окна стандартно нет воз-
можности изменять размеры, оно использует серую палитру и не имеет но-
мера.
К другим особенностям диалогового окна можно отнести обработку им
клавиш Esc и Enter.Если диалоговое окно находится в модальном режиме,
нажатие Esc закрывает окно без сохранения введенной информации.Нажатие
клавиши Enter эквивалентно нажатию кнопки, выбираемой по умолчанию
(закрывает окно с сохранением внесенных изменений).
Для удобной работы с диалоговым окном в Turbo Vision имеется
большое количество стандартных объектов, которые можно использовать в
качестве элементов этого окна.
Работу с диалоговым окном в модальном режиме можно организовать
следующим образом.Сначала создать и инициализировать диалоговое окно,
при этом поместив в него все его элементы.Затем подготовить исходные
данные для передачи диалоговому окну.
Далее диалоговое окно размещается в рабочей области с помощью ме-
тода ExecuteDialog и осуществляется работа с ним.При завершении работы
анализируется, какое происходит завершение - с сохранением внесенных
изменений или без.Изменения, которые требуется сохранить, возвращаются
в том же параметре, в котором передавались исходные данные.
Если окно используется в немодальном режиме, последовательность
работы с ним аналогична последовательности работы с обычным окном.
Элементы диалоговых окон
Возможно использование стандартных элементов или их потомков :
- строки ввода;
- метки;
- протоколы;
- селективные списки;
- триггерные списки;
- кнопки;
- статические и параметрические тексты;
- списки строк;
- линейки скроллинга.
Строка ввода
Строка ввода (тип tInputLine) предназначена для ввода в программу
символьной информации.Фактически строка ввода представляет собой прос-
тейший редактор строки символов и обладает большим набором возможнос-
тей.Основным элементом строки является буфер (строка, в которую поме-
щаются все вводимые символы).Инициализируется строка ввода методом
Init :
constructor tInputLine.Init(var Bounds: tRect;
AMaxLen: Integer);
где Bounds - размер поля строки ввода;
AMaxLen - размер буфера.
Высота поля строки ввода должна равняться единице.Ширина поля мо-
жет быть любой, но не менее 3.Размер буфера может иметь любое значение
до 255.После создания строки ввода непосредственно изменять размеры
буфера нельзя.
Так как строка ввода работает только с символьной информацией, то
перед вводом в нее какого-либо числа оно должно быть преобразовано в
символьную форму, а при получении информации из строки ввода - обратно
преобразовано в двоичную.
Метка (tLabel)
Метка всегда связана с каким-либо другим элементом окна и предс-
тавляет собой текст, поясняющий смысл объекта.Кроме этого, с помощью
метки можно довольно просто активизировать связанный с ней элемент.При
нажатии курсором мыши на поле метки будет активизирован связанный с
ней элемент.
Конструктор метки имеет вид :
constructor tLabel.Init(var Bounds: tRect;
const AText: string; ALink: pView);
где Bounds - размер поля метки;
AText - текст метки;
ALink - указатель на объект, с которым связана метка.
Метка располагается либо над объектом, либо слева от него.Высота
поля метки равна единице.Если текст метки состоит из цифр и латинских
букв, то можно выделить одну букву и поместить ее между символами
~~.Такая буква на экране будет выделена особым цветом, а нажав клавишу
с этим символом, можно активизировать данный элемент.
Протокол
Протокол (тип tHistory) всегда связан со строкой ввода и предназ-
начен для сохранения в своем буфере вводимой в строку ввода информа-
ции.Для вызова ранее набираемой информации следует, находясь в строке
ввода, либо подвести курсор к полю пиктограммы протокола и нажать кла-
вишу мыши, либо нажать клавишу Down.В результате откроется окно прото-
кола, содержащее вводимые ранее строки в данную строку ввода.Следует
выбрать интересующую строку (клавиша мыши или клавиши Up и Down).Далее
дважды нажать клавишу мыши или нажать Enter.
Протокол инициализируется при помощи метода Init :
constructor tHistory.Init(var Bounds: tRect;
ALink: pInputLine; AHistoryID: Word);
где Bounds - поле для размещения пиктограммы протокола;
ALink - указатель на строку ввода, с которым связан протокол;
AHistoryID - номер протокола - число, определяющее данный тип
протокола.
Обычно протокол размещается за строкой ввода, к которой он отно-
сится.Ширина поля должна равняться двум, высота - единице.
Селективный (тип tRadioButtons) и триггерный ( тип tCheckBoxes)
списки
Селективный и триггерный списки очень похожи, так как у них есть
общий предок (tCluster), заключающий в себе общие свойства.
Селективный список позволяет выбрать только один элемент из этого
списка.Количество элементов ограничено числом 65536.
Триггерный список позволяет выбрать из списка любое число элемен-
тов (или ни одного), однако при стандартном использовании число эле-
ментов этого списка ограничено 16-ю.
Оба списка инициализируются одним методом Init объекта tCluster :
constructor tСluster.Init(var Bounds: tRect;
AStrings: pSItem);
где Bounds - поле, выделяемое под образ списка;
AStrings - указатель на список информационных строк.
Чтобы выбрать элемент списка, можно воспользоваться мышью, подве-
дя курсор к соответствующей строке и нажав клавишу, либо клавиатурой,
используя клавиши направления.В триггерном списке при использовании
клавиш направления следует завершить выбор элемента списка нажатием
пробела.
В строке символов каждого элемента списка можно выделить латинс-
кую букву или цифру, поместив ее между ~~.Она будет выделена на экране
особым цветом, и можно выбрать соответствующий элемент списка нажатием
клавиши клавиатуры с этим символом.
Кнопка (тип tButton)
Кнопка позволяет выбрать команду, которая с ней связана.При выбо-
ре команды работа с диалоговым окном часто прекращается.
Кнопка может иметь флаги, находящиеся в параметре Flags при ини-
циализации :
0-й бит (bfDefault) - кнопка, выбираемая по умолчанию.
1-й бит (bfLeftJust) - текст кнопки выравнивается по ее левому
краю ( при отсутствии флага текст центрируется).
2-й бит (bfBroadcast) - кнопка формирует сообщение вместо команды.
3-й бит (bfGrabFocus) - фокусирование кнопки при ее активизации
мышью.
Инициализируется кнопка конструктором Init :
constructor tButton.Init(var Bounds: tRect;
ATitle: tTitleStr; ACommand:Word;AFlags:Byte);
где Bounds - поле, выделяемое под кнопку;
ATitle - текст, размещаемый на кнопке;
ACommand - код команды, связанной с кнопкой;
AFlags - задаваемые флаги кнопки.
Выделяемое под кнопку поле должно быть достаточных размеров,
чтобы в нем отобразилась вся кнопка с текстом и ее тень.Поэтому высоту
кнопки не следует брать меньше двух, а ширина зависит от размещаемого
текста.
Выбрать кнопку можно с помощью мыши, подведя курсор и нажимая на
клавишу, либо с помощью клавиши Tab, а затем клавиши Enter.При выборе
кнопки она формирует событие-команду с кодом команды, который был за-
дан кнопке.В качестве параметра кнопка передает указатель на себя.
Статический (tStaticText) и параметрический (tParamText) тексты
Статический текст предназначен для размещения в диалоговом окне
различной поясняющей информации.
Инициализация осуществляется при помощи метода Init :
constructor tStaticText.Init(var Bounds: tRect;
const AText: String);
где Bounds - поле, выделяемое под статический текст;
AText - размещаемый текст.
Поле, выделяемое под статический текст, должно быть достаточных
размеров, чтобы можно было расположить все слова текста.Текст автома-
тически делится на слова и размещается в выделенном поле без переносов
внутри слов.
Разновидностью статического текста является параметрический
текст, позволяющий модифицировать выводимый текст в зависимости от за-
даваемых параметров.Для того, чтобы указать, в каком месте текста сле-
дует разместить параметры и какого типа, в исходном тексте используют-
ся спецификации там, где должны быть размещены параметры.
Инициализируется параметрический текст методом Init:
constructor tParamText.Init(var Bounds: tRect;
const AText: string; AParamCount: Integer);
где Bounds - поле, выделенное под параметрический текст;
AText - исходный текст со спецификациями параметров;
AParamCount - число параметров текста.
Списки строк
Списки строк в диалоговом окне напоминают поле скроллинга и его
потомков для обычных окон и предназначены для просмотра тех или иных
списков.
Список строк (тип tListViewer) является абстрактным объектом, из
него можно получить реальный объект, который будет работать с конк-
ретным списком информации (вертикальный и горизонтальный скроллинг).
Непосредственным потомком списка строк является список коллекции
строк (типа ListBox), предназначенный в первую очередь для просмотра
коллекции строк (только вертикальный скроллинг).
Инициализируется список коллекции строк с помощью конструктора
Init :
constructor tListBox.Init(var Bounds: tRect;
ANumCols: Word; AScrollBar: pScrollBar);
где Bounds - поле, выделенное под список;
ANumCols - число колонок, в которые выводятся строки;
AScrollBar - указатель на линейку вертикального скроллинга.
Стандартные окна
В Turbo Vision имеется большое количество стандартных окон, имею-
щих специальное назначение.Рассмотрим стандартные информационные ок-
на.Заголовок функции MessageBox имеет вид :
function MessageBox(const Msg: string; Params:
Pointer; AOptions: Word): Word;
где Msg - размещаемое в окне сообщение;
Params - указатель на параметры сообщения;
AOptions - флаги;
результат - код команды, связанной с нажатой кнопкой диалогового
окна.
Функция формирует окно размером 40*60, в котором помещается сооб-
щение Msg, скорректированное параметрами, находящимися по адресу, оп-
ределяемому значением Params и набор кнопок, определяемый параметром
AOptions, который определяет также тип окна (его название).
СОЗДАНИЕ СТРОК СОСТОЯНИЯ
Строка состояния не является необходимым атрибутом.Однако ее ис-
пользование помогает пользователю проще работать с программой, так как
он может получить информацию о текущем состоянии программы и клавишах
быстрого управления.Если программа должна иметь строку состояния, то
ее создание следует начинать непосредственно после создания меню прог-
раммы с тем, чтобы потом одновременно рассматривать команды, формируе-
мые меню и строкой состояния.
Строка состояния, отображающая клавиши быстрого управления
Каждый элемент строки состояния , содержащий информацию о конк-
ретной клавише (их совокупности) быстрого управления, имеет стандарт-
ный тип-запись tStatusItem :
tStatusItem = record
Next: pStatusItem;
Text: pString;
KeyCode: Word;
Command: Word
end;
где Next - указатель на следующий элемент строки состояния;
Text - указатель на строку, содержащую выводимый на экран текст
для данной клавиши быстрого управления;
KeyCode - код клавиши быстрого управления, с помощью которой можно
выбрать данный элемент строки состояния;
Command - код команды, которую следует выполнить при выборе данно-
го элемента строки состояния.
Создать элемент строки состояния можно с помощью стандартной
функции NewStatusKey :
function NewStatusKey(const AText: string;
AKeyCode: Word; ACommand: Word; ANext:
pStatusItem); pStatusItem;
где AText - выводимый на экран текст;
AKeyCode - код клавиши быстрого управления;
ACommand - код команды, которую следует выполнить при выборе дан-
ного элемента;
ANext - указатель на следующий элемент строки состояния;
результат - указатель на созданный элемент строки состояния.
Сама строка состояния имеет стандартный тип-запись tStatusDef :
tStatusDef = recerd
Next: pStatusDef;
Min, Max: Word;
Items: pStatusItem;
end;
где Next - указатель на следующую строку состояния;
Min, Max - миним. и максим. границы диапазона параметра контекс-
тной помощи, для которого отображается именно эта строка состояния;
Items - указатель на первый элемент списка элементов.
Элементы строки состояния также как и строки состояния представ-
ляют собой линейный список.
Для создания строки состояния можно воспользоваться стандартной
функцией NewStatusDef :
function NewStatusDef(AMin, AMax: Word;
AItems: pStatusItem; ANext: pStatusDef): pStatusDef;
где ANext - указатель на следующую строку состояния;
AMin, AMax - миним. и максим. границы диапазона параметра контекс-
тной помощи, для которого отображается именно эта строка состояния;
AItems - указатель на первый элемент списка элементов.
В строке состояния также можно отразить информацию о состоянии
программы в конкретный момент времени (процесс, протекающий в програм-
ме и т.д.)Информация такого вида зависит от значения параметра кон-
текстной помощи активизированного в настоящий момент элемента програм-
мы.Вывести такую информацию можно с помощью метода Hint объекта
tStatusLine :
function tStatusLine(AHelpCtx : Word): string; virtual;
где AHelpCtx - значение параметра контекстной помощи;
результат - строка символов, выводимая на экран.
ЦВЕТОВАЯ ПАЛИТРА TURBO VISION
Turbo Vision позволяет манипулировать цветом изображения объектов
на экране.При этом можно использовать стандартный набор цветов, задан-
ный в пакете, который охватывает расцвечивание всех стандартных объек-
тов и создает благоприятные цветовые ощущения у пользователя програм-
мы, или создавать свою палитру.
Стандартная палитра
Все стандартные отображаемые объекты имеют свою цветовую палитру
- набор цветов для отдельных элементов этого объекта, а окна и диало-
говые окна - по три палитры.Учитывая структуру отображаемых объектов
программы и то, что все отображаемые объекты программы за исключением
основного объекта tApplication, являются подэлементами какой - либо
группы, для каждого такого объекта палитра представляется строкой,
компонентами которой являются не атрибуты цветов, а номера элементов
палитры данной группы.
Если в программе достаточно использовать цвета основной палитры
по их прямому назначению, то никаких действий по раскрашиванию предп-
ринимать не надо, так как цвета выбираются при отображении на экране
соответствующего объекта с помощью метода Draw :
procedure <отображаемый объект>.Draw; virtual;
который, в свою очередь, использует методы GetPallete :
function <отображаемый объект>.GetPallete:
pPallete; virtual;
определяющий указатель на конкретную палитру объекта, и GetColor :
function tView.GetColor(Color: Word): Word;
где Color - номер входа в палитру;
результат - атрибуты соответствующего цвета.
Изменение стандартной палитры
Если требуется изменить уже существующий цвет у всех использующих
его объектов, то следует просто внести изменения в основную палит-
ру.Для этого нужно либо внести изменения в исходный текст модуля App
(константа CAppColor) и перекомпилировать его, либо внести изменения
в метод GetPallete объекта tProgram.
Второй вариант - когда нужно изменить цвета у какого-нибудь объ-
екта группы, а в этой группе есть другой объект, обладающий необходи-
мыми цветами.В этом случае можно изменить соответствующим образом
константу, определяющую палитру у метода GetPallete.
Если необходимо изменить цвета конкретного объекта, а требуемого
сочетания цветов у его владельца нет, то следует дополнить основную
палитру программы новыми элементами, соответствующими требуемым цве-
там.Так как основная палитра исходно имеет 127 элементов, то примерно
столько же можно к ней добавить в случае необходимости.После этого
следует переопределить метод GetPallete основного объекта программы.
В тех случаях, когда следует предусмотреть частое изменение цве-
тов отдельных объектов в процессе выполнения программы, можно восполь-
зоваться средствами модуля ColorSel.
НЕОТОБРАЖАЕМЫЕ ОБЪЕКТЫ TURBO VISION
Помимо отображаемых, в Turbo Vision имеется ряд неотображаемых
объектов, предназначенных для выполнения действий, не связанных непос-
редственно с представлением информации на экране, в частности проверки
вводимой информации или размещения в них той или иной информации.
Основными неотображаемыми объектами являются анализаторы вводимой
информации, коллекции, потоки и ресурсы.Все эти объекты - потомки объ-
екта tObject.
Анализаторы вводимой информации
В Turbo Vision 2.0 имеется возможность контроля размещаемой в
строке ввода информации.Для этого служит серия объектов, называемых
анализаторами вводимой информации, исходным является абстрактный объ-
ект tValidator, а его потомками являются стандартные анализаторы.
Анализатор множества допустимых символов (тип tFilterValidator)
проверяет, входят ли вводимые символы в множество допустимых, и если
входят, то помещаются в буфер строки ввода, а в противном случае сим-
волы игнорируются.Инициализация такого анализатора осуществляется
конструктором Init :
constructor tFilterValidator.Init(AValidChars: tCharSet);
где AValidChars - множество допустимых символов типа tCharSet.
Анализатор границ вводимого числа (тип tRangeValidator) предназ-
начен для контроля вводимых в символьной форме целых чисел (в общем
случае типа Logint).Этот анализатор, являясь потомком объекта
tFilterValidator, помимо проверки допустимых символов (только цифр и
знаков "+" и "-" в первой позиции вводимой информации) проверяет также
значение введенного числа и его нахождение в заданном диапазоне.
Анализатор инициализируется конструктором Init :
constructor tRangeValidator.Init(AMin, AMax: Longint);
где AMin, AMax - миним. и максим. допустимые границы вводимого числа.
Если введенное число не попадает в заданный диапазон, выдается
сообщение об ошибке в виде информационного окна, при выходе из которо-
го происходит возврат к строке ввода для внесения соответствующих из-
менений.Окно не закрывается.
Анализатор по списку строк (тип tStringLookupValidator) сравнива-
ет строку введенных символов со списком допустимых строк, находящимся
в коллекции строк.Реакция при неправильно введенной строке аналогичная.
Анализатор инициализируется конструктором Init :
constructor tStringLookupValidator.Init(
AStrings: pStringCollection);
где AString - коллекция строк, с которыми сравнивается вводимая инфор-
мация.
Анализатор по шаблону (тип tPXPictureValidator) позволяет создать
шаблон, по которому проверяется вводимая информация.Можно проверять
количество вводимых символов, их вид и т.д.
Анализатор инициализируется конструктором Init :
constructor tPXPictureValidator.Init(
const APic: string; AutoFill: Boolean);
где APic - шаблон, по которому проверяется вводимая информация;
AutoFill - если равен True, вводимая информация автоматически до-
полняется символами шаблона, не являющимися служебными символами.
Анализатор должен быть подключен к соответствующей строке ввода с
помощью метода SetValidator строки ввода :
procedure tInputLine.SetValidator(AValid: pValidator);
где AValid - указатель на подключаемый к строке ввода анализатор.
Объект-коллекция
Объект-коллекция (тип Collection) предназначен в первую очередь
для размещения в нем объектов (точнее, указателей на объекты).Основным
отличием коллекции от массива является то, что размеры ее при необхо-
димости могут изменяться.Кроме этого, коллекция может содержать объек-
ты разных типов и элементы, не являющиеся объектами.
Создается коллекция с помощью конструктора Init :
constructor tCollection.Init(ALimit, ADelta: Integer);
где ALimit - первоначальный размер коллекции;
ADelta - величина, на которую изменяется размер в случае необхо-
димости.
Работа с коллекцией осуществляется следующим образом.Вначале соз-
дается коллекция и инициализируется конструктором Init.После этого в
нее можно помещать компоненты.При этом в коллекции помещается указа-
тель на размещаемый объект.Если при размещении очередного объекта в
коллекции нет достаточного места, она автоматически увеличивается на
величину ADelta.
Компоненту в коллекцию можно поместить либо в конце списка, либо
после компоненты с указанным значением индекса.В первом случае исполь-
зуется метод Insert :
procedure tCollection.Insert(Item: Pointer); virtual;
где Item - указатель на размещаемый в коллекции объект,
во втором случае используется метод AtInsert :
procedure tCollection.AtInsert(Index:Integer;Item: Pointer);
где Index - номер компоненты, который получает размещаемый объект;
Item - указатель на размещаемый в коллекции объект.
Эти методы копии размещаемого в коллекции объекта не создают.
Следует отметить три важных метода коллекции.
Метод FirstThat :
function tCollection.FirstThat(Test: Pointer): Pointer;
где Test - указатель на функцию, проверяющую некоторое условие;
результат - указатель на первую компоненту коллекции, для которой
верно условие, проверяемое функцией, указатель на которую равен Test.
Функция с указателем Test не должна быть методом и должна компи-
лироваться с директивой far.Ее заголовок выглядит следующим образом :
function <имя функции>(Item: Pointer): Boolean; far;
В этом заголовке Item - указатель на компоненту коллекции; ре-
зультат функции равен True, если проверяемое функцией условие выполня-
ется, и False - в противном случае.
Второй метод - LastThat :
function tCollection.LastThat(Test: Pointer): Pointer;
где Test - указатель на функцию, проверяющую условие; результат - ука-
затель на последнюю компоненту коллекции, для которой верно условие,
проверяемое функцией, указатель на которую равен Test, либо nil, если
ни для одной компоненты коллекции условие не выполняется.Функция с
указателем Test аналогична такой же функции метода FirstThat.
Третий метод - ForEach :
procedure tCollection.ForEach(Action: Pointer);
где Action - указатель на процедуру, которая выполняет требуемые дейс-
твия с каждой компонентой.Процедура с указателем Action не должна быть
методом и должна компилироваться с директивой far.Ее заголовок :
procedure <имя процедуры>(Item: Pointer); far;
где Item - указатель на компоненту коллекции.
Коллекция может содержать не только объекты, но и элементы других
типов.В частности, имеется стандартная коллекция строк (тип
tStringCollection).В ней переопределен метод FreeItem, который удаляет
компоненту из коллекции и из динамической памяти.
Потоки Turbo Vision
Поток и его потомки предназначены для хранения в них объектов и
данных других типов.Потоки напоминают обычные файлы, но они могут су-
ществовать не только на внешних устройствах, но и в оперативной памя-
ти.Другое важное отличие - возможность хранения данных разных ти-
пов.Возможны запись и чтение.
При создании потока в нем не находится никакой информации.Записы-
ваемая в поток информация последовательно приписывается к его концу,
так что условный указатель на текущий элемент файла в этом случае ука-
зывает на его конец.После чтения очередной компоненты из потока указа-
тель автоматически настраивается на начало следующей.
Поток типа tStream является абстрактным потоком, потому что он не
привязан к конкретному носителю информации.На практике используются
потоки ДОС (тип tDosStream) и буферированный поток (тип
tBufStream).Они позволяют хранить информацию во внешних файлах, причем
у буферированного потока информация передается через промежуточный бу-
фер, что повышает быстродействие работы.
Поток ДОС инициализируется конструктором Init :
constructor tDosStream.Init( FileName: FNameStr; Mode: Word);
где FileName - имя файла, с которым связан поток (размеры по правилам
MS-DOS - до 79 символов);
Mode - категория файла.
Буферированный поток инициализируется конструктором Init :
constructor tBufStream.Init( FileName: FNameStr;
Mode, Size: Word);
где FileName - имя файла, с которым связан поток (размеры по правилам
MS-DOS - до 79 символов);
Mode - категория файла;
Size - размер буфера (обычно от 512 до 2048 байт).
Перед тем как поместить объект в поток или взять из потока, его
следует подготовить.
Следует создать методы записи информации в поток и чтения из не-
го.У стандартных отображаемых объектов в Turbo Vision такие методы уже
имеются.Первый метод - Store :
procedure <отображаемый объект>.Store (var S: tStream);
где S - поток, в который помещается объект.Метод размещает объект в
потоке.
Второй - конструктор Load :
constructor <отображаемый объект>.Load(var S: tStream);
где S - поток, из которого берется объект.Конструктор загружает объект
из потока в память.
Для того, чтобы записать в поток тот или иной параметр объекта
(группу параметров, следующих друг за другом), можно воспользоваться
методом Write :
procedure <тип потока>.Wriye (var Buf; Count: Word); virtual;
Buf - буфер с переписываемой информацией;
Count - размер переписываемой информации в байтах.
Это основной метод записи информации в поток.
Для всех методов имеются аналоги, осуществляющие чтение информа-
ции из потока.Основной - метод Read, позволяющий читать из потока зна-
чение параметра объекта (группы параметров) :
procedure <тип объекта>.Read (var Buf; Count: Word); virtual;
Buf - буфер, в который помещается информация;
Count - размер переписываемой информации в байтах.
Вторая операция, связанная с подготовкой объекта к записи в по-
ток, - его регистрация.В потоке могут быть объекты разных типов, поэ-
тому возникает проблема в определении типов этих объектов при необхо-
димости работы с ними.Для решения этой проблемы используется система
регистрации, заключающаяся в том, что каждому типу объекта, который
предполагается записать в поток, присваивается индивидуальный регист-
рационный номер.По этому номеру будут определяться размер записанной
или записываемой информации, соответствующая таблица виртуальных мето-
дов, а также адреса методов, с помощью которых данный объект загружа-
ется в поток и читается из него.
Для регистрации объекта следует создать регистрационную запись
(типа tStreamRec) :
type
tStreamRec = record
ObjType: Word;
VmtLink: Word;
Load: Pointer;
Store: Pointer;
Next: Word;
end;
где ObjType - индивидуальный регистрационный номер объекта;
VmtLink - смещение адреса таблицы виртуальных методов объекта;
Load - адрес конструктора Load объекта;
Store - адрес метода Store объекта;
Next - смещение адреса следующей регистрационной записи.
В качестве регистрационной записи, как правило, типизированная
константа, у которой заполнены первые 4 поля.Имя регистрационной запи-
си получается из имени объекта заменой префикса t на префикс R.У стан-
дартных элементов уже есть регистрационные записи.За стандартными объ-
ектами зарезервированы индивидуальные регистрационные номера с 1 до
999, так что программист может назначать своим объектам номера от 1000
до 65535.Это число записывается в первое поле регистрационной запи-
си.Во второе поле помещается смещение адреса таблицы виртуальных мето-
дов объекта, в третье поле - адрес конструктора Load, а в четвертое -
адрес метода Store.Пятое поле заполняется автоматически при регистра-
ции объекта.
Запись объекта в поток осуществляется с помощью метода Put
объекта tStream :
procedure tStream.Put(P: pObject);
где P - указатель на размещаемый в потоке объект.
Чтение объекта из потока осуществляет метод Get объекта tStream :
function tStream.Get; pObject;
где результат - указатель на созданный объект.
После работы с потоком его следует закрыть процедурой Dispose :
Dispose(MyStream, Done);
где MyStream - поток, с которым завершается работа;
Done - деструктор потока.
Ресурсы
У рассмотренных потоков есть недостаток - непросто осуществить
произвольный доступ к отдельным компонентам потока.Поэтому имеется
специальный объект - файл ресурсов (tResourceFile), связанный с пото-
ком, в котором обеспечен произвольный доступ к любой компоненте по ее
имени (идентификатору).Этот поток дополнен потомком коллекции строк,
содержащим адреса компонент (ресурсов) в потоке, размеры компонент и
их имена.
Инициализируется файл ресурсов конструктором Init ;
constructor tResourceFile.Init(AStream: pStream);
где AStream - поток, который связывается с файлом ресурсов.
Прежде чем инициализировать файл ресурсов, следует создать соот-
ветствующий поток.
Размещение объекта в файле ресурсов осуществляется с помощью ме-
тода Put :
procedure tResourceFile.Put(Item: pObject; Key: String);
где Item - указатель на размещаемый в файле ресурсов объект;
Key - имя, присвоенное размещаемому объекту.
Извлечение объекта из файла ресурсов осуществляется с помощью ме-
тода Get :
function tResourceFile.Get(Key: String): pObject;
Key - имя, присвоенное размещаемому объекту;
результат - указатель на найденный объект или nil, если нет объ-
екта с таким именем.
В файле ресурсов можно хранить библиотеку интерфейсных элемен-
тов.Использование таких файлов является хорошим средством повышения
эффективности программирования, ускоряя процесс создания программ.
Списки строк
В Turbo Vision имеется специальный объект - список строк (тип
tStringList), предназначенный для хранения в потоке последовательности
строк, которые можно вызвать по номеру.
Прежде чем рассматривать объект tStrihgList, познакомимся с объ-
ектом типа tStrListMaker, позволяющим создать список строк и наполнить
его соответствующим содержанием.Инициализируется он конструктором Init
constructor tStrListMaker.Init(AStrSize,AIndexSize: Word);
где AStrSize - размер буфера для размещения строк;
AIndexSize - максимальный индекс размещаемой строки.
Размещаются строки в список с помощью метода Put :
procedure tStrListMaker.Put(Key: Word; S: string);
где Key - индекс размещаемой строки;
S - размещаемая строка.
Сам список tStrList конструктора не имеет, получить из него стро-
ку можно с помощью метода Get :
function tStrList.Get(Key: Word): string;
где Key - индекс строки;
результат - найденная строка.
НЕКОТОРЫЕ ДОПОЛНИТЕЛЬНЫЕ ВОЗМОЖНОСТИ TURBO VISION
Текстовый редактор
В настоящее время создано большое количество текстовых редакто-
ров, но иногда требуется создать свой собственный, особенно когда он
должен входить составной частью какого-либо пакета.Пакет Turbo Vision
содержит ряд объектов, на основе которых можно создать неплохие текс-
товые редакторы.Исходным является объект tEditor.Его потомок - объект
tFileEditor, позволяющий создавать редакторы, связанные с текстовыми
файлами.Без особых изменений можно создавать редакторы, работающие од-
новременно с любым количеством файлов, содержащих тексты до 64 К,
обеспечивающие работу с клавиатурой и мышью, поиск в тексте и замену,
использование буфера и т.д.
Отображение древовидных структур
Часто в программе используются древовидные иерархические структу-
ры, которые желательно отобразить на экране с изображением связей меж-
ду отдельными элементами.К таким структурам относятся меню и строки
состояния.Для отображения подобных структур в Turbo Vision имеются два
специальных объекта : абстрактный объект tOutlineViewer, осуществляю-
щий отображение структуры на экране, и tOutline, осуществляющий работу
с конкретной древовидной структурой.Последний объект позволяет скры-
вать или показывать на экране те или иные ветви структуры с помощью
мыши или клавиатуры.
Диалоговое окно задания цветной палитры
Существует стандартное диалоговое окно задания цветов
tColorDialog.С помощью этого окна можно изменять лишь имеющиеся цвета
и, кроме того, изменение цветов произойдет одновременно у всех отобра-
жаемых объектов программы соответствующего типа.
ЗАКЛЮЧЕНИЕ
Очень важным показателем при оценке программных продуктов являет-
ся удобство работы пользователя.
Поэтому в настоящее время ни один программный продукт, лишенный
удобного интерфейса взаимодействия пользователя с компьютером и
программ между собой, не заинтересует никого так, как заинтересовал бы
программный продукт таких же возможностей, но с удобным пользователь-
ским интерфейсом.
В мире разработано огромное количество различных систем поддержки
создания пользовательского интерфейса.
Представленный в данной работе разработанный фирмой Borland
International пакет Turbo Vision 2.0 является удобным средством уп-
рощения работы по организации ввода/вывода, его унификации с учетом
современных требований к интерфейсу программ. Этот пакет представляет
собой объектно-ориентированную библиотеку средств формирования пользо-
вательского интерфейса.
Более универсальным является диалоговый способ передачи информа-
ции и именно для организации диалога предназначен в первую очередь па-
кет Turbo Vision.Использование этого пакета освобождает программиста
от занимающей много времени работы, связанной с организацией вво-
да/вывода, которая повторяется от программы к программе, требует вы-
полнения однотипных операций, отвлекает внимание программиста от реше-
ния основной задачи.
В современных программах, работающих в текстовом режиме, диалог
обычно организуется с помощью трех средств : меню, диалоговых окон и
строк состояния.Turbo Vision позволяет реализовать все эти средства
диалога.В представленной работе подробно описаны методы создания
этих средств, их виды, особенности, элементы, а также приводятся реко-
мендации по их использованию.
Turbo Vision представляет собой библиотеку объектов, позволяющих
создать пользовательский интерфейс. Почти все объекты библиотеки явля-
ются потомками общего абстрактного объекта tObject.В работе рассмотре-
на их классификацию, исходя из задач, возникающих при создании интер-
фейса.
В работе подробно рассмотрен порядок работы с отображаемыми
объектами (создание, помещение в группу, задание параметров), работы
с модальными объектами, а также виды неотображаемых объектов Turbo
Vision и работу с ними.
Пакет Turbo Vision позволяет использовать стандартную па-
литру или создавать свою.Пакет имеет дополнительные возможности, что
может быть очень важным в ряде случаев : можно создать текстовый ре-
дактор с большими возможностями, при необходимости отобразить древо-
видную структуру, использовать диалоговое окно задания цветовой палит-
ры.
Исходя из средств и особенностей пакета можно сказать, что
Turbo Vision фирмы Borland International является одним из самых удоб-
ных современных средств создания пользовательского интерфейса.
... панели ввода, кнопки управления с независимой и зависимой фиксацией; - стандартную обработку нажатий клавиш и работы манипулятором "мышь"; - и многое другое! Чтобы использовать Turbo Vision , нужно свободно владеть объектно-ориентированим программированием (ООП) и, в частности, С++. В приложениях, написаных с использованием TurboVision , широко используется техника ООП, в ...
... работе в графическом режиме предназначается для обучения студентов младших курсов Санкт-Петербургской государственной Академии аэрокосмического приборостроения навыкам программирования, а именно работе в графическом режиме языка Turbo-Pascal . Для работы с настоящей программой необходимо знание стандарта языка, интегрированной среды и элементарным навыкам работы с персональным компьютером . ...
... і форматування тексту, створення і робота з вікнами та багато іншого. Основним засобом відображення інформації, яка вводиться і виводиться під час роботи прикладних і системних програм є екран. В Turbo Pascal є можливість працювати з екраном у текстовому і графічному режимах. Текстовий режим призначений для відображення символів кодової таблиці і характеризується максимальним числом символів ...
... ныне систем программирования выбран именно Турбо-Паскаль по следующим причинам: 1) По сравнению с другими языками программирования, которые обыч- но используются для создания систем искусственного интеллекта (LISP, PROLOG, SMALLTALK), язык Паскаль проще в изучении; программы на Паска- ле более читаемы. 2) От других обычных современных языков программирования (C++, BASIC,MODULA 2, ...
0 комментариев