Мультимедиа
Приступая к решению задач этого раздела, необходимо вспомнить:
- Работу с анимацией и звуком обеспечивают компоненты Animate И MediaPlayer.
- Компонент Animate позволяет воспроизвести только про стую, не сопровождаемую
звуком анимацию.
- Компонент MediaPlayer позволяет воспроизводить звук, анимацию и видео.
42. Напишите программу, в главном окне которой, сразу после появления
окна, воспроизводится не сопровождаемая звуком анимация, например рекламный
ролик. Анимация должна вос производиться один раз. На рис. 1.42 приведена
форма программы.
procedure TForml.FormCreate(Sender: TObject);
begin
try
Animatel.FileName := 'Delphi.avi';
Animatel.Play(0,Animate1.FrameCount,1);
except
on Exception do begin
Labell.Caption :=
'Ошибка доступа к файлу ' +
Animatel.FileName +
'. Файл не найден или анимация1 +
'сопровождается звуком.'
exp-
end;
end;
end;
// щелчок на кнопке Ok
procedure TForml.BitBtnlClick(Sender: TObject);
begin
Forml.Close;
end;
Рис. 1.42. Форма программы Анимация
43. Напишите программу, в диалоговом окне которой в резуль тате щелчка
на командной кнопке выводится сопровождаемая звуком анимация — содержимое
AVI-файла. Рекомендуемый вид формы приведен на рис. 1.43.
Рис. 1.43. Компонент Panel 1 используется в качестве экрана
для отображения анимации
{ Отображение сопровождаемой звуком анимации
при помощи компонента MediaPlayer )unit UsMP_;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, MPlayer, StdCtrls, ExtCtrls;type
TForml = class(TForm)
MediaPlayerl; TMediaPlayer; // универсальный проигрыватель
Panell: TPanel; // панель, на которую выводится анимация
Buttonl: TButton; // кнопка Ok Labell: TLabel; procedure ButtonlClick(Sender:
TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations j
public
/ Public declarations }
end;var
Forml: TForml;implementation{$R *.DFM}I
Во время создания формы надо настроить
компонент MediaPlayerl:
MediaPlayerl.Display = Panell
MediaPlayerl.Filename = delphi_s.avi — имя файла
MediaPlayerl .AutoOpen » True
MediaPlayerl .Visible - False
// щелчок на кнопке OK
procedure TForml.ButtonlClick(Sender: TObject);
begin
MediaPlayerl.Play; // воспроизведение анимации
end;procedure TForml.FormCreate(Sender: TObject);
begin
l Размер области отображения анимации
должен соответствовать размеру анимации.
Размер анимации в файле delphi_s.avi
60x60 } // зададим размер области вывода анимации
MediaPlayerl.DisplayRect:=Rect(0,0,60,60);
end;end.
44. Напишите программу, используя которую можно просмат ривать анимацию
(содержимое AVI-файла) в реальном масштабе времени или по кадрам (рис.
1.44). Для отображения анимации используйте компонент Animate. Обратите
внимание, что этот компонент работает только с AVI-файлами, в которых
нет звука (для отображения анимации, сопровождаемой звуком, использу ется
компонент MediaPiayer). Для выбора файла анимации ис пользуйте стандартное
диалоговое окно Открытие файла. Реко мендуемый вид окна программы приведен
на рис. 1.45.
{ Просмотр анимации — содержимого AVI-файла.
(с) Культин Н. Б., 2003. **** ВНИМАНИЕ! **** Компонент Animate отображает
AVI-файлы,
в которых нет звука! При попытке открыть
файл, в котором находится сопровождаемая
звуком анимация, возникает ошибка. )unit ShowAVI_;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls;
Рис. 1.44. Окно программы Просмотр анимации
Рис. 1.45. Форма программы Просмотр анимации
type
TForml = class(TForm)
Animatel: TAniraate; // компонент Animate
Buttonl: TButton; //Пуск-Стоп
Button2: TButton; // следующий кадр
Button3: TButton; // предыдущий кадр
// режим просмотра
RadioButtonl: TRadioButton; // просмотр всей анимации
RadioButton2: TRadioButton; //покадровый OpenDialogl: TOpenDialog; //
диалоговое окно Открытие файла
Button4: TButton; // активизация окна Открытие файла
GroupBoxl: TGroupBox;
Labell: TLabel;
Editl: TEdit;
procedure ButtonlClick(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure RadioButtonlClick(Sender: TObject);
procedure RadioButton2Click(Sender: TObject);
procedure EditlKeyPress(Sender: TObject; var Key: Char);
procedure Button4Click(Sender: TObject);
// это объявленрге вставлено сюда вручную
procedure OpenAVI;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Forml: TForml; // форма
CFrame: integer; // номер кадра, отображаемого
// в режиме покадрового просмотра
implementation
($R *.DFM)
// нажатие клавиши в поле Файл
procedure TForml.EditlKeyPress(Sender: TObject; var Key: Char);
begin
if (Key = #13) and (Length(Editl.Text) о 0) then
OpenAVI;
end;
// Щелчок на кнопке Выбрать
// открывает стандартное диалоговое
// окно Открытие файла
procedure TForml.Button4Click(Sender: TObject);
begin
OpenDialogl.Title := 'Выбрать AVI-файл1;
if OpenDialogl.Execute then
begin
Editl.Text := OpenDialogl.FileName;
OpenAVI;
end;
end;
// пуск и остановка просмотра анимации
procedure TForml.ButtonlClick(Sender: TObject);
begin
if Animate1.Active = False // в данный момент анимация
// не выводится
then begin
Animatel.StartFrame:=l; // вывод с первого кадра
Animatel.StopFrame:=Animatel.FrameCount; // по последний
// кадр
Animatel.Active:=True;
Buttonl.caption:='Стоп';
RadioButton2.Enabled:=False;
end
else // анимация отображается
begin
Animatel.Active:=False; // остановить отображение
Buttonl.caption:='Пуск';
RadioButton2.Enabled:=True;
end;
end;
// активизация режима просмотра всей анимации
procedure TForml.RadioButtonlClick(Sender: TObject);
begin
Buttonl.Enabled:=True; // доступна кнопка Пуск
// сделать недоступными кнопки покадрового просмотра
Forml.Button3.Enabled:=False;
Forml.Button2.Enabled:=False;
end;
// активизация режима покадрового просмотра
procedure TForml.RadioButton2Click(Sender: TObject);
begin
Button2.Enabled:=True; // кнопка Следующий кадр доступна
Button3.Enabled:=False; // кнопка Предыдущий кадр
недоступна
// сделать недоступной кнопку Пуск — вывод всей анимации
Buttonl.Enabled:=False;
Animatel.StartFrame:=1;
CFrame:=1;
end;
// переход к следующему кадру
procedure TForml.Button2Click(Sender: TObject);
begin
if CFrame < Animatel.FrameCount then
begin
CFrame := CFrame + 1;
// вывести кадр
Animatel.StartFrame := CFrame;
Animatel.StopFrame := CFrame;
Animatel.Active := True;
if CFrame = Animatel.FrameCount // текущий кадр —
// последний
then Button2.Enabled:=False;
end;
if CFrame > 1 then Button3.Enabled := True;
end;
// переход к предыдущему кадру
procedure TForml.Button3Click(Sender: TObject);
begin
if CFrame > 1 then
begin
CFrame := CFrame — 1;
// вывести кадр
Aniraatel.StartFrame := CFrame;
Aniraatel.StopFrame := CFrame;
Animatel.Active := True;
if СFrame = 1 // текущий кадр — первый
then Forml.Button3.Enabled := False;
end;
if CFrame < Animate1.FrameCount
then Button2.Enabled := True;
end;
// открывает AVI-файл
procedure TForml.OpenAVI;
begin
Buttonl.Enabled := False;
Button2.Enabled := False;
Button3.Enabled := False;
RadioButtonl.Enabled := False;
RadioButton2.Enabled := False;
try
Animatel.FileName := Edit1.Text;
except
on Exception do
begin
MessageDlg('Ошибка формата АУ1-файла.'+
#13+'(Анимация не должна сопровождаться звуком.)',
mtError,[mbOk],0);
exit;
end;
end;
Buttonl.Enabled := True;
// Button2.Enabled := True;
// Button3.Enabled := True;
RadioButtonl.Enabled := True;
RadioButton2.Enabled := True;
end;
end.
45. Напишите программу, используя которую можно прослу шать звуковые
файлы Windows. Рекомендуемый вид диалогового окна программы приведен на
рис. 1.46.
Рис. 1.46. Окно программы Звуки Windows
unit WinSound_;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, MPlayer, ExtCtrls;
type
TForml = class(TForm)
MediaPlayerl: TMediaPlayer;
ListBoxl: TListBox; // список WAV-файлов
Label2: TLabel;
Label1: TLabel; // выбранный из списка файл
procedure ListBoxlClick(Sender: TObject);
procedure MediaPlayerlClick(Sender: TObject; Button: TMPBtnType;
var DoDefault: Boolean);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
( Public declarations }
end;
var
Forml: TForml;
implementation
{$R *.D™}
var
SOUNDPATH: string[80];
{ Определяет каталог Windows и формирует
список WAV-файлов, находящихся в
подкаталоге Media }
procedure TForml.FormCreate(Sender: TObject);
var
lpBuf: PChar; // указатель на nul-terminated-строку
sWinDir: string[128]; // обычная Паскаль-строка
SearchRec: TSearchRec; // структура SearchRec содержит
// информацию о файле, удовлетворяющем условию поиска
begin
// определить положение каталога Media
GetMera(lpBuf,MAX_PATH); // выделить память для строки
GetWindowsDirectory (lpBuf ,МАХ_РАТН) ; // получить каталог Windows
sWinDir:=lpbuf; // скопировать nt-строку в р-строку
SOUNDPATH:=sWinDir+'\Media\'; // вывести результат
FreeMem(lpBuf); // освободить память
// сформировать список WAV-файлов
if FindFirst(SOUNDPATH+'*.wav', faAnyFile, SearchRec) =0 then
begin
// в каталоге есть файл с расширением wav
// добавим имя этого файла в список
Forml.ListBoxl.Items.Add(SearchRec.Name);
// пока в каталоге есть другие файлы с расширением wav
while (FindNext(SearchRec) = 0) do
Forml.ListBoxl.Items.Add(SearchRec.Name);
end;
end;
// щелчок на элементе списка
procedure TForml.ListBoxlClick(Sender: TObject);
begin
// вывести в поле метки Label2 имя выбранного файла
Label2.Caption:=ListBoxl.Items[ListBoxl.itemlndex];
end;
// щелчок на кнопке компонента MediaPlayer
procedure TForml.MediaPlayerlClick(Sender: TObject;
Button: TMPBtnType;
var DoDefault: Boolean);
begin
if (Button = btPlay) and (Label2.Caption О ••) then
begin
// нажата кнопка Play
with MediaPlayerl do
begin
FileName:=S0UNDPATH+Label2.Caption; // имя выбранного
// файла
Open;
// Wait:- True;
end;
end;
end;
end.
46. Напишите программу, используя которую можно просмот реть видеоклип.
Клип должен воспроизводиться в диалоговом окне профаммы. Для выбора клипа
(AVI-файла) используйте стандартное диалоговое окно Открытие файла. Рекомендуемый
вид формы профаммы приведен на рис. 1.47.
( Видео (AVI) Плеер
(с) Культин Н.Б., 2003}
unit Vp_;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, ExtCtrls, MPlayer, Buttons,
StdCtrls;
Рис. 1.47. Форма программы Video Player
type
TForml = class(TForm)
OpenDialog: TOpenDialog;
SpeedButtonl: TSpeedButton;
SpeedButton2: TSpeedButton;
MediaPlayer: TMediaPlayer;
procedure FormCreate(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
procedure SpeedButtonlClick(Sender: TObject);
procedure MediaPlayerNotifу(Sender: TObject);
private
{ Private declarations I
public
I Public declarations I
end;
var
Forml: TForml;
implementation
{$R +.dfm}
procedure TForml.FormCreate(Sender: TObject);
begin
MediaPlayer.Display := Forml;
// это можно сделать во время создания
// формы. Но на всякий случай ...
SpeedButtonl.Grouplndex := 1;
SpeedButtonl.AllowAllUp := True;
end;
// возвращает размер изображения AVI-файла
procedure DimAviff: string; var w,h: integer);
var
fst: TFileStream;
// структуру заголовка AVI-файла можно
// найти, например, в ..\CBuilder\Include\aviriff.h
header: record
RIFF: array[1..4] of char; // 'RIFF'
nul: array[1..5] of Longlnt; // не используется
AVIH: array[1..4] of char; // 'avih'
nu2: array[1..9] of Longlnt; // не используется
Width: Longlnt;
Height: Longlnt;
end;
begin
fst := TFileStream.Create(f,fmOpenRead);
fst.Read(header,sizeof(header));
w := header.Width;
h := header.Height;
fst.Destroy;
end;
// щелчок на кнопке Eject — выбор файла
procedure TForml.SpeedButton2Click(Sender: TObject);
var
top,left: integer; // левый верхний угол "экрана"
width,height: integer; // размер экрана
mw,mh: integer; // максимально возможный размер экрана
kh,kw: real; // коэф-ты масштабирования по h и w
к; real; // коэф-т масштабирования
begin
OpenDialog.Title := 'Выбор клипа';
if not OpenDialog.Execute
then exit;
// пользователь выбрал файл
//' определим размер 'и положение
// "экрана" (области на поверхности формы),
// на котором будет выведен клип
DirnAvi (OpenDialog.FileName,width,height) ;
mh:=SpeedButtonl.Top - 10;
mw:=Forml.ClientWidth;
if mh > height
then kh :=1
else kh := mh/height;
if mw > width
then kw :=1
else kw := mw/width;
if kw < kh
then k := kw
else k := kh;
// здесь масштаб определен
width := Round(width * k) ;
height := Round(height * k);
left := (Forml.ClientWidth - width) div 2;
top := 10;
MediaPlayer.FileName := OpenDialog.FileName;
MediaPlayer.Open;
MediaPlayer.DisplayRect := Rect(left,top,width,height);
SpeedButtonl.Enabled := True;
end;
// щелчок на кнопке Play/Stop
procedure TForml.SpeedButtonlClick(Sender: TObject);
begin
if SpeedButtonl.Down then
begin
// начать воспроизведение
MediaPlayer.Play;
SpeedButtonl.Hint := 'Stop';
end
else begin
// остановить воспроизведение
MediaPlayer.Stop;
SpeedButtonl.Hint := 'Play';
end;
end;
// сигнал от плеера
procedure TForml.MediaPlayerNotifу(Sender: TObject);
begin
if (MediaPlayer.Mode = mpStopped)
and SpeedButtonl.Down
then
SpeedButtonl.Down := False; // "отжать" кнопку Play
end; end.
47. Напишите программу, используя которую можно прослу шать компакт-диск.
Во время воспроизведения в диалоговом окне должен отображаться номер воспроизводимого
трека и время воспроизведения. Рекомендуемый вид формы и окно про граммы
приведены на рис. 1.48.
j { Проигрыватель Audio CD.
(с) Культин Н.Б., 2003 )
unit CDp_;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, Buttons, MPlayer,
ExtCtrls, MMSYSTEM;
type
TForml = class(TForm)
MediaPlayer: TMediaPlayer;
Рис. 1.48. Форма и окно программы CD Player
Timerl: TTimer;
BitBtnl: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
Labell: TLabel; *
Label2: TLabel;
Image1: TImage;
procedure FormActivate (Sender: TObject);
procedure MediaPlayerNotifу(Sender: TObject);
procedure BitBtnlClick(Sender: TObject);
procedure TimerlTimer(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure BitBtn3Click(Sender: TObject);
private
I Private declarations }
public
I Public declarations }
end;
var
Forml: TForml;
implementation
{$R *.dfm}
var
Track: integer; // воспроизводимый трек
// начало работы программы
procedure TForml.FormActivate(Sender: TObject);
begin
MediaPlayer.Open;
{ Проверить, есть в CD-ROM Audio CD.
Если в дисководе есть диск, то свойство
Mode = mpStopped. Если диска нет
или дисковод открыт, то Mode = mpOpened.
Тип диска можно определить по количеству
треков. Если диск — CD-ROM, то на нем один
трек, на аудиодиске — кол-во треков больше 1 }
if (MediaPlayer.Mode = mpStopped) and
(MediaPlayer.Tracks > 1) then
begin
BitBtnl.Enabled := True;
MediaPlayer.Notify := True;
end
else Timer1.Enabled := True;
end;
// сигнал от MediaPlayer
procedure TForml.MediaPlayerNotify(Sender: TObject),
begin
case MediaPlayer.Mode of
mpOpened: // пользователь открыл дисковод
begin
BitBtnl.Enabled := False;
BitBtnl.Caption := 'Play';
BitBtnl.Tag := 0;
BitBtn2.Enabled := False;
BitBtn3.Enabled := False;
Timerl.Enabled := True;
Label2.Caption := '00:00';
end;
end;
MediaPlayer.Notify := True;
end;
// щелчок на кнопке Play/Stop
procedure TForml.BitBtnlClick(Sender: TObject);
begin
if BitBtnl.Tag = 0
then // щелчок на кнопке Play
begin
BitBtnl.Caption := 'Stop';
BitBtn3.Enabled := True;
MediaPlayer.Notify := False;
MediaPlayer.Play;
Timerl.Enabled :=True;
BitBtnl.Tag := 1;
Track := MCI_TMSF_TRACK(MediaPlayer.Position);
end
else
begin // щелчок на кнопке Stop
BitBtnl.Caption := 'Play';
BitBtn3.Enabled := True;
MediaPlayer.Notify := True;
MediaPlayer.Stop;
Timerl.Enabled := False; •
BitBtnl.Tag := 0;
end;
end;
// сигнал от таймера: вывести номер трека
// и время воспроизведения
procedure TForml.TimerlTimer(Sender: TObject);
var
trk, // трек
min, sec: byte; // время
begin
if MediaPlayer.Mode = mpPlaying then
// режим воспроизведения
begin
trk := MCI_TMSF_TRACK(MediaPlayer.Position);
min := MCI_TMSF_MINUTE(MediaPlayer.Position) ;
sec := MCI_TMSF_SECOND(MediaPlayer.Position) ;
Labe11.Capt ion : =
Format('Track %d.',[trk]);
Label2.Caption :=
Format('%d:%.2d',[min,sec]);
if trk <> Track then
begin
Track := trk;
if Track = 2
then BitBtn2.Enabled := True;
if Track = MediaPlayer.Tracks
then BitBtn3.Enabled := False;
end;
exit;
end;
// если дисковод открыт или в нем нет
// Audio CD, то Mode = mpOpen
// ждем диск ( mpStopped + кол-во треков > 1)
if (MediaPlayer.Mode = mpStopped) and
(MediaPlayer.Tracks > 1) then
begin
Timerl.Enabled := False;
MediaPlayer.Open;
BitBtnl.Enabled := True;
MediaPlayer.Notify := True;
Labell.Caption := 'Audio CD';
Labell.Visible := True;
end;
// дисковод открыт или в дисководе нет диска
if MediaPlayer.Mode = mpOpen then
begin
Labell.Caption := 'Вставьте Audio CD';
if Labell.Visible then
Labell.Visible := False
else
Labell.Visible := True;
end;
end;
// кнопка «
procedure TForml.BitBtn2Click(Sender: TObject);
begin
MediaPlayer.Previous; // в начало текущего трека
MediaPlayer.Previous; // в начало предыдущего трека
if MCI_TMSF_TRACK(MediaPlayer.Position) = 1 then
BitBtn2.Enabled := E'alse;
if not BitBtn3.Enabled
then BitBtn3.Enabled := True;
end;
// кнопка »
procedure TForml.BitBtn3Click(Sender: TObject);
begin
MediaPlayer.Next ;
// если перешли к последнему треку, то кнопку
// Next сделать недоступной
if MCI_TMSF_TRACK(MediaPlayer.Position) = MediaPlayer.Tracks
then BitBtn3.Enabled := False;
end;
// пользователь закрыл окно программы
procedure TForml.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
MediaPlayer.Stop;
end;
• ¦
end.
48. Напишите программу, используя которую можно прослу-
шать компакт-диск. Для выбора воспроизводимого трека (мело-
дии) используйте компонент тгаскваг (рис. 1.49).
Рис. 1.49. Форма программы CD Player
f CD Player. Ccj Культин Н.Б., 2003}
unit CDp2_;
interface
uses
Windows, Messages, SysOtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, ComCtrls, StdCtrls, MPlayer,
ExtCtrls, MMSYSTEM;
type
TForml = class(TForm)
MediaPlayer: TMediaPlayer;
TrackBar: TTrackBar;
Buttonl: TButton;
Timerl: TTimer;
Label1: TLabel;
Label2: TLabel;
procedure TrackBarChange(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure ButtonlClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action:
TCloseAction);
procedure TimerITimer(Sender: TObject);
private
/ Private declarations }
public
{ Public declarations I
end;
var
Forml: TForml;
implementation
($R *.dfm}
var
Track: integer;
// пользователь изменил положение бегунка
procedure TForml.TrackBarChange(Sender: TObject);
var
trk: integer; // трек, который надо воспроизвести
begin
trk :=TrackBar.Position;
if trk > MCI_TMSF_TRACK(MediaPlayer.Position) then
while trk > MCI_TMSF_TRACK(MediaPlayer.Position) do
MediaPlayer.Next
5 Зак. 939
else
while trk < MCI_TMSF_TRACK(MediaPlayer.Position) do
MediaPlayer.Previous;
end;
// кнопка Play/Stop
procedure TForml.ButtorilClick (Sender: TObject);
begin
if Buttonl.Tag = 0 then
begin
Buttonl.Caption := 'Stop';
Buttonl.Tag :=1;
MediaPlayer.Play;
end
else
begin
Buttonl.Caption := 'Play';
Buttonl.Tag :=0;
MediaPlayer.Stop;
end;
end;
procedure TForml.FormActivate(Sender: TObject);
begin
if (MediaPlayer.Mode = mpStopped) and
(MediaPlayer.Tracks > 1)
then begin
Buttonl.Enabled := True;
TrackBar.Max := MediaPlayer.Tracks;
end
else begin
labell.Caption := 'Вставьте в дисковод Audio CD';
end;
end;
// сигнал от таймера
procedure TForml.TimerlTimer(Sender: TObject);
var
trk, // трек
min, sec: byte; // время
begin
case MediaPlayer.Mode of
mpPlaying: // режим воспроизвел
begin
min := MCI_TMSF_MINUTE(MediaPlayer.Position);
sec := MCI_TMSF__SECOND (MediaPlayer. Position) ;
Label2.Caption :=
Format('%d:%.2d',[min,sec]);
// определим, надо ли перемещать бегунок
trk := MCI_TMSF_TRACK(MediaPlayer.Position);
if trk <> Track then
begin
Track:= trk;
TrackBar.Position := Track;
Labell.Caption
Format ('Track %d. ' , [trk]) ;
end;
end;
mpOpen: // дисковод открыт или в нем нет диска
begin
if Buttonl.Enabled then
begin
Labell.Caption :='Вставьте в дисковод Audio CD';
Label2.Caption :='';
Buttonl.Enabled := False; // режим ожидания диска
Buttonl.Caption := 'Play';
end;
// мигание сообщения
if Labell.Visible
then Labell.Visible := False
else Labell.Visible := True;
end;
mpStopped: // плеер остановлен
begin
if not Buttonl.Enabled
then begin
// плеер был в режиме ожидания диска
/'/ теперь диск вставлен
MediaPlayer.Open;
Buttonl.Enabled := True;
Labe11.Caption := 'Track: 1' ;
Labell.Visible := True;
Label2.Caption:= '';
TrackBar.Position : = 1;
TrackBar.Max := MediaPlayer.Tracks;
end;
if Buttonl.Tag = 1 then
begin
// завершено воспроизведение последнего трека
Buttonl.Caption := 'Play';
Buttonl.Tag :=0;
TrackBar.Position := 1;
Labell.Caption := 'Track 1';
Label2.Caption := ' ' ;
end;
end;
end; // case
end;
procedure TForml.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
MediaPlayer.Stop;
end;
end.
49. Напишите программу МРЗ Player. Программа должна обес печивать возможность
выбора каталога, в котором находятся МРЗ-файлы, а также регулировку громкости
звука непосредст венно в диалоговом окне программы. Для отображения списка
МРЗ-файлов используйте компонент 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. |