Кнопки.
4 прямоугольника с правой стороны окна - наиболее интересная часть диалогового окна Неllо, World! Они называются кнопками и введены для примера элементов управления. Каждая кнопка имеет метку, которая указывает, что случится, когда эта кнопка нажата.
Вы нажимаете на кнопку, выбрав ее мышкой или сделав кнопку кнопкой по умолчанию и нажав Enter. Попытайтесь нажать одну из кнопок мышкой и посмотрите что случится. Тело кнопки передвигается на 1 позицию вправо и ее тень исчезает. Это создает иллюзию, что кнопка была нажата на экране. Когда Вы отпускаете кнопку мышки, выполняется действие, связанное с этой кнопкой.
Заметьте, что надпись внутри кнопки Сanсеl выведена другим цветом, чем остальные кнопки. Отличие в цвете указывает на то, что кнопка Сanсеl является кнопкой по умолчанию внутри диалогового окна. Если Вы нажмете Enter, когда Cancel по умолчанию, действие будет таким же, как при нажатии кнопки Сanсеl.
Кнопка по умолчанию внутри диалогового окна изменяется нажатием клавиши Tab. Попробуйте использование Tab внутри диалогового окна Неllо, World! Цвет кнопки по умолчанию передвигается от одной кнопки к другой при каждом нажатии клавиши Tab. Это позволяет пользователю нажимать кнопку без использования мышки, передвигая умолчание к требуемой кнопке с помощью клавиши Tab и нажимая Enter или пробел, чтобы "нажать" кнопку.
Вывод.
Нажатие любой кнопки в Неllо приведет к исчезанию диалогового окна. Вы можете открыть меню Неllо снова и использовать диалоговое окно любое количество раз. Чтобы выйти из программы, Вы можете выбрать элемент Exit в меню Неllо или использовать короткую форму Exit: A1t-X. Заметим, что короткая форма представлена как внутри меню Неllо, так и в строке статуса внизу экрана.
Прикладной объект.
Краеугольным объектом любой программы является объект TApplication. TApplication - это абстрактный тип объекта. Он ничего не делает. Вы используете TApplication, создавая порожденные типы от TApplication, которые содержат Ваш программный код.
В HELLO определяется порожденный тип объекта ТНеllоАрр:
РНеllоАрр = ^ТНеllоАрр; ТНеllоАрр = object(TApplication) procedure GreetingBox; procedure HandleEvent(var Event: TEvent); virtual; procedure InitMenuBar; virtual; procedure InitStatusLine; virtual; end; |
ТНеllоАрр содержит гораздо больше, чем эти 4 метода; порожденный объект наследует все от его предка TApplication. Все, что Вы не переопределяете, наследуется в неизменном виде от TApplication.
4 Метода, определенные в тНе1lоАрр, завершают "большую картину" Вашего приложения:
- Метод HandleEvent работает с общими событиями, которые возникают внутри любой программы, но Вы должны обеспечить обработку событий, специфичных для Вашей программы.
- Метод InitMenuBar устанавливает меню для полосы меню Вашей программы. TApplication содержит полосу меню, но не сами меню. Если Вам необходимы меню, Вы просто определяете метод для определения меню.
- Метод InitStatusLine устанавливает текст строки статуса внизу экрана. Этот текст обычно отображает сообщение о текущем состоянии программы, показывая доступные горячие клавиши или напоминая пользователю о некоторых действиях.
- Метод GreetingBox вызывает диалоговое окно в ответ на элемент меню Greeting. GreetingBox вызывается из метода HandleEvent в ответ на событие, переключаемое выбором элемента меню Greeting. В более сложных программах Вы можете использовать различные методы в ответ на каждый элемент меню, определенный в начальном меню.
Короче, методы из ТНеllоАрр обеспечивают все, что должны выполнять объекты главной программы: установку программы, выполнение действий в ответ на события и методы реализующие отклики на отдельные события. Именно эти 3 вещи Вы должны добавить к TApplication при создании порожденного типа объекта.
Объект диалоговое окно.
Другим важным объектом, используемым в Неllо, является диалоговое окно. Поскольку диалоговое окно не выполняет ничего специального, Неllо использует экземпляр объекта TDialog. Не требуется порождать специального объекта из TDialog. Сам TDialog не содержит интерактивных элементов. Это ничего более, чем оболочка; Вы предоставляете поля или элементы управления, взаимодействующие с пользователем. THe1loApp.GreetingBox строится на основе TDialog, вставляя 4 кнопки, которые являются видимыми элементами Turbo Vision.
Выполнение и отладка.
Поскольку программы Turbo Vision управляются событиями, их код структурирован несколько по другому, чем у обычных программ. Программы, управляемые событиями, отделяют управляющие структуры, которые читают и оценивают ввод пользователя (и другие события) от процедур и функций, которые выполняют действия на основе этого ввода.
Главная программа.
На верхнем уровне абстракции главная программа на Turbo Vision выглядит аналогично Неllо:
var He1loWorld: ТНе1lоАрр; begin He1loWorld.Init; He1loWorld.Run; He1loWorld.Done; end; |
Метод Init.
Первый из трех операторов He1loWorld.Init - это необходимый вызов конструктора. Все объекты, содержащие виртуальные методы, должны быть созданы (через вызов их констрактора) до вызовов любых других методов этого объекта. Все конструкторы Turbo Vision имеют имя Init.
He1loWorld.Init устанавливает объекты главной программы для использования. Он
очищает экран,
устанавливает некоторые значения для важных переменных,
заполняет панель экрана,
выводит строку статуса и полосу меню,
вызывает констракторы многих других объектов, некоторые из которых никогда не видны, поскольку они вызываются внутри.
Метод Run.
Почти вся работа программы в Turbo Vision выполняется внутри метода главной программы Run. Run наследуется от родительского объекта TApplication.
Run состоит главным образом из цикла repeat – until, показанном здесь в псевдокоде:
repeat
Получить событие;
Обработать событие;
until Quit;
Это не точный код, а общая схема реализации Run.
В сущности программа Turbo Vision циклически выполняет 2 задачи: получение события и обработка этого события. Одно из событий вычисляется в некоторый вид команды выхода и цикл завершается.
Метод Done.
Дестрактор Done в действительности очень прост: он уничтожает все объекты программы - полосу меню, строку статуса и панель экрана - и удаляет обработчик ошибок и драйверы TurboVision. Метод Done должен отменять все действия, выполненные констрактором Init, а затем вызывать TApplication.Done, которьп3 обрабатывает все стандартные элементы. Если Вы перекрыли TApplication.Init, Вы, вероятно, будете перекрывать TApplication.Done.
Одна из лучших возможностей Turbo Vision - это предоставление Вам свободы изменять Ваши программы с минимальными усилиями.
