Таблица 6. Назначение кнопок компонента MediaPlayer
Кнопка | Действие |
Play | Воспроизведение | |
Pause | Пауза воспроизведения или записи. Если медиаплеер в момент щелчка уже в состоянии паузы, то воспроизведение или запись возобновляются | |
Stop | Остановка воспроизведения или записи | |
Next | Переход на следующий трек или в конец | |
Prev | Переход на предыдущий трек или в начало | |
Step | Перемещение вперед на заданное число кадров |
Back | Перемещение назад на заданное число кадров |
Record | Начало записи |
Eject | Освобождение объекта, загруженного в устройство |
Воспроизведение видеоинформации по умолчанию производится
в окно, которое создает само открытое устройство мультимедиа.
В компоненте MediaPlayer определены события OnClick и OnNotify. Первое из них происходит при выборе пользователем одной из кнопок медиаплеера. Второе — OnNotify — происходит после возвращения очередного метода, если свойство медиаплеера Notify было установлено
в true. Способ возврата любого метода медиаплеера определяется свойством Wait. Если установить Wait равным false, то возвращение управления в приложение происходит сразу после вызова метода, не дожидаясь завершения его выполнения. Таким образом, задав Notify равным true
и Wait равным false, можно обеспечить немедленный возврат в приложение и отображения пользователю текущего состояния объекта мультимедиа.
Свойства Notify и Wait действуют только на один очередной метод, поэтому их значения надо каждый раз восстанавливать в обработчиках событий OnClick или OnNotify.
Пример 3
Создадим проект, который позволяет проигрывать мультимедийные файлы. Начните новый проект и перенесите на форму компоненты MediaPlayer, Button и OpenDialog.
В фильтре компонента OpenDialog можно задать, например, имена фильтров и сами фильтры, как показано на рисунке 32.
Рисунок 32
Обработчик нажатия на кнопку может содержать операторы
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute() then
MediaPlayer1.FileName:= OpenDialog1.FileName;
MediaPlayer1.Open;
end;
В данной процедуре открывается устройство мультимедиа, соответствующее выбранному пользователем файлу. При этом надо проследить, чтобы в компоненте MediaPlayer свойство DeviceType равнялось dtAutoSelect. Это обеспечит автоматический выбор соответствующего устройства мультимедиа, исходя из расширения выбранного файла.
В компоненте MediaPlayer при желании можно указать имя файла FileName, открываемого в момент начала выполнения приложения. Тогда надо установить свойство AutoOpen в true.
С помощью данного приложения вы можете слушать музыку, смотреть немые и звуковые клипы, т. е. наслаждаться всеми прелестями мультимедиа, если, конечно, они уже есть в вашем компьютере.
Задания:
1. Проверьте все примеры из лабораторной работы.
2. Создайте программу, в которой непрерывно прослушивается один и тот же звуковой файл во все время работы приложения.
3. Создайте приложение, которое позволяет запускать видеоклипы, посредством компонента Animate.
Лабораторная работа 10. Исключительные ситуации
Цель: изучить класс Exception и возможности при обработке ошибок.
Класс Exception является прямым потомком базового класса TObject. Вместе со своими потомками он предназначен для обработки исключительных ситуация (исключений), возникающих при некорректных действиях программы: например, в случае деления на 0, при попытке открыть несуществующий файл, при выходе за пределы выделенной области динамической памяти и т. п. Рассматриваются основные свойства исключений и их использование для повышения надежности программ.
При работе в среде Delphi эксперименты с исключениями плохо прослеживаются, т. к. при каждом исключении среда перехватывает управление программой. В этом случае бывает полезно отменить такое поведение среды. Для этого вызовете опцию Tools, Debugger Options и на странице Language Exceptions уберите флажок в переключателе Stop on Delphi Exceptions.
Для обработки исключений в Object Pascal предусмотрен механизм защищенного блока, который может записываться в двух различных видах. Первый имеет следующий вид:
try
<операторы>
except
<обработчики исключений>
else <операторы>
end;
Второй определяется в виде
try
<операторы>
finally
<операторы>
end;
Защищенный блок начинается зарезервированным словом try (попытаться [выполнить]) и завершается словом end. Существуют два типа защищенных блоков — except (исключить) и finally (в завершение), отличающихся способом обработки исключения. В блоке except порядок
выполнения операторов таков: сначала выполняются операторы секции try... except; если операторы выполнены без возникновения исключительной ситуации, работа защищенного блока на этом прекращается и управление получает оператор, стоящий за end; если при выполнении части try возникло исключение, управление получает соответствующий обработчик в секции except, а если таковой не найден — первый из операторов, стоящих за словом else.
В блоке finally операторы в секции finally...end получают управление всегда, независимо оттого, возникло ли исключение в секции try...finally или нет. Если исключение возникло, все операторы в секции try...finally, стоящие за «виновником» исключения, пропускаются и управление получает первый оператор секции finally...end. Если исключения не было, этот оператор получает управление после выполнения последнего оператора секции try...finally.
Обработчики исключений в блоке except имеют такой синтаксис:
on < класс исключения> do <оператор>;
Здесь on, do — зарезервированные слова; <класс исключения> — класс обработки исключения; <оператор> — любой оператор Object Pascal.
Обратите внимание: имя класса служит своеобразным ключом выбора, а собственно обработка осуществляется оператором, стоящим за do (этот оператор может быть составным, так что обработка исключения может занимать произвольное количество операторов Object Pascal).
Поиск нужного обработчика осуществляется с начала списка вниз до тех пор, пока не встретится класс, способный обрабатывать исключение данного типа. Если подходящего класса не обнаружено, управление передается операторам, стоящим за словом else, а если таковых нет, то выполняется умалчиваемая обработка исключения.
Если важен лишь факт возникновения исключительной ситуации
и несущественен тип связанной с ним ошибки, можно оставлять только необходимый код реакции на любую ошибку.
try
………..
except
ShowMessage(‘Ошибка’);
………………
end;
Защищенные блоки могут вкладываться друг в друга на неограниченную глубину и встречаться в блоке обработки исключительной ситуации.
Класс Exception является родительским для всех классов исключений. У этого класса имеется множество дочерних классов, каждый из которых отвечает за конкретное исключение. При возникновении исключительной ситуации объекты классов обработчиков создаются и уничтожаются автоматически. Таких классов очень много, поэтому рассмотрим только некоторые:
EAbort — обработка любой исключительной ситуации;
EIntError — любая ошибка в целочисленных вычислениях, среди
которых отметим такие: EDivByError — деление на 0, EintOverload — переполнение;
EMatcError — любая ошибка при выполнении вычислений с плавающей запятой, среди которых: EZeroDivide — вещественное деление на 0; EOverflow — переполнение; EInfalidArgument — аргумент функции вне допустимого диапазона;
EArrayError — ошибка при работе с массивами;
EConvertError— ошибка в функциях StrToInt и StrToFloat;
EFOpenError — ошибка при открытии файла;
EInOutError — любая ошибка в файловых операциях;
EInvalidGridOperator — любая ошибка при работе с таблицами;
EInvalidGraphOperator — недопустимая графическая операция.
Рассмотрим еще некоторые исключительные ситуации, которые будут работать с объектами, рассматриваемыми в следующих лабораторных работах: EStrimError — произвольная ошибка при работе с потоками данных, EThread — ситуация борьбы за общий ресурс в программе с несколькими потоками событий, EDatabaseError — ошибка при работе с базами данных.
Пример 1
Необходимо заполнить таблицу числа по следующему правилу: генерируется случайное число, а затем в ячейке компонента StringGrid1 сохраняется обратное значение. Заранее не известно, был ли сгенерирован 0, и будет ли допустима операция деления. Для корректной работы данной программы необходимо задавать защищенный блок; процедура формирования таблицы будет иметь вид:
procedure TForm1.Button1Click(Sender: TObject);
var i,j:Integer;
a:real;