Шрифт:
Рис. 5.3. Интерфейс проигрывателя
Начнем рассмотрение исходного текста приложения. В программе присутствует секция констант с единственной константой, необходимой для задания расстояния (положения указателя воспроизведения в файле), на которое будет осуществляться перемотка. В данном случае перемотка будет осуществляться на 10 секунд:
const
//Константа для перемотки на 10 000 миллисекунд
perem=10000;
Далее необходимо создать функцию, которая преобразует численные значения времени (миллисекунды) в более удобный для вывода строковый вариант с указанием минут и секунд (листинг 5.6).
Листинг 5.6.
Функция преобразования времени
function TSoundPlayerForm.FileLangToStr(leng: longint): string;
var
//Переменная результирующей строки
strTime: string;
sec: longint;
min: longint;
begin
//Получаем секунды и минуты из миллисекунд (leng)
sec := trunc(leng/1000);
min := trunc(sec/60);
sec := sec – min*60;
strTime := IntToStr(min);
//Если секунд меньше десяти, то преобразуем результирущую
//строку (участок минут), добавляя \'0\' спереди
if sec < 10 then strTime := strTime + \':0\' + IntToStr(sec)
else strTime := strTime + \':\' + IntToStr(sec);
FileLangToStr := strTime;
end;
Находим количество секунд, затем минут, преобразуем эти данные в строковый вид (для вывода на индикатор времени). Если после нахождения количества минут секунд оказалось меньше десяти, то добавляем 0 в результирующую строку. К примеру, мы получили, что композиция занимает три минуты и пять секунд. В этом случае строка должна выглядеть как 3:05, а не 3:5.
Процедуру создания корректного формата времени мы разобрали. Теперь необходимо выяснить, как можно узнать время, которое прошло с момента начала воспроизведения файла. Для этого обратимся к свойствам компонента MediaPlayer, а именно к Length (длина загруженного файла) и Position (текущая позиция в нем). Зная позицию, можно при помощи ранее рассмотренной функции FileLangToStr найти время воспроизведения (листинг 5.7).
Листинг 5.7.
Процедура вывода или обновления индикаторов
procedure TSoundPlayerForm.UpdateViewTime;
var
//Длина файла и позиция в файле
leng, posit: longint;
begin
//Находим длину воспроизводимого файла
leng := mdpSoundPlayer.Length;
//Находим позицию в воспроизводимом файле
posit := mdpSoundPlayer.Position;
//Преобразуем время в строку
lbMainTime.Caption := FileLangToStr(posit);
//Устанавливаем имя файла
lbFileName.Caption := mdpSoundPlayer.FileName;
end;
Как можно заметить из листинга 5.7, после получения позиции в файле и его имени данные о времени воспроизведения и путь к файлу попадают на индикаторы lbMainTime и lbFileName соответственно.
Открытие и загрузка файла в мультимедийный компонент происходит при выполнении кода из листинга 5.8. Кроме того, обработчик вызывает известную нам процедуру UpdateViewTime и включает таймер (tmTimer. Enabled:= true).
Листинг 5.8.
Открытие файла
procedure TSoundPlayerForm.bnOpenFileClick(Sender: TObject);
begin
if opdOpenDialog.Execute=true then
begin
//Открываем файл
mdpSoundPlayer.FileName := opdOpenDialog.FileName;
mdpSoundPlayer.Open;
//Устанавливаем значения в индикаторах
UpdateViewTime;
//Включаем таймер
tmTimer.Enabled := true;
end;
end;
Процедура обработки срабатывания таймера заключается в вызове функции обновления значений индикаторов (UpdateViewTime) (листинги 5.9 и 5.10).
Листинг 5.9.
Событие таймера
procedure TSoundPlayerForm.tmTimerTimer(Sender: TObject);
begin
//Обновление значений экрана
UpdateViewTime;
end;
Листинг 5.10.
Обработчик активизации формы
procedure TSoundPlayerForm.FormActivate(Sender: TObject);
begin
//Временное выключение таймера
tmTimer.Enabled := false;
//Задание значений
lbMainTime.Caption := \'00:00\
lbFileName.Caption := \'no file…\
// Установка фильтров для диалога
opdOpenDialog.Filter :=
\'MP3 music (*.mp3)|*.MP3|Wav files (*.wav)|*.WAV\
end;
Перемотка осуществляется при помощи двух кнопок. Для перемотки вперед на десять секунд необходимо нажать», назад – «(листинги 5.11 и 5.12).
Листинг 5.11.
Перемотка вперед
procedure TSoundPlayerForm.bnNextStClick(Sender: TObject);
begin
if mpCanPlay in mdpSoundPlayer.Capabilities then
begin
if (mdpSoundPlayer.Position+perem)<=mdpSoundPlayer.Length then
mdpSoundPlayer.Position := mdpSoundPlayer.Position + perem
else
mdpSoundPlayer.Position := mdpSoundPlayer.Length;
mdpSoundPlayer.Play;
end;
end;