титься к этим методам.
Деструктор выполняет действия, обратные действиям конструктора, и
используется при удалении отображаемого объекта, имеющего виртуальные
методы.Сам деструктор также является виртуальным.
Переопределенный метод предка позволяет, используя возможности
исходного метода, модифицировать их, добавить в них некоторые дополни-
тельные свойства, специфические для данного объекта.Переопределенный
метод должен быть виртуальным.
Специфический для данного объекта метод - это метод, который не
имеет аналогов у предка данного объекта.
Создание отображаемого объекта
Если отображаемый объект не размещен постоянно в сегменте данных
(не задана соответствующая переменная конкретного типа-объекта), необ-
ходимо создать соответствующий объект.Модальные объекты, как правило,
не размещаются постоянно в сегменте данных и создаются только на время
работы с ними; немодальные объекты могут и одного, и другого вида, но
чаще все-таки также не размещаются постоянно в сегменте данных.Созда-
ется объект с помощью стандартной подпрограммы 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.Создается оно обычно с помощью стандартной