Программа должна обеспечивать возможность выбора каталога, в котором находятся МРЗ-файлы, а также регулировку громкости звука непосредственно в диалоговом окне программы. Для отображения списка МРЗ-файлов используйте компонент ListBox, а для управления медиаплеером — кнопки SpeedButton. Рекомендуемый вид фор мы программы приведен на рис. 1.50.

( МРЗ Player с регулятором громкости.
(с) Культин Н.Б., 2003. I
unit mp3p_;
interface

Рис. 1.50. Форма программы МРЗ Player

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, Buttons,
ExtCtrls, MPlayer, ComCtrls,
MMSYSTEM, FileCtrl; // эти ссылки вставлены вручную
type
TForml = class(TForm)
// кнопки
SpeedButtonl: TSpeedButton; // Предыдущая композиция
SpeedButton2: TSpeedButton; // Воспроизведение/Стоп
SpeedButton3: TSpeedButton; // Следующая композиция
SpeedButton4: TSpeedButton; // Выбор папки
ListBoxl: TListBox; // Список композиций (МРЗ-файлов)
MediaPlayerl: TfylediaPlayer; // медиаплеер
TrackBarl: TTrackBar; // регулятор громкости
Timerl: TTimer;
Label1: TLabel;
Label2: TLabel;
Shapel: TShape; // рамка вокруг кнопок
procedure FormCreate(Sender: TObject);
procedure ListBoxlClick(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
procedure SpeedButtonlClick(Sender: TObject);
procedure SpeedButton3Click(Sender: TObject);
procedure TrackBarlChange(Sender: TObject);
procedure TimerlTimer(Sender: TObject);
procedure SpeedButton4Click(Sender: TObject);
// эти объявления вставлены сюда вручную
procedure Play; // воспроизведение
procedure PlayList(Path: string); // формирует список
// МРЗ-файлов
private
( Private declarations }
public
/ Public declarations }
end;
var
Forml: TForml;
implementation
($R *.dfm}
var
SoundPath: string[255];
min,sec: integer; // время воспроизведения
volume: LongWord; // старшее слово — правый канал,
// младшее — левый.
// формирует список МРЗ-файлов
procedure TForml.PlayList(Path: string);
var
lpBuf: PChar; // указатель на nul-terminated-строку
sWinDir: string[128]; // обычная Паскаль-строка
SearchRec: TSearchRec; // структура SearchRec содержит
// информацию о файле, удовлетворяющем
// условию поиска
begin
ListBoxl.Clear;
// сформировать список МРЗ-файлов
if FindFirst(Path + '*.mp3', faAnyFile, SearchRec) = 0 then
begin
// в каталоге есть файл с расширением wav
// добавим имя этого файла в список
ListBoxl.Items.Add(SearchRec.Name);
// пока в каталоге есть другие файлы с расширением wav
while (FindNext(SearchRec) = 0) do
ListBoxl.Iterns.Add(SearchRec.Name);
end;
ListBoxl.Itemlndex := 0;
end;
procedure TForml.FormCreate(Sender: TObject);
begin
PlayList I") I
ListBoxl.Itemlndex := 0;
Labell.Caption:=ListBoxl.Items[ListBoxl.itemlndex];
TrackBarl.Position := 7;
// старшее слово переменной volume — правый канал,
// младшее — левый
volume := (TrackBarl.Position - TrackBarl.Max+1)* 6500;
volume := volume + (volume shl 16);
waveOutSetVolume(WAVE_MAPPER,volume) ; // уровень сигнала
end;
// щелчок на названии произведения
procedure TForml.ListBoxlClickfSender: TObject);
begin
// вывести в поле метки Labell имя выбранного файла
if not SpeedButton2.Down
then SpeedButton2.Down := True;
Labell.Caption:=ListBoxl.Items[ListBoxl.itemlndex];
Play;
end;
// щелчок на кнопке Воспроизведение
procedure TForml.SpeedButton2Click(Sender: TObject);
begin
if SpeedButton2.Down then
// пользователь нажал кнопку
// начать воспроизведение
Play
else
// если кнопка Воспроизведение нажата,
// то повторное нажатие останавливает
// воспроизведение
begin
MediaPlayerl.Stop;
Timerl.Enabled :'= False;
SpeedButton2.Down := False;
SPeedButton2.Hint := 'Play';
end;
end;
// кнопка К предыдущей
procedure TForral.SpeedButtonlClick(Sender: TObject);
begin
if ListBoxl.Itemlndex > 0 then
ListBoxl.Itemlndex := ListBoxl.Itemlndex — 1;
Play;
end;
// кнопка К следующей "
procedure TForml.SpeedButton3Click(Sender: TObject);
begin
if ListBoxl.Itemlndex < ListBoxl.Count then
ListBoxl.Itemlndex := ListBoxl.Itemlndex + 1;
Play;
end;
// пользователь изменил положение
// регулятора громкости
procedure TForml.TrackBarlChange(Sender: TObject);
begin
volume := 6500* (TrackBarl.Max — TrackBarl.Position);
volume := volume + (volume shl 16);
waveOutSetVolume(WAVE_MAPPER,volume);
end;
// воспроизвести композицию,
// название которой выделено
// в списке ListBoxl
procedure TForml.Play;
begin
Timerl.Enabled := False;
Label1.Caption:=ListBoxl.Items[ListBoxl.itemlndex];
MediaPlayerl.FileName := SoundPath +
ListBoxl.Items[ListBoxl.itemlndex];
try
Mediaplayerl.Open;
except
on EMCIDeviceError do
begin
ShowMessage('Ошибка обращения к файлу '+
ListBoxl.Items[ListBoxl.itemlndex]);
SpeedButton2.Down := False;
exit;
end;
end;
MediaPlayerl.Play;
min :=0;
sec :=0;
Timerl.Enabled := True;
SpeedButton2.Hint := 'Stop';
end;
// сигнал от таймера
procedure TForml.TimerlTimer(Sender: TObject);
begin
// изменить счетчик времени
if sec < 59
then inc(sec)
else begin
sec :=0;
inc(min);
end;
// вывести время воспроизведения
Label2.Caption := IntToStr(min)+':';
if sec < 10
then Label2.Caption :=
Label2.Caption +'0'+ IntToStr(sec)
else Label2.Caption :=
Label2.Caption + IntToStr(sec);
// если воспроизведение текущей композиции
// не завершено
if MediaPlayerl.Position < MediaPlayerl.Length
then exit;
// воспроизведение текущей композиции
// закончено
Timerl.Enabled := False; // остановить таймер
MediaPlayerl.Stop; // остановить плеер
if ListBoxl.Itemlndex < ListBoxl.Count // список не исчерпан
then begin
ListBoxl.Itemlndex := ListBoxl.Itemlndex + 1;
Play;
end
end;
// щелчок на кнопке Папка
// выбрать папку, в которой находятся МРЗ-файлы
procedure TForml.SpeedButton4Click(Sender: TObject);
var
Root: string; // корневой каталог
pwRoot : PWideChar;
Dir: string;
begin
Root := ''; // корневой каталог — папка Рабочий стол
GetMem(pwRoot, (Length(Root)+1) * 2) ;
pwRoot := StringToWideChar(Root,pwRoot,MAX_PATH*2);
if not SelectDirectory('Выберите папку1, pwRoot, Dir)
then Dir :=''
else Dir := Dir+'V;
// каталог, в котором находятся МРЗ-файлы выбран
SoundPath := Dir;
PlayList(SoundPath);
end;
end.