Татьяна Полилова

Часть 1
Часть 2

(Начало в № 1, 3, 1999 г.) Наш проект почти готов. В нем есть титульная страница с названием проекта. Есть страница (форма) с картой, на которой расположены кнопки перехода к другим разделам проекта, представляющим более подробно исторические памятники. Реализованы механизмы перехода с помощью списка и с помощью "быстрых кнопок". Теперь осталось спроектировать формы для демонстрации материалов по истории памятников, научиться размещать в формах мультимедиа объекты, и самое последнее — научиться корректно завершать задачу.

рис.1 рис.2
Рис.1 и 2

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

рис.3
Рис. 3

Разместим в форме кнопки перехода: кнопка "Дальше" будет задавать переход на следующую форму с другим историческим памятником, а кнопка "Карта" обеспечит переход на форму с картой района Москвы. Определим реакцию на событие OnClick для кнопок "Дальше" и "Карта": нужно спрятать (Hide) окно текущей формы и показать (Show) на экране форму для следующего исторического памятника или форму с картой района Москвы.

рис.4
Рис. 4

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

рис.5 рис.6
Рис.5 и 6



Создание объекта Memo

Иконка для создания этого объекта находится в наборе Standard палитры компонентов. Создадим объекты Memo1 для списка тем справочного материала и Memo2 для подрисуночной подписи и определим некоторые свойства этих объектов. Мы хотим, чтобы объекты имели фон, совпадающий по цвету с фоном формы. Для этого свойству Color нужно установить значение clBtnFace, которое было установлено по умолчанию свойству Color формы. Данное значение выбирается из предлагаемого системой списка. Установив False для свойства Ctl3D, мы отменим "трехмерный эффект", из-за которого поверхность объекта выглядит как вдавленная внутрь. Отменим также рамку у объектов, установив свойству BorderStyle значение bsNone.

рис.7
Рис. 7

Для ввода текста в объекты Memo нужно инициировать строку ввода для свойства Lines, при этом появляется окно для ввода и простого редактирования текста (рис. 7). После закрытия окна набранный текст попадает в форму в область объекта. Для текста можно выбрать шрифт (начертание и размер), инициировав позицию Font в окне свойств. Можно задать выравнивание текста в области объекта, выбрав соответствующее значение свойства Alignment.

Создание модальных окон

Для показа справочного материала по темам, представленным в объекте Memo1 ("Время постройки", "Архитектор", "Историческая справка", "Современный вид площади"), используем дополнительные формы (SForm1, SForm2, SForm3, SForm4). Переход на эти формы происходит при нажатии "быстрых кнопок", которые располагаются рядом со списком тем. Объект Memo1 выполняет здесь роль поля, комментирующего назначение "быстрых кнопок". Справочные сведения будем демонстрировать в модальных окнах. Этот тип окон удобен здесь по двум причинам. Во-первых, открытое модальное окно не позволяет пользователю переключаться на другие окна до тех пор, пока он явно не закроет текущее окно. Тем самым мы можем не опасаться "бесхозных" окон, которые способны чрезмерно загромоздить экран и усложнить работу не слишком аккуратного пользователя. Во-вторых, мы можем не описывать реакцию на закрытие окна: модальное окно имеет статус дочернего, и при его закрытии активным становится окно, из которого было порождено модальное окно. Для организации перехода по нажатию "быстрых кнопок" так же, как в предыдущем примере работы со списком, заведем массив Modals из пяти элементов с ссылками на созданные формы. Длина массива будет задаваться константой numModals. В блоке implementation в конструкции uses как обычно нужно будет перечислить все внешние имена программных единиц (назовем программные единицы образованных дополнительных форм как U_Str1, U_Str2, U_Str3, U_Str4). (рис. 8)

рис.8
Рис. 8

Теперь создадим пять "быстрых кнопок" — надеемся, читатель не забыл, как это делать. Присвоим каждой "быстрой кнопке" уникальное значение свойства Tag в диапазоне от 0 до 4. Определим реакцию на нажатие первой кнопки, инициировав для кнопки поле OnClick в окне свойств и написав оператор обращения к методу ShowModal (показать форму в режиме модального окна) соответствующей формы (рис. 9).

рис.9
Рис. 9

При определении реакции на событие OnClick для оставшихся четырех "быстрых кнопок" теперь достаточно сослаться на только что написанную процедуру STower.SpeedButtom1Click. На рисунке показан экран во время работы приложения: форма с исторической справкой появилась на фоне окна, из которого произошел вызов. (рис. 10)

рис.10
Рис. 10

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

Медиа-объекты

Познакомимся теперь с приемами размещения медиа-объектов (звуковых и визуальных) в приложении. Например, мы хотим, чтобы при появлении на экране титульной страницы звучал музыкальный фрагмент. Для этого разместим в форме Title медиа объект. Соответствующий компонент находится в палитре компонентов с закладкой System. После щелчка по иконке компонента MediaPlayer и щелчка в форме появится стандартного вида панель, предназначенная для управления проигрыванием музыкального или видеофрагмента. Пока созданный объект является текущим, активизируем свойство FileName в окне его свойств: на экране появится окно, где можно выбрать имя звукового файла (рис. 11).

рис.11
Рис. 11

Объект MediaPlayer, вообще говоря, разрешает пользователю проекта управлять процессом воспроизведения звука. Но в нашем случае мы хотим дать фоновую музыку, поэтому скроем от пользователя средства управления, для чего дадим свойству Visible нашего медиа-объекта значение False. Кроме того, нам нужно, чтобы музыка звучала сразу же после появления на экране титульной страницы. Для этого запрограммируем реакцию на событие OnCreate для формы Title. Инициировав эту строку в окне событий формы (не забудьте сделать форму текущим объектом!), дополним процедуру TTitle.FormCreate обращением к методу Play только что созданного объекта MediaPlayer1 (рис. 12).

рис.12
Рис. 12

В процедуре мы обратились сначала к методу Open, а потом к методу Play. Это привычная для программистов техника. Но можно поступить иначе: свойству AutoOpen медиа-объекта придать значение True, и тогда можно не обращаться к методу Open. Аналогичным образом в форме можно разместить проигрыватель видеофрагмента. Например, в форме по истории Сухаревой башни поместим кнопку с надписью "Учитель", с помощью которой будет запускаться видеосюжет. Фрагмент видео показывается в специальном окне. Создание и запуск этого мультимедиа-объекта осуществляется аналогично запуску звукового файла, о чем говорили выше: в форме размещается невидимый мультимедиа-объект, связанный с содержащим видеоматериал файлом, а его метод Play инициируется нажатием кнопки "Учитель" (как реакция на событие OnClick для этой кнопки). Вид экрана при воспроизведении видеосюжета показан на рисунке (рис. 13).

рис.13
Рис. 13



Завершение работы программы

Итак, приложение почти готово. В процессе создания программы у нас неоднократно появлялась возможность запускать ее на выполнение. Некоторые шаги для корректного завершения работы программы мы уже предпринимали. Например, при создании формы с картой была задана реакция на закрытие этой формы (реакция на событие OnClose) как обращение к методу Close формы Title. Поскольку форма Title у нас является главной формой (головной программой), то при обращении к этому методу происходило завершение задачи. Для форм с историческим материалом также нужно предусмотреть корректное завершение задачи, когда пользователь закрывает окно с помощью стандартной кнопки (кнопки с крестиком в правом верхнем углу окна). Нужно сделать форму текущим элементом (щелкнуть в области формы, не попадая при этом в область какого-либо объекта) и задать реакцию на событие OnClose как обращение к методу Close главной формы (рис. 14).

рис.14
Рис. 14

Для пользователей, желающих организовать более изысканное завершение задачи с диалогом типа "Вы действительно хотите завершить задачу? Выберите да или нет", расскажем более подробно о механизме закрытия окон и завершения работы программы. Вызов метода Close приводит к ряду действий, которые остаются для пользователя за кулисами Windows. Эти действия не нужно специально программировать, они выполняются автоматически. Метод Close вызывает функцию CloseQuery. Если эта функция возвращает True, программа активизирует обработчик событий OnClose данной формы. Если функция CloseQuery возвращает False, вызов Close аннулируется, и окно остается открытым. Продемонстрируем на простом примере использование функции CloseQuery. Выберем форму и щелкнем по ней, не попадая в область какого-либо объекта на форме. В окне Object Inspector переключимся на панель событий (закладка Events) и дважды щелкнем в правом поле строки OnCloseQuery. В появившемся окне в телепроцедуры напишем условный оператор, реализующий обработку данного события (рис. 15).

рис.15
Рис. 15

Включение в программу этого оператора приведет к тому, что при попытке закрытия окна работающего приложения на экране появится окно с вопросом и кнопками для вариантов ответа (рис. 16).

рис.16
Рис. 16

Лучше не утруждать себя анализом синтаксиса оператора в теле процедуры FormCloseQuery — смысл его понятен: если в ответ на вопрос "Завершить программу?" пользователь нашего приложения ответит "да", то функция CloseQuery возвращает значение True, после чего программа завершится. В противном случае окно приложения останется открытым, и выполнение программы будет продолжено.

Подведение итогов

Работу по созданию учебного мультимедиа-проекта можно считать законченной. Мы создали структуру гипермедиа, по которой можно путешествовать и знакомиться с материалом по истории Москвы, представленным в текстовом, графическом и звуковом виде. Разумеется, это самый простой вариант мультимедиа-приложения. Проект можно наращивать и улучшать по многим направлениям. Но, надеемся, что определенная цель достигнута: мы продемонстрировали, что такая работа вполне по силам рядовому пользователю с фоновыми знаниями в области программирования, не искушенному в тонкостях новомодных технологических концепций. Материал статьи был подобран так, чтобы читатель смог самостоятельно выполнить первые шаги по реализации приложения в среде Delphi. Подробно описаны последовательные действия по созданию реального мультимедиа-проекта, успешно функционирующего в среде Windows 95 (что подтверждается картинками экранов, демонстрирующими работу программы). Учебный проект такого рода можно осуществлять за 2-3 часа, если следовать инструкциям. Многих потенциальных пользователей Delphi может испугать новизна и кажущаяся сложность среды разработки. Опасения вызывают также многочисленные толстые руководства по работе с Delphi, появившиеся на полках магазинов. Задача данной статьи — продемонстрировать простоту и практическую ценность идей визуального программирования на примере создания приложения, представляющего интерес в контексте освоения технологии мультимедиа. Статью можно рассматривать как введение в Delphi. После начального знакомства заинтересованные читатели могут далее самостоятельно совершенствоваться в Delphi, уточняя детали по справочникам и руководствам.

Найдет ли Delphi применение в школе

Может ли Delphi найти применение в школах? На наш взгляд — да. Многие учебные заведения создают информационные материалы, касающихся их истории, традиций, образовательных программ, культурных инициатив. Эти материалы могут быть представлены в виде мультимедиа-приложений. И Delphi окажет неоценимую помощь в разработке таких программ. Среду Delphi можно использовать и на уроках информатики в старших классах для обучения школьников современным приемам программирования. На наш взгляд, Delphi имеет явные преимущества по сравнению с языками семейства Бэйсик или Си, поскольку в его основе лежит Паскаль, и, соответственно, выдерживается ставшая классикой языковая линия Н. Вирта. Если уж обучать школьников программировать, то лучше изначально прививать им программистскую культуру. При изучении Delphi важно правильно расставить акценты и приоритеты, чтобы не потерпеть поражение в борьбе со сложностями теории. Есть два принципиально разных подхода к изучению нового инструмента. В соответствии с первым школьники вначале в деталях знакомятся с возможностями инструмента. А потом им предлагается самим определить, для чего они могут использовать изученный инструмент, т. е. какие задачи можно решать с его помощью. Другой подход состоит в том, что перед учениками вначале ставится некая реальная задача, далее они осваивают ее решение с помощью предложенных средств, по ходу работы изучая функции инструмента и его возможности. Например, при изучении языка программирования Бэйсик большую часть уроков иногда посвящают детальному знакомству с основными конструкциями языка, синтаксическими правилами написания операторов и пр. После изучения основ Бэйсика ученикам предлагается конкретная задача, например, запрограммировать алгоритм перемещения объекта по экрану. Во втором случае учебные задачи ставятся иначе. Мы могли бы предложить ученикам заняться созданием небольшого мультимедиа-приложения, в качестве средства реализации использовать среду Delphi. В процессе работы над мультимедиа-проектом учеников познакомят с некоторыми возможностями Delphi, например с теми, которые представлены в этой статье. В данном случае инструмент будет изучаться в контексте решения конкретной задачи. Советуем двигаться именно вторым путем. Важно, чтобы тема проекта была интересна школьникам. Тогда их работа будет более мотивирована, а значит и более успешна. Такой подход к освоению приемов программирования не должен быть нацелен на изучение отдельных деталей среды Delphi. Важно, чтобы школьники уловили общий вектор технологической идеи. И если акценты в работе направлены на постижение сути визуального программирования, то они не будут испытывать растерянность в случае изменения интерфейса в новых версиях этого продукта. Завершая рассказ о Delphi, коснемся вопросов материального характера. Delphi не является пока свободно распространяемым продуктом. Но для учебных целей не обязательно приобретать полную версию, можно ограничиться более скромными конфигурациями. Кроме того, учебные заведения пользуются серьезными скидками, и поэтому покупка Delphi для школы становится вполне реальным делом.

Рекомендуемая литература

1. Том Сван. Программирование в Delphi для Windows 95. — К.: Диалектика, 1996.
2. Нейл Дж. Рубенкинг. Delphi 3 для "чайников". — К.: Диалектика, 1997.
3. Том Сван. Delphi 4. Библия разработчика — К.; М.; СПб.: Диалектика, 1998.

КОРОТКО ОБ АВТОРЕ:
Полилова Татьяна Алексеевна – доцент кафедры информатизации МИПКРО, polilova@glasnet.ru.