📄 mp3play.pas
字号:
unit mp3play;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, Buttons, ComCtrls, StdCtrls, Registry, MPEGPLAYLib_TLB;
type
Tf_mp3play = class(TForm)
Sound_Panel: TPanel;
Play: TSpeedButton;
Stop: TSpeedButton;
Eject: TSpeedButton;
First: TSpeedButton;
Last: TSpeedButton;
TrackBar: TTrackBar;
Open_Sound: TOpenDialog;
BtnRepeat: TSpeedButton;
BtnPlay: TSpeedButton;
BtnPause: TSpeedButton;
Sound_Name: TListBox;
Current_Filename: TEdit;
Cancel: TSpeedButton;
procedure FormCreate(Sender: TObject);
procedure EjectClick(Sender: TObject);
procedure Mp3PlayActFrame(Sender: TObject; ActFrame: Integer);
procedure Mp3PlayThreadEnded(Sender: TObject);
procedure RegMp3;
procedure FormDestroy(Sender: TObject);
procedure Sound_PanelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure CancelClick(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure StopClick(Sender: TObject);
procedure PlayClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure EnableBtn(Enable : Boolean);
procedure FirstClick(Sender: TObject);
procedure TrackBarChange(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
Reg_ini : TRegIniFile; //注册表变量
end;
var
f_mp3play: Tf_mp3play;
//mp3变量
kmp3play : TMp3Play; //mp3控件
existmp3 : Boolean; //是否存在mp3控件
Play_All_Flag : Boolean; //能否播放其中一个MP3
sound_number : integer; //播放的mp3数目
FirstBoot : Boolean; //第一次启动标志
state : (stPlay, stPause, stStop, stEject, stError); //MP3播放器状态
implementation
uses main, setup;
{$R *.DFM}
procedure Tf_mp3play.FormCreate(Sender: TObject);
begin
RegMp3; //注册mp3控件
try //建立mp3控件
kmp3play:=TMp3Play.Create(self);
kmp3play.Top:=-300;
kmp3play.Left:=-300;
kmp3play.Parent:=f_mp3play;
kmp3play.OnActFrame:=Mp3PlayActFrame;
kmp3play.OnThreadEnded:=Mp3PlayThreadEnded;
kmp3play.TabStop:=False;
existmp3:=True; //存在MP3控件
state:=stEject; //打开状态
except
existmp3:=False; //不存在MP3控件
state:=stError; //错误状态
end;
//初始化MP3设置
FirstBoot:=True; //写标志:第一次启动
sound_number:=0; //mp3数目写0
Play_All_Flag:=False; //不能播放其中一个MP3
//初始化按钮设置
Sound_Panel.Enabled:=existmp3;
f_main.pop_MP3.Enabled:=existmp3;
end;
procedure Tf_mp3play.FormShow(Sender: TObject);
begin
if FirstBoot then
begin
FirstBoot:=False; //写标志:不是第一次启动
if (existmp3) and (Sound_Name.Items.Count>0) then
begin //调整状态
//调整按钮
EnableBtn(True); //打开按钮
//调整滚动条
Current_Filename.Text:='1. '+Sound_Name.Items[0];
kmp3play.Open(Sound_Name.Items[0],'');
TrackBar.Position:=TrackBar.Min;
TrackBar.Max:=kmp3play.FrameCount;
end
else
EnableBtn(False); //关闭按钮
end;
end;
procedure Tf_mp3play.EjectClick(Sender: TObject);
var mp3Index : longint;
begin
if Open_Sound.Execute then
begin
Sound_Name.Clear;
for mp3Index:=1 to Open_Sound.Files.Count do //添加背景音乐文件到列表框中
Sound_Name.Items.Add(Open_Sound.Files.Strings[mp3Index-1]);
//初始化状态
if Sound_Name.Items.Count>0 then
begin
EnableBtn(True); //打开按钮
sound_number:=0; //MP3曲目写0
Play_All_Flag:=False; //不能播放其中一个MP3
state:=stEject; //写状态:打开状态
Mp3PlayThreadEnded(nil); //播放MP3音乐
end
else
EnableBtn(True); //关闭按钮
end;
end;
procedure Tf_mp3play.Mp3PlayThreadEnded(Sender: TObject);
var play_filename : string; //播放的文件名
error_flag : Boolean; //错误标志
main_visible : Boolean; //主窗口是否显示
begin
if (not existmp3) then exit;
//建立mp3控件
try
kmp3play.Free;
kmp3play:=TMp3Play.Create(self);
kmp3play.Top:=-300;
kmp3play.Left:=-300;
kmp3play.Parent:=f_mp3play;
kmp3play.OnActFrame:=Mp3PlayActFrame;
kmp3play.OnThreadEnded:=Mp3PlayThreadEnded;
kmp3play.TabStop:=False;
existmp3:=True; //存在MP3控件
except
existmp3:=False; //不存在MP3控件
state:=stError; //错误状态
end;
if (not existmp3) then
begin
//初始化MP3设置
Sound_Number:=0; //MP3曲目写0
Play_All_Flag:=False; //不能播放其中一个MP3
//关闭按钮
EnableBtn(False);
Sound_Panel.Enabled:=existmp3;
f_main.pop_MP3.Enabled:=existmp3;
exit;
end;
//判断状态
if state=stStop then
begin //停止状态
kmp3play.Close; //关闭MP3
state:=stEject; //打开状态
sound_number:=0; //初始化播放数目
Play.Glyph:=BtnPlay.Glyph; //转换图标
Play.Hint:=BtnPlay.Hint; //转换Hint
//调整滚动条
Current_Filename.Text:='1. '+Sound_Name.Items[0];
kmp3play.Open(Sound_Name.Items[0],'');
TrackBar.Position:=TrackBar.Min;
TrackBar.Max:=kmp3play.FrameCount;
exit;
end;
//注册MP3
main_visible:=f_mp3play.Visible;
if not main_visible then
begin //处理窗口的显示
f_mp3play.Left:=-f_mp3play.Left-f_mp3play.Width-100;
f_mp3play.Visible:=True;
end;
kmp3play.Authorize('LightBringer','1441658209'); //注册
if not main_visible then
begin //复原窗口的显示
f_mp3play.Visible:=False;
f_mp3play.Left:=-(f_mp3play.Left+f_mp3play.Width+100);
end;
error_flag:=False; //写标志:没有错误
inc(sound_number); //mp3数目+1
if sound_number>Sound_Name.Items.Count then
begin //超出音乐列表,判断是否重复播放
if (BtnRepeat.Down) and (Play_All_Flag) then
begin //重复播放
sound_number:=1; //重复播放
end
else
begin //不重复播放
sound_number:=0; //初始化播放数目
state:=stEject; //打开状态
Play.Glyph:=BtnPlay.Glyph; //转换图标
Play.Hint:=BtnPlay.Hint; //转换Hint
//调整滚动条
TrackBar.Position:=TrackBar.Max;
exit; //退出播放
end;
end;
//获取文件名,打开播放
play_filename:=Sound_Name.Items[sound_number-1];
Current_Filename.Text:=IntToStr(sound_number)+'. '+play_filename;
if kmp3play.Open(play_filename,'')<>0 then error_flag:=True;
if kmp3play.Play<>0 then error_flag:=True;
//播放错误,则播放下一个
if error_flag then
Mp3PlayThreadEnded(nil)
else
begin
Play_All_Flag:=True; //能播放其中一个MP3
Play.Glyph:=BtnPause.Glyph; //转换图标
Play.Hint:=BtnPause.Hint; //转换Hint
state:=stPlay; //播放状态
//调整滚动条
TrackBar.Position:=TrackBar.Min;
TrackBar.Max:=kmp3play.FrameCount;
end;
end;
procedure Tf_mp3play.Mp3PlayActFrame(Sender: TObject; ActFrame: Integer);
begin
TrackBar.Position:=ActFrame;
end;
procedure Tf_mp3play.FormDestroy(Sender: TObject);
begin
//删除mp3控件
kmp3play.Free;
end;
procedure Tf_mp3play.RegMp3;
var RegMp3Path : string; //MP3注册路径
RegMp3File : string; //MP3文件路径
begin
RegMp3Path:='CLSID\{3B00B10D-6EF0-11D1-A6AA-0020AFE4DE54}';
RegMp3File:=f_main.Get_Filename_Path(ParamStr(0))+'talemp3.dat';
Reg_ini := TRegIniFile.Create(''); //打开注册表
Reg_ini.RootKey:=HKEY_CLASSES_ROOT; //定义根目录
//注册mp3控件
//注册版本
Reg_ini.WriteString(RegMp3Path,'','Tale Mp3Play Control');
//注册Control
Reg_ini.WriteString(RegMp3Path+'\Control','','');
//注册InprocServer32
Reg_ini.WriteString(RegMp3Path+'\InprocServer32','',RegMp3File);
Reg_ini.WriteString(RegMp3Path+'\InprocServer32','ThreadingModel','Apartment');
//注册MiscStatus
Reg_ini.WriteString(RegMp3Path+'\MiscStatus','','0');
Reg_ini.WriteString(RegMp3Path+'\MiscStatus\1','','131473');
//注册ProgID
Reg_ini.WriteString(RegMp3Path+'\ProgID','','Mp3Play.Mp3PlayCtrl.1');
//注册PToolboxBitmap32
Reg_ini.WriteString(RegMp3Path+'\PToolboxBitmap32','',RegMp3File+', 1');
//注册ToolboxBitmap32
Reg_ini.WriteString(RegMp3Path+'\ToolboxBitmap32','',RegMp3File+', 1');
//注册TypeLib
Reg_ini.WriteString(RegMp3Path+'\TypeLib','','{3B00B10A-6EF0-11D1-A6AA-0020AFE4DE54}');
//注册Version
Reg_ini.WriteString(RegMp3Path+'\Version','','1.0');
Reg_ini.Free; //关闭注册表
end;
procedure Tf_mp3play.Sound_PanelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button=mbLeft then
begin
ReleaseCapture;
SendMessage(f_mp3play.Handle,WM_NCLBUTTONDOWN,HTCaption,0);
end;
end;
procedure Tf_mp3play.CancelClick(Sender: TObject);
begin
f_mp3play.Close;
end;
procedure Tf_mp3play.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if Key=27 then //隐藏窗口 "Esc"
f_mp3play.Close;
end;
procedure Tf_mp3play.StopClick(Sender: TObject);
begin
if state in [stPlay,stPause,stEject] then
begin
state:=stStop; //停止状态
Mp3PlayThreadEnded(nil); //停止播放
end;
end;
procedure Tf_mp3play.PlayClick(Sender: TObject);
begin
case state of
stPlay:
begin //处于播放状态
Play.Glyph:=BtnPlay.Glyph; //转换图标
Play.Hint:=BtnPlay.Hint; //转换Hint
kmp3play.Pause;
state:=stPause;
end;
stPause:
begin //处于暂停状态
Play.Glyph:=BtnPause.Glyph; //转换图标
Play.Hint:=BtnPause.Hint; //转换Hint
kmp3play.Play;
state:=stPlay;
end;
else
Mp3PlayThreadEnded(nil);
end;
end;
procedure Tf_mp3play.EnableBtn(Enable : Boolean);
begin
Play.Enabled:=Enable;
Stop.Enabled:=Enable;
First.Enabled:=Enable;
Last.Enabled:=Enable;
TrackBar.Enabled:=Enable;
end;
procedure Tf_mp3play.FirstClick(Sender: TObject);
begin
Sound_Number:=Sound_Number+(Sender As TSpeedButton).Tag;
if (Sound_Number<0) or (Sound_Number>Sound_Name.Items.Count) then Sound_Number:=0;
Mp3PlayThreadEnded(nil); //播放MP3音乐
end;
procedure Tf_mp3play.TrackBarChange(Sender: TObject);
begin
if state<>stError then
kmp3play.Seek(TrackBar.Position);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -